Возникли проблемы с решением логики случайных чисел - PullRequest
0 голосов
/ 04 мая 2018

Я относительно новичок в программировании на 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!");
  }
}

Основная проблема на данный момент: игра заканчивается и спрашивает, хочет ли пользователь играть снова после того, как игрок угадает их число, а не после того, как каждый игрок угадает их число.

Нужны ли мне реальные Объекты, чтобы это произошло и отслеживал каждого игрока, или это все еще можно решить без объектов? Это территория, с которой я незнаком.

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Это не поможет улучшить ваш текущий код, но ту же игру можно легко реализовать с использованием объектов. На мой взгляд, код чище и его легче читать.

Объекты позволяют вам инкапсулировать данные, необходимые для каждого класса. Цель, количество предположений и их правильность сохраняются в объекте Person, а не в многомерном массиве. Доступ к значениям можно получить, обратившись к объекту Person - например, person.numGuesses или person.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;
    }
}
0 голосов
/ 04 мая 2018

Прямо сейчас ваш playGame метод возвращает true обратно на main всякий раз, когда любое предположение возвращает правильное значение от compareGuess.

Я бы порекомендовал установить другой массив boolean[] correctGuess в playGame и пометить индекс номера игрока как true, если игрок угадает правильно. Вы также можете использовать этот новый массив, чтобы пропустить игроков, которые правильно угадали. После того, как все игроки отмечены как истинные, вы можете вернуться к main.

...