Реализация простой пошаговой игры на Java с использованием подхода «ожидание-уведомление»JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Реализация простой пошаговой игры на Java с использованием подхода «ожидание-уведомление»

Сообщение Anonymous »

Я пытаюсь реализовать игру в слова на Java, в которой каждый игрок по очереди извлекает несколько случайных букв из набора, а затем пытается создать из этих букв правильное слово. Вот что у меня есть на данный момент (упрощено для ясности):
В классе Game я запускаю игру, запуская поток для каждого игрока (и один для хронометриста). Я хочу, чтобы первый игрок в списке activePlayers (который изначально совпадает со списком игроков) сделал первый ход, поэтому я инициализировал атрибуты Turn и TurnIndex. соответствовать этому игроку:

Код: Выделить всё

public void play()
{
this.turn = activePlayers.get(0); //the player who joined first goes first
this.turnIndex = 0; //the player's index in the ArrayList

for(Player player : players) {
new Thread(player).start();
}
new Thread(new Timekeeper()).start(); //keeps track of the game's duration
}
В классе Player я хочу, чтобы игроки в режиме ожидания ничего не делали и просто ждали, пока текущий игрок завершит свои дела, отсюда и первый цикл while. Затем, когда ход игрока закончится, я хочу, чтобы этот поток уступил монитор потоку другого игрока и ждал следующего хода. Вот как я решил подойти к этому:

Код: Выделить всё

private synchronized boolean submitWord() throws InterruptedException
{
while(game.turn != this)
{
System.out.println(this.name + " is waiting their turn...");
wait();
}

Thread.sleep(1000);

List extracted = game.getBag().extractTiles(wordLength);
if(extracted.isEmpty())
return false; //if there are no more letters to extract, the thread ends its execution

//game logic goes here - creating and validating the word

//after this player is done, the next player makes their move
game.turnIndex++;
if(game.turnIndex >= game.activePlayers.size())
game.turnIndex = 0;
game.turn = game.activePlayers.get(game.turnIndex);
notifyAll();
return true;
}
@Override
public void run()
{
do {
try {
this.running = this.submitWord();
} catch(InterruptedException e) {
System.out.println("Something went wrong with " + this.name + "...");
e.printStackTrace();
}
} while(this.running);

game.activePlayers.remove(this); //the player is now inactive

if(game.winner == this)
System.out.println("Winner: " + this.name + " [" + this.score + " points]");
}
Однако, когда я пытаюсь запустить программу, я получаю что-то вроде этого:

Код: Выделить всё

Player 2 is waiting their turn...
Player 3 is waiting their turn...
1 seconds elapsed...
Player 1: AERIAL [36 points]
Player 1 is waiting their turn...
2 seconds elapsed...
3 seconds elapsed...
4 seconds elapsed...
5 seconds elapsed...
6 seconds elapsed...
По сути, игра не продвигается дальше первой попытки Игрока 1, и я застреваю в бесконечном цикле, в котором ничего не происходит. Я неправильно использую методы wait() и notifyAll()? Как мне заставить потоки игрока взаимодействовать друг с другом?

Подробнее здесь: https://stackoverflow.com/questions/719 ... y-approach
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»