0

I am creating a random number generator multiplayer game (LAN). I need help on how to create a code to make each player receive their own random number, and whenever one player guesses a code, the next turn would be a new player. Similar to where the output would show the following,

Fred, Please Guess the random number (integers only!!): 5 TOO LOW

Tom, Please Guess the random number (integers only!!): 95 TOO HIGH

John, Please Guess the random number (integers only!!): 50 TOO LOW

Then when a player guesses correctly, their turn is skipped and the game will end when all players have guessed their numbers, showing the number to guesses each person had, as well as the numbers they guessed previously. This is what I have so far:

public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner keyboard = new Scanner(System.in);
        Random myRand = new Random();
        ArrayList<Integer> guessedNumbers = new ArrayList();

        int x = 0;
        int players = 0;
        System.out.println("how many players are there?:");
        players = checkint(players);
        int arraySize = guessedNumbers.size();
        int[] numPlayers = new int [players];
        boolean play = true;
        boolean validGuess = true;
        String [] pNames = new String[players];


        for (int i = 0; i<players; i++) {
            System.out.println("New player, what is your name?:");
            pNames[i] = keyboard.nextLine();
        }


        while(play) {
            int randNum = myRand.nextInt(100) + 1;
            int numOfGuesses = 0;

            do {
                System.out.println("Enter what you think the number is between 0 and 100!:");
                x= checkint(x);
                guessedNumbers.add(x);
                if (x < 0) {
                    System.out.println("we don't accept negative numbers");
                    if (x > 100) {
                        System.out.println("that number is above the random number generator range");


                    }
                }
                numOfGuesses++;
                if (x == randNum) {
                    System.out.println("that's correct!");
                    System.out.println("It took you " + numOfGuesses + " tries!");
                    System.out.print("these are all the numbers you guessed:");
                    for(int count=0; count<guessedNumbers.size(); count++){
                        System.out.print(guessedNumbers.get(count) + ",");}
                    System.out.println("");


                    boolean playError = true;
                    //if ("Yes".equals(answer)) {
                    do {
                        System.out.println("Would you like to play again: Yes or No");
                        String answer = keyboard.nextLine();
                        if (answer.compareToIgnoreCase("yes") == 0) {
                            play = true;
                            playError = false;
                        } else if (answer.compareToIgnoreCase("no") == 0)  {
                            play =false;
                            playError = false;
                            System.out.println("Thank you for playing");
                        } else {
                            //you messed up
                            System.out.println("You answer was invalid");
                            playError = true;
                        }
                    } while (playError == true);
                }
                else if 
                (x>randNum) 

                    System.out.println("Lower than that!");


                else if 
                (x<randNum) 

                    System.out.println("Higher than that!");

            }   while (x != randNum);
        }}

        }


    static int checkint(int a) {
        int enteredNumber = 0;
        Scanner myScanner = new Scanner(System.in);
        boolean numberError = false;
        String enteredString = "";

        do {
            try {
                enteredString = myScanner.next();  //Read into a string
                enteredNumber = Integer.parseInt(enteredString.trim());  //then cast as a integer
                numberError = false;  //if we haven't bailed out, then the number must be valid.
            } catch(Exception e) {
                System.out.println("Your entry: \"" + enteredString + "\" is invalid...Please try again");
                numberError = true;  //Uh-Oh...We have a problem.
            }

        } while (numberError == true );  //Keep asking the user until the correct number is entered.

        return enteredNumber;  
    }
}
c0der
  • 18,467
  • 6
  • 33
  • 65
  • true. just make sure to read the docs about Random and its methods and Math.random() because both of them follow the same logic of returning "pseudo-random" numbers. if you'd need something more sophisticated on randomness take a look at the SecureRandom class. – Christos Karapapas Apr 14 '19 at 10:00
  • you got your solution or should i edit your code according to your needs ? – Zain Arshad Apr 14 '19 at 10:42

2 Answers2

0

Just use the Random class:

Random ran = new Random();
// Assumes max and min are non-negative.
int randomInt = min + ran.nextInt(max - min + 1);

I referenced here.

How do I generate random integers within a specific range in Java?

lie
  • 44
  • 3
0

You are doing simple things in a complex way, however, my code can still be replaced by a compressed version but you can understand this better. Following code is doing exactly what you want it to do. I've:

  • Created Player class, so each player will keep record of guessedNumbers, Number of Guesses and it's name.
  • You don't have to make tons of variables like pName[], play, validGuesses etc...
  • I have changed some of the If-Conditions and removed the outer while-loop
  • Added new round concept, so whenever a player guessed the number, the number got changed.
  • and much more ....

UPDATED Code: Now each Player has a different random number to guess.

    import java.util.*;

public class GuessNumber
{
    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub
        Scanner keyboard = new Scanner(System.in);
        Random myRand = new Random();
        ArrayList<Player> players = new ArrayList<Player>();
        int x = 0;
        System.out.println("how many players are there?:");
        int noPlayer = checkint();
        boolean validGuess = true , playError = true;

        for (int i = 0; i<noPlayer; i++) 
        {
            System.out.println("New player, what is your name?:");
            players.add(new Player (keyboard.nextLine()));
        }


        for (int i = 0; i<noPlayer; i++) 
        {
            players.get(i).number = myRand.nextInt(100) + 1;
        }
        int i =0; // for chossing different player each time
        do 
        {
            System.out.printf(players.get(i).name + " enter what you think the number is between 0 and 100!: ");
            x= checkint();
            players.get(i).guessedNumbers.add(x);
            players.get(i).numOfGuesses++;
            if (x == players.get(i).number) 
            {
                System.out.println("That's correct!");
                System.out.println("It took you " + players.get(i).numOfGuesses + " tries!");
                System.out.print("These are all the numbers you guessed: ");
                System.out.println(players.get(i).guessedNumbers);

                do 
                {
                    System.out.println("Would you like to play again: Yes or No");
                    String answer = keyboard.nextLine();
                    if (answer.compareToIgnoreCase("yes") == 0)
                    {
                        playError = false;
                        players.get(i).number = myRand.nextInt(100) + 1; // creates a new random number for second round of the game
                        System.out.println("\n\n************ " +players.get(i).name + " WON ********");
                        System.out.println("\n************* SECOND ROUND STARTS **********");
                    }
                    else if (answer.compareToIgnoreCase("no") == 0)  
                    {
                        playError = false;
                        System.out.println("Thank you for playing");
                        System.out.println("\n\n************ " +players.get(i).name + " WON ********");
                        System.out.println("\n************* SECOND ROUND STARTS **********");
                        players.remove(i);
                    } 
                    else 
                    {
                        System.out.println("You answer was invalid");
                        playError = true;
                    }
                } while (playError);
            }
            else if (x>players.get(i).number) 
                System.out.println("Lower than that!");
            else if (x<players.get(i).number) 
                System.out.println("Higher than that!");
            if(i == noPlayer-1 || !(playError))
                i = 0;
            else
                i++;

        }while (players.size() > 0);  

        System.out.println("\n\n******************** Every Body Guessed Their Numbers ******************");
    }

    static int checkint() 
    {
        int enteredNumber = 0;
        Scanner myScanner = new Scanner(System.in);
        boolean numberError = false;

        do 
        {
            try 
            {
                enteredNumber = Integer.parseInt(myScanner.next().trim()); 
                if (enteredNumber < 0 || enteredNumber > 100)
                {
                    System.out.println("Either you entered a negative number or number is above the random number generator range");
                    numberError =  true;
                }
                else
                    numberError = false;  //if we haven't bailed out, then the number must be valid.
            } catch(Exception e) 
            {
                System.out.println("Your entry is invalid...Please try again");
                numberError = true;  //Uh-Oh...We have a problem.
            }

        } while (numberError);  //Keep asking the user until the correct number is entered.

        return enteredNumber;  
    }
}

// now each player would have its own record.
class Player
{
    int numOfGuesses= 0;
    ArrayList<Integer> guessedNumbers = new ArrayList<Integer>();
    String name = "";
    int number = 0;
    public Player(String nam)
    {
        name = nam;
    }
}

NOTE: I've added some new lines to output on the screen , once a players wins and want to play again or not. I recommend you to compare your code with mine, so that you'll get a better understanding of your approach vs mine. Do let me know if you find something difficult to understand.

Zain Arshad
  • 1,885
  • 1
  • 11
  • 26