Определяющие игроки превращаются в текстовые крестики-нолики

#java #arrays #if-statement #for-loop

#java #массивы #if-оператор #для цикла

Вопрос:

Я новичок в Java и для некоторой практики создаю текстовые крестики-нолики. Пока у меня есть класс игрока, класс доски и класс игры. В классе Game у меня есть один экземпляр Board и два экземпляра Player. Мне удалось написать код для игрока, чтобы сделать ход и определить, является ли игра победой или ничьей. Теперь я хочу убедиться, что у игрока может быть только один ход за раз и не более одного последовательного хода, т.Е. Игрок A, Игрок B, Игрок A, Игрок B …… а не игрок A, Игрок A, Игрок A…

Способ, которым я думал об этом, заключался в том, чтобы создать логическое поле в классе Player myTurn и иметь метод в соответствии с этими строками :

 public boolean isMyTurn (){
if (myTurn == true){
return false;
}
return true;
}
  

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

Ответ №1:

Я бы сделал класс Game ответственным за это. Например.:

 class Game {
    ...
    public void makeTurn(){
        if(isFirst)
            firstPlayer.makeTurn();
        else
            secondPlayer.makeTurn();

        isFirst = !isFirst;
    }

    private bool isFirst = true;
    private Player firstPlayer, secondPlayer;
}
  

Это даже логически имеет смысл. Игрок может делать много ходов один за другим. Это игра (правила игры), которая мешает ему сделать это.

Комментарии:

1. 1. Вы даже можете тривиально обобщить это на n игроков, используя массив player и счетчик вместо bool.

2. Как упоминалось ранее, я новичок. Что мне трудно понять в этом коде, так это то, что firstPlayer и secondPlayer являются экземплярами класса Player. Как получается, что они могут вызывать метод makeTurn(), потому что этот метод существует в классе Game. Я пытался это сделать, но я мог заставить PlayerA (в моем случае) вызвать этот метод. Пожалуйста, объясните. Спасибо

Ответ №2:

может быть, я не очень хорошо понял вашу проблему, но:

  • Кто устанавливает myTurn?
  • Кто «вызывает» player.play()?

Похоже, это должен делать один и тот же парень (класс Game / GameManager?). Так почему бы игрокам просто не поиграть в данную по описанию игру, а задачу управления поворотами передать другому классу?

Приветствия

Комментарии:

1. согласно тому, что у меня есть сейчас, класс Player устанавливает myTurn() и экземпляр Player вызывает метод play в классе games. Есть ли у вас какие-либо другие предложения по улучшению этого? Спасибо

2. Я бы предположил, что (общая идея): 1 — Игроки просто играют, учитывая описание состояния игры. 2 — Другой класс (возможно, Game) создает экземпляры обоих игроков (Player) и доски (Board) и «управляет» игрой -> вызывает play для каждого игрока в правильном порядке.

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

4. Спасибо за это — это то, что у меня есть atm. Но, возвращаясь к моему первоначальному вопросу, в игровом классе, как я могу определить, чей это ход? не хочу, чтобы у одного игрока было более 1 хода. Пожалуйста, был бы оценен пример. Спасибо

5. Ну, например, в классе player есть метод под названием doMove (Доска board), который анализирует доску и выполняет ход. В игровом классе у вас есть логическое значение, которое хранит ход игрока, например. Затем у вас просто есть цикл while, который вызывает метод текущего игрока, изменяет bool и проверяет, закончена ли игра.