Im пишет простую игру тиктакто, в которой каждый игрок может быть человеком или AI. Итак, чтобы создать новый экземпляр игры, я сделал это так, что я все это:Как заставить java ждать события?
Player p1=new RLPlayer(world);
gameInstance = new GameInstance(this, p1, new HumanPlayer(this, world), world);
Однако, если я что-то вроде
Player p1=new RLPlayer(world);
gameInstance = new GameInstance(this, p1, new HumanPlayer(this, world), world);
Player p2=new RLPlayer(world);
gameInstance = new GameInstance(this, p2, new HumanPlayer(this, world), world);
только 1 игра играется. Я понял, что это связано с тем, что для HumanPlayer он останавливается и ничего не делает, ожидая ввода перемещения и, если после этого код theres, он просто переходит к этому. Как заставить выполнение ждать ввода? Или мой подход совершенно не прав? У меня такое чувство.
public class HumanPlayer implements Player {
private GameGUI gameGUI;
private TicTacToeWorld world;
public HumanPlayer(GameGUI gameGUI, TicTacToeWorld world){
this.gameGUI = gameGUI;
this.world = world;
}
public boolean makeMove() {
gameGUI.setMoveInputEnabled(true);
return false;
}
public boolean makeMove(int move){ //false means no move made
if(!world.isMoveLegal(move)) return false;
world.makeMove(move);
gameGUI.setMoveInputEnabled(false);
return true;
}
public void observeMove(){
}
}
Только для некоторых целей. Я думаю, проблема в том, что выше.
public class GameInstance {
private Player[] players;
private TicTacToeWorld world;
private GameGUI gameGUI;
public GameInstance(GameGUI gameGUI, Player player1, Player player2, TicTacToeWorld world){
this.gameGUI = gameGUI;
players = new Player[]{player1,player2};
this.world = world;
runGame();
}
public void runGame(){
gameGUI.updateGUI(world.getWorldState());
while(!world.isGameOver()){
if(!makePlayerMove())return;
gameGUI.updateGUI(world.getWorldState());
}
}
public boolean makePlayerMove(){
int[] state;
state = world.getWorldState();
if(players[(state[0]-1)%2].makeMove()){
players[state[0]%2].observeMove();
return true;
}
else
return false;
}
public void makePlayerMove(int move){ //force move AI OR input human move
int[] state;
state = world.getWorldState();
if(players[(state[0]-1)%2].makeMove(move)){ //if move was made e.g. AI. Human player would return false;
gameGUI.updateGUI(world.getWorldState());
players[state[0]%2].observeMove();
runGame();
}
}
}
Исследовательский шаблон наблюдателя ... – Thihara
Состояние картины здесь может быть лучше. –
i googled эти шаблоны, но я не понимаю, как они устраняют необходимость заставить программу ждать. не могли бы вы дать краткое объяснение? – kokocrunch