如何让java等待事件?
我正在写一个简单的Tictatcoe游戏,每个玩家可以是人类也可以是人工智能。 所以,为了创建一个新的游戏实例,我做了如下工作:
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);
只玩一场游戏。我发现这是因为对于HumanPlayer来说,它在等待移动输入时会停止并且什么也不做,如果之后有代码,它就会跳过。如何使执行等待输入?还是我的方法完全错了?我有一种感觉
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();
}
}
}
# 1 楼答案
希望您不久前就明白了这一点,但为了完整起见:
游戏必须在GUI上运行事件。具体来说,在ActionLister的actionPerformed方法的实现中,必须运行AI移动代码,以响应人类玩家移动的点击。您需要从GUI按钮和事物的角度来思考,而不是从游戏流程的角度来思考。或者更确切地说,您必须根据GUI事件重新创建适当的游戏流程