【问题标题】:Having trouble solving logic of random number game无法解决随机数游戏的逻辑
【发布时间】:2018-05-04 20:42:08
【问题描述】:

我对 java 编程比较陌生。我目前正在构建一个迷你猜谜游戏,作为一个学习更多 Java 的项目。我遇到以下问题:

以下是我无法解决的 4 个主要问题。

  • 记录每个用户的答案,如果不正确。
  • 如果用户正确,则在后续回合中跳过它们。
  • 一旦所有玩家都猜对了他们的数字,打印出每个人猜对的次数、不正确的答案,并显示玩家的排名。
  • 询问用户是否希望再次播放。如果是这样,请重置所有值。

这是我写的方法;

import java.io.*;

public class MultiPlayerRandomGame {

// this method asks how many users will be playing and returns the number of users
public static int howManyUsers() {

    System.out.println("How many users will be playing?");
    int players = IO.readInt();
    return players;
}

// this method generates and returns a random number 
public static int generateRandomNumber() {

    int randomNumber = (int) (Math.random() * 100);
    return randomNumber;
}

// this method compares user's entered guess and the generated random number then returns true/false
public static boolean compareGuess(int guess, int randomNumbers) {

    boolean isGuessCorrect = false;

    if (guess == randomNumbers) {
        System.out.println("CORRECT!");
        isGuessCorrect = true;

    } else if (guess > randomNumbers) {
        System.out.println("Too High");

    } else if (guess < randomNumbers) {
        System.out.println("Too Low");
    }

    System.out.println("test1");
    return isGuessCorrect;
} 

// this method determines whether Player N is correct or incorrect
public static boolean nextPlayer(int numOfUsers, int[] numberOfGuesses, int[] randomNumbers, int[][] numberBoard) {

    for (int n = 0; n < numOfUsers; n++) {
        int guessedNumber = numberOfGuesses[n];

        /*      if (guessedNumber == 0) {
            return false;   
        }*/

        if (numberBoard[n][guessedNumber] != randomNumbers[n]) {
            return false;
        }
    }
    return true;
}

/* this method is supposed to print out the number of guesses it took each player to guess their correct number
 * CORRECTION: change the logic of this method to printing the number of guesses for one player then
 * in the main method or wherever, make a for loop that prints out the number of guesses for each player
 */
public static void amountOfGuesses(int numOfUsers, int [] numberOfGuesses, int [][] numberBoard) {

    int n = 0;
    for ( int i = 0; i < numOfUsers; i++ ) {
        n = n + 1;
        System.out.println("Player " + n + " guessed " + numberOfGuesses[i]+ " time(s)");
    }
}

// this method determines whether the user(s) would like to play again
public static boolean playAgain(String answer) {

    boolean userWillPlayAgain;

    if (answer.compareToIgnoreCase("no") == 0) {
        userWillPlayAgain = false;
    }
    else {
        userWillPlayAgain = true;
    }
    return userWillPlayAgain;
}

// this method controls the entire game
public static boolean playGame(){

    boolean gameTerminate = false;
    int numOfUsers = howManyUsers();
    int [] randomNumbers = new int[numOfUsers];
    int [] numberOfGuesses = new int [numOfUsers];  
    int [][] numberBoard = new int [numOfUsers][100];

    // this for loop assigns the n random number(s) to the n player(s)
    for (int n = 0; n < numOfUsers; n++){
        randomNumbers[n] = generateRandomNumber(); 
        System.out.println("PLAYER " + (n+1) + "'s RANDOM NUMBER: " + randomNumbers[n]);
    }

    do { 
        for (int i = 0; i < numOfUsers; i++) {
            int guessedNumber = numberOfGuesses[i];

            if (guessedNumber == 0 || numberBoard[i][guessedNumber-1] != randomNumbers[i]) {
                System.out.println("Enter your guess Player " + (i+1) + ":");
                int enteredGuess = IO.readInt();


                numberBoard[i][guessedNumber] = enteredGuess;
                numberOfGuesses[i] = guessedNumber + 1;

                if(compareGuess(enteredGuess, randomNumbers[i])){
                    return true;

                }
            }
        } 

        /* int n = 0;
         * for ( int j = 0; j < numOfUsers; j++ ) {
            n = n + 1;
            System.out.println("Player " + n + " guessed " + numberOfGuesses[j]+ " time(s)"); }
         */


    } while (nextPlayer(numOfUsers, numberOfGuesses, randomNumbers, numberBoard) == false);


    // System.out.println("test"); 
    return gameTerminate;
}

public static void main(String[] args){
    boolean playing = true;
    while (playing) {
        playGame();

        System.out.println("Would you like to play again?");
        String answer = IO.readString();

        playing = playAgain(answer);
    }
    System.out.println("OK, goodbye!");
  }
}

目前的主要问题:游戏终止并在玩家猜到他们的号码后询问用户是否想再次玩,而不是在每个玩家都猜到他们的号码后。

我是否需要实际的对象来实现这一点并跟踪每个玩家,还是在没有对象的情况下仍然可以解决这个问题?这是我不熟悉的领域。

【问题讨论】:

    标签: java oop methods logic


    【解决方案1】:

    现在你的playGame方法返回true回到main,只要任何猜测从compareGuess返回正确。

    我建议在playGame 中设置另一个数组boolean[] correctGuess,如果玩家猜对了,则将玩家编号索引标记为true。您也可以使用这个新数组来跳过猜对的玩家。将所有玩家标记为 true 后,您可以返回 main

    【讨论】:

      【解决方案2】:

      这无助于改进您当前的代码,但同样的游戏可以使用对象轻松实现。在我看来,代码更干净,更易于阅读。

      对象允许您封装每个类所需的数据。目标、猜测次数以及它们是否正确存储在Person 对象中,而不是存储在多维数组中。可以通过引用 Person 对象来访问这些值 - 例如person.numGuessesperson.target

      通过使用对象,您可以将特定功能限制在主类之外。即抽象出实现。在游戏的未来版本中,您可能希望更改目标值的递增方式;通过使用对象,可以在设置和检查值的类中进行更改 - 而不会影响任何其他类。

      import java.util.ArrayList;
      import java.util.List;
      import java.util.Random;
      import java.util.Scanner;
      
      public class Game {
      
          private final List<Person> personList = new ArrayList<>();
      
          private Game(int numPlayers) {
      
              for (int i = 0; i < numPlayers; i++) {
                  personList.add(new Person(i)); // Fill the player list
              }
      
          }
      
          public static void main(String[] args) {
      
              System.out.print("Enter the number of players: ");
      
              Scanner sc = new Scanner(System.in);
              int numPlayers = sc.nextInt();
      
              // Initialise with the number of players
              Game g = new Game(numPlayers);
              g.mainLoop(); // Play the game
      
              boolean playAgain = false;
      
              do {
      
                  System.out.print("Do you wish to play again?: ");
                  String in = sc.next();
      
                  playAgain = "yes".equals(in);
      
                  if (playAgain) {
                      g.resetAll();
                      g.mainLoop();
                  }
      
              } while (playAgain); // Only loop if they answered "yes"
      
          }
      
          private boolean allCorrect() {
              // Check if all players have answered correctly
              return personList.stream().allMatch(p -> p.correct);
          }
      
          private void resetAll() {
              for (Person p : personList) {
                  p.reset(); // Reset each person
              }
          }
      
          private void mainLoop() {
      
              while (!allCorrect()) {
                  for (Person p : personList) {
                      p.doGuess(); // Ask for the guess
                  }
              }
      
              // Everyone is correct, print the scores.
      
              for (Person p : personList) {
                  System.out.println("Player " + p.id + " => " + p.numGuesses + " guesses");
              }
      
          }
      
      }
      
      class Person {
      
          final int id;
          int numGuesses;
          boolean correct;
      
          private int target;
      
          Person(int id) {
              this.id = id;
              target = new Random().nextInt(100); // Each player has a random target between 0-100
          }
      
          void doGuess() {
      
              if (correct) {
                  // Skip turn if they're already correct
                  return;
              }
      
              numGuesses++;
      
              System.out.print("Player " + id + " guess " + numGuesses + "(" + target + "): ");
      
              Scanner sc = new Scanner(System.in);
              int i = sc.nextInt(); // Read the guess
      
              if (i == target) {
                  correct = true;
                  System.out.println("Correct!");
              }
      
          }
      
          void reset() {
              target = new Random().nextInt(100); // New target between 0-100
              numGuesses = 0; // Reset the counter
              correct = false;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-31
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 2013-02-16
        • 2020-10-15
        相关资源
        最近更新 更多