Игра в угадайку - я использую понятие объекты в Java правильно?


Я новичок в Java и трудно понять концепцию объектов. Я написал простую угадайку на практике концепцию объектно-ориентированное программирование, но я не уверен, если я делаю это правильно.

Цель игры-угадать число от 0-9 с 3 игроков, и первый игрок, который угадает правильно будет выиграть игру.

Плеер

public class Player {

    private String playerName;
    private int number;

    public int getNumber() {
        return number;
    }

    public String getPlayerName() {
        return playerName;
    }

    public void setPlayerName(String playerName) {
        this.playerName = playerName;
    }

    public void guessNumber(){
        number = Integer.parseInt(JOptionPane.showInputDialog(playerName 
            + "'s Turn\nGuess the Number"));
        JOptionPane.showMessageDialog(null, playerName+ "'s GUESS is " + number);
    }
}

GuessGame

public class GuessGame {

    private int numberToGuess;
    private Player p1;
    private Player p2;
    private Player p3;

    public void startGame(){
        numberToGuess = (int) (Math.random()*10);
        p1 = new Player();
        p2 = new Player();
        p3 = new Player();

        p1.setPlayerName(JOptionPane.showInputDialog("Enter Player 1 Name: "));
        p2.setPlayerName(JOptionPane.showInputDialog("Enter Player 2 Name: "));
        p3.setPlayerName(JOptionPane.showInputDialog("Enter Player 3 Name: "));

        int flagWinner = 0;
        while(0==flagWinner){
            p1.guessNumber();
            if (p1.getNumber()==numberToGuess){
                flagWinner = 1;
                break;
            }
            JOptionPane.showMessageDialog(null, p1.getPlayerName()
                + "'s Guess is Wrong!");
            p2.guessNumber();
            if (p2.getNumber()==numberToGuess){
                flagWinner = 2;
                break;
            }
            JOptionPane.showMessageDialog(null, p2.getPlayerName()
                + "'s Guess is Wrong!");
            p3.guessNumber();
            if (p3.getNumber()==numberToGuess){
                flagWinner = 3;
                break;
            }
            JOptionPane.showMessageDialog(null, p3.getPlayerName()
                + "'s Guess is Wrong!");
        }
        if (1 == flagWinner){
            JOptionPane.showMessageDialog(null,p1.getPlayerName()+ " Wins!");
        } else if (2 == flagWinner){
            JOptionPane.showMessageDialog(null,p2.getPlayerName()+ " Wins!");
        } else JOptionPane.showMessageDialog(null,p3.getPlayerName()+ " Wins!");
    }
}

И у меня есть gameLauncher , где у меня главная() метод, который создает игру.

Я делаю это правильно, особенно в плеер класс, где я создал метод guessNumber() вместо сеттер setNumber(int количество)?

Я нарушаю какие-либо объектно-ориентированных концепций в мой код?

Как я могу улучшить мой код?



1963
15
задан 19 февраля 2011 в 10:02 Источник Поделиться
Комментарии
2 ответа

Для начала, заметить несоответствие. Имя вы создаете ее в своем основном цикле, а затем использовать сеттер; по количеству у вас есть способ для игрока, чтобы приобрести догадываться. Последний является более в соответствии с сообщением,-передает философию ОО. (Многие люди думают, что использование геттеров и сеттеров является ОО. Они часто - не всегда - признак не-ОО мышления). Однако, он не воспринял это как можно. Число догадались-это не собственность игрока - это свойство догадываться.

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

Далее, flagWinner - это большой красный флаг. Его единственной целью является определение одного из объектов Р1, Р2, Р3, или ничего из вышеперечисленного. Что ОО способ сделать это? Использовать объект для идентификации.

Я был бы склонен вынесем IO как объект тоже должен быть немного меньше процессуальные. Поэтому, не вдаваясь в полный над рисунком архитектуры мы


открытый класс ИО {
выход общественного недействительными(строка MSG) {
JOptionPane.showMessageDialog(нуль, МСГ);
}

ввод публичных строку(строку запроса) {
возвращение JOptionPane.showInputDialog(приглашение)
}

inputInt публичных инт(строку запроса) {
возвращает целое число.parseInt(вход(запрос));
}
}

открытый класс игрока {
частная строку имя пользователя;

частная игрока(имя string) {
имя пользователя = имя;
}

публичный статический игрок createPlayer(ИО Ио, строку строки) {
Имя string = Ио.input("введите" + подсказки + " имя: ");
возвращение нового игрока(имени);
}

общественного строка getPlayerName() {
возвращает имя пользователя;
}

общественный инт guessNumber(ИО, Ио) {
возврат Ио.inputInt(имя пользователя +"с поворотом\nGuess число"));
}
}

GuessGame общественных класса {

частная окончательной ИО Ио;
частная окончательной инт numPlayers;
частная инт numberToGuess;
отдельный список игроки = новые коллекции LinkedList();

общественные GuessGame(ИО Ио, инт numPlayers) {
это.Ио = Ио;
это.numPlayers = numPlayers;
}

общественного недействительными метод init() {
numberToGuess = (тип int) (математика.случайный()*10);
для (int я = 0; я < numPlayers; я++) {
игроков.добавить(плеер.createPlayer(Ио, "игрок" + (я+1)));
}
}

общественного недействительными runGame(){
инит();

Победитель игрок = нуль;
Итератор это-игроки.итератор();
пока (победитель == значение null) {
если (!он.hasNext()) {
это-игроки.итератор();
}

Плеер turnPlayer = он.следующий();
Строка имя пользователя = turnPlayer.getPlayerName();

инт угадать = turnPlayer.guessNumber(Ио);
Ио.выходные данные(имя пользователя+ "с предположение" + количество);

если (догадайтесь == numberToGuess) {
победитель = turnPlayer;
}
еще {
Ио.выходные данные(имя пользователя + "угадать не так!");
}
}

Ио.выход(победитель.getPlayerName()+ " побеждает!");
}
}

11
ответ дан 19 февраля 2011 в 12:02 Источник Поделиться

Макет чувствовал себя очень C++ и очень привязан к "функции" вместо объектов. Хотя вы, кажется, есть хорошая идея, как это работает и сделать лучше, на объектах, чем большинство людей.

Я бы сделал это, как это (грязная версия, должна быть улучшена, но это был быстрый редизайн):

public class Player {
private String playerName;
private int number;

public Player(String name){
this.playerName = name;
}

public int guessNumber() {
return Integer.parseInt(JOptionPane.showInputDialog(playerName
+"'s Turn\nGuess the Number"));
JOptionPane.showMessageDialog(null, playerName+ "'s GUESS is " + number);
}

public String getPlayerName() {
return playerName;
}
}

public class GuessGame {

private int numberToGuess;
private Player p1;
private Player p2;
private Player p3;

//Would probably made amount of players dynamic as well.
public GuessGame(String player1, String player2, String player3){
numberToGuess = (int) (Math.random()*10);
p1 = new Player(player1);
p2 = new Player(player2);
p3 = new Player(player3);
}

//Would probably split this up in submethods too.
//The flagging is quite ugly too but I don't got time to edit it.
public void startGame(){
int flagWinner = 0;
while(0==flagWinner){
if (p1.guessNumber()==numberToGuess){
flagWinner = 1;
break;
}
JOptionPane.showMessageDialog(null, p1.getPlayerName()
+ "'s Guess is Wrong!");
if (p2.guessNumber()==numberToGuess){
flagWinner = 2;
break;
}
JOptionPane.showMessageDialog(null,p2.getPlayerName()
+ "'s Guess is Wrong!");
if (p3.guessNumber()==numberToGuess){
flagWinner = 3;
break;
}
JOptionPane.showMessageDialog(null,p3.getPlayerName()
+ "'s Guess is Wrong!");
}
if (1 == flagWinner){
JOptionPane.showMessageDialog(null,p1.getPlayerName()+ " Wins!");
} else if (2 == flagWinner){
JOptionPane.showMessageDialog(null,p2.getPlayerName()+ " Wins!");
} else JOptionPane.showMessageDialog(null,p3.getPlayerName()+ " Wins!");
}

public static void main(String[] e){
GuessGame gg = new GuessGame(
JOptionPane.showInputDialog("Enter Player 1 Name: "),
JOptionPane.showInputDialog("Enter Player 2 Name: "),
JOptionPane.showInputDialog("Enter Player 3 Name: ")
);
gg.startGame();
}
}

2
ответ дан 19 февраля 2011 в 10:02 Источник Поделиться