2013-06-19 42 views
0

我正在写一个简单的tictactoe游戏,每个玩家可以是人或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来说,它在等待移动输入时停止并且什么也不做,如果之后的代码就会跳过。如何让执行等待输入?或者我的方法完全错误?我有一种感觉。

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(); 
     } 
    } 
} 
+0

研究观察者模式... – Thihara

+0

这里的状态模式可能会更好。 –

+0

我googled这些模式,但我没有得到他们如何消除需要让程序等待。你能给一个简短的解释吗? – kokocrunch

回答

0

希望你前一阵子,想通了这一点,但只是为了完整性:

您的游戏流掉的GUI事件。具体而言,您的AI移动代码必须运行以响应人类玩家进行移动的点击 - 执行ActionLister的actionPerformed方法。就游戏流程而言,您需要考虑GUI - 按钮和事物 - 而不是。或者说,您已经在GUI事件上重建了适当的游戏流程。