Три-номер игрока-угадайку


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

Класс тестер

public class GuessingGameTester {

    public static void main(String[] args){
        //create a new game
        GuessingGame g1 = new GuessingGame();

        //call the start method
        g1.startGame();

    }    
}

Класс игрока

public class GuessingGamePlayer {

    boolean areTheyRight = false;

    //player random guess
    int getPlayerGuess(){
        return (int) (Math.random()* 20); 
    }   
}

Игра класс

public class GuessingGame {

    private int numberToGuess;
    private boolean keepPlaying;
    private int round;

    //constructor
    GuessingGame(){
        //create a random number for players to guess
        numberToGuess = (int) (Math.random() * 20);//cast to int
        keepPlaying = true;
        round = 1;
    }

    void startGame(){

        //create 3 players to play
        GuessingGamePlayer p1 = new GuessingGamePlayer();
        GuessingGamePlayer p2 = new GuessingGamePlayer();
        GuessingGamePlayer p3 = new GuessingGamePlayer();

        System.out.println("The number to guess is : " + numberToGuess);

        //giving 100 attemps for the computer to guess the correct number
        while(keepPlaying && round <= 100){

            //get their guess
            int p1guess = p1.getPlayerGuess();
            int p2guess = p2.getPlayerGuess();
            int p3guess = p3.getPlayerGuess();

            System.out.println("round " + round);
            System.out.println("p1 guessed: " + p1guess);
            System.out.println("p2 guessed: " + p2guess);
            System.out.println("p3 guessed: " + p3guess);

            System.out.println("\n");

            if(p1guess == numberToGuess){
                p1.areTheyRight = true;
                keepPlaying = false;
            }else if(p2guess == numberToGuess){
                p2.areTheyRight = true;
                keepPlaying = false;
            }else if(p3guess == numberToGuess){
                p3.areTheyRight = true;
                keepPlaying = false;
            }

            round ++;
        }//end while

        //game over - echo who guessed the correct num and the round
        System.out.println("\n");
        if(p1.areTheyRight){
           System.out.println("p1 guessed the correct number during round " + round); 
        }else if(p2.areTheyRight){
            System.out.println("p2 guessed the correct number during round " + round); 
        }else{
            System.out.println("p3 guessed the correct number during round " + round); 
        }

    }//end startGame   
}


Комментарии
3 ответа

Я добавлю только пару незначительных вещей.

В комментариях больше проблем, чем они стоят. Я понимаю, что это учебник, но если они собираются, чтобы быть там, они должны сделать больше-сейчас они не добавляют стоимости. Так как это упражнение обучения, использовать эти комментарии, чтобы научить их чему-то, включая терминологию.

// Create a new GuessingGame instance to represent the current game.
// Begin playing by calling the startGame() method.

Но я бы оставил их совершенно, и соответствующего текста/лекции делать описания; вы добьетесь более писать или говорить о них за пределами кодекса.

Во-вторых, я бы оставила игроков в массив или список. Если не сейчас, то в "части второй". Это упрощает код концептуально, потому что вы можете непосредственно представляют "для каждого игрока, проверить их предположение" в коде. Если не в "Часть первая", то я бы как минимум перенести угадать-попасть в другой метод-нужно только, чтобы возвращать логическое значение, чтобы футболисты провели ли это правильный ответ.

(ИМО игрок не должен поддерживать это состояние, а игра должна.)

Далее, я бы рефакторинг больше; startGame не запускает игру. Либо реструктуризация, либо переименовать. Сейчас, startGame начинается, играет, и игра заканчивается. На рефакторинг, то код становится более история-как, за счет большего количества методов. Но стоит хороших методов быть сконцентрированным и простой в понимании.

На более теоретическом уровне, в конце условия, как это реализовано делает определенные предположения о характере игры. Прошу, если кто-либо может заметить потенциальный "попался" при текущей реализации может быть хорошим "дополнительные проблемы кредит".

В реальной жизни, что случится, если два игрока одновременно угадали? В текущей реализации, игроки всегда проверяется в порядке. В реальной жизни, типичная игра будет либо кто угадал самый быстрый (который я якобы того, плеер представляет), или несколько игроков могут выиграть, или...?

Чтобы поместить это в "реальной жизни" условия, скажем, догадки контроля доступа голосами, или результат поиска Весов и т. д. В тех случаях, галстук не имеет значения. Таким образом, вместо одного победителя, было бы сборник "победители". Как решать, если там должен быть один победитель, или группа, зависит от характера игры.

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

Некоторые мои предложения больше подходят для "второго раунда" осуществление, хотя некоторым имеет смысл за то, что у вас есть сейчас. Выбирайте, или игнорировать их все :) я приложил все в один Blob-объект.

public class GuessingGameTester {

public static void main(String[] args){
GuessingGame game = new GuessingGame();
game.startGame();
}

}

public class GuessingGamePlayer {

private int playerNumber;

public GuessingGamePlayer(int playerNumber) {
this.playerNumber = playerNumber;
}

int getGuess(){
return new Random().nextInt(GuessingGame.MAX_GUESSING_NUMBER) + 1;
}

@Override
public String toString() {
return "Player " + playerNumber;
}

}

public class GuessingGame {

private int numberToGuess;
private int roundsToPlay;
private int numberOfPlayers;
private List<GuessingGamePlayer> players;

public static int MAX_GUESSING_NUMBER = 20;

public GuessingGame() {
init(100, 3);
}

public GuessingGame(int roundsToPlay, int numberOfPlayers) {
init(roundsToPlay, numberOfPlayers);
}

public void init(int numberOfRounds, int numberOfPlayers) {
this.roundsToPlay = numberOfRounds;
this.numberOfPlayers = numberOfPlayers;

numberToGuess = new Random().nextInt(MAX_GUESSING_NUMBER) + 1;

initPlayers();
}

public void initPlayers() {
players = new ArrayList<GuessingGamePlayer>();
for (int i = 0; i < numberOfPlayers; i++) {
players.add(new GuessingGamePlayer(i+1));
}
}

public void startGame() {
int currentRound = 0;
GuessingGamePlayer correctGuesser = null;
System.out.println("The number to guess is: " + numberToGuess);

while((correctGuesser == null) && (currentRound <= roundsToPlay)) {
++currentRound;
System.out.println("\nRound " + currentRound);

for (GuessingGamePlayer player : players) {
int playerGuess = player.getGuess();
System.out.println(" " + player + " guessed " + playerGuess);
if (playerGuess == numberToGuess) {
correctGuesser = player;
}
}
}

System.out.println();

if (correctGuesser == null) {
System.out.println("Nobody guessed the right number!");
} else {
System.out.println(correctGuesser + " guessed the number in round " + currentRound);
}
}

}

4
ответ дан 7 ноября 2011 в 10:11 Источник Поделиться

Пару замечаний:


  1. Если ни один из них угадать число до количества раундов закончится, вы будете печатать, что Р3 угадал в туре 101.

  2. Если более чем один правильно угадал в последнем туре, вы будете только кредит одном из них.

  3. Я не вижу никаких причин, чтобы сохранить переменные экземпляра, особенно для keepPlaying, это будет препятствовать игры правильно, если начал второй раз, если никто не угадал первую игру.

  4. В конце печати 2 пустых строк (3 строки: одна с "Р3 догадались...", из-за "\N" и один, потому что последний является метод println, а не печати или функции printf. Я думаю, что это немного чрезмерным.

Возможно, вы могли бы использовать переменные экземпляра, чтобы задать максимальное число вместо 20 (как магическое число), и пройти несколько раундов, чтобы играть в качестве аргумента startGame способ. Вы могли бы даже, как только вы получите более продвинутые, изменить его в плееров как массив, а затем добавить в подклассы с различными методами гадания. Вы также можете вернуться в индекс/победителя.

2
ответ дан 7 ноября 2011 в 06:11 Источник Поделиться

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

public class GuessingGameTester {

public static void main(String[] args){
//create a new game object
GuessingGame game = new GuessingGame();
//call the startGame method on the game object
game.startGame();
}
}

public class GuessingGamePlayer {

GuessingGamePlayer(){};
boolean areTheyRight = false;

//player random guess
int getPlayerGuess(){
return (int) (Math.random()* 15);
}
}

public class GuessingGame {

private int numberToGuess;
private boolean keepPlaying;
private int round;

//create 3 player objects
private GuessingGamePlayer p1 = new GuessingGamePlayer();
private GuessingGamePlayer p2 = new GuessingGamePlayer();
private GuessingGamePlayer p3 = new GuessingGamePlayer();

private int player1Guess;
private int player2Guess;
private int player3Guess;

//constructor
GuessingGame(){
//return the players random guess
numberToGuess = (int) (Math.random() * 15);//cast to int, random function returns double
round = 1;
}

void startGame(){
keepPlaying = true;
System.out.println("The number to guess is : " + numberToGuess);
displayGuesses();
displayGameEndingInfo();
}//end startGame

void displayGuesses(){
// 20 attemps for the computer to guess the correct number
while(keepPlaying && round <= 20){

getPlayerGuesses();

System.out.println("Round " + round);
System.out.println("Player 1 guessed: " + player1Guess);
System.out.println("Player 2 guessed: " + player2Guess);
System.out.println("Player 3 guessed: " + player3Guess);

System.out.println("\n");

if(player1Guess == numberToGuess){
p1.areTheyRight = true;
keepPlaying = false;
break;
}else if(player2Guess == numberToGuess){
p2.areTheyRight = true;
keepPlaying = false;
break;
}else if(player3Guess == numberToGuess){
p3.areTheyRight = true;
keepPlaying = false;
break;
}

round ++;
}//end while
}//end displayGuesses

void getPlayerGuesses(){
//get the guess from each player object and assign to pxguess variable
player1Guess = p1.getPlayerGuess();
player2Guess = p2.getPlayerGuess();
player3Guess = p3.getPlayerGuess();
}

void displayGameEndingInfo(){
//game over - echo who guessed the correct num and the round
System.out.println("\n");
if(p1.areTheyRight){
System.out.println("p1 guessed the correct number during round " + round);
}else if(p2.areTheyRight){
System.out.println("p2 guessed the correct number during round " + round);
}else{
System.out.println("p3 guessed the correct number during round " + round);
}
}//end displayGameEndingInfo

}//end class GuessingGame

0
ответ дан 8 ноября 2011 в 08:11 Источник Поделиться