#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 и проверяет, закончена ли игра.