2013-06-19 2 views
0

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

Исследовательский шаблон наблюдателя ... – Thihara

+0

Состояние картины здесь может быть лучше. –

+0

i googled эти шаблоны, но я не понимаю, как они устраняют необходимость заставить программу ждать. не могли бы вы дать краткое объяснение? – kokocrunch

ответ

0

Надеюсь, вы поняли это давно, но только для полноты:

Ваша игра должна бежать событий на GUI. В частности, ваш код перемещения AI должен быть запущен в ответ на щелчок, когда игрок-человек делает свой ход - в реализации ActionPerformed метода ActionLister. Вам нужно думать с точки зрения графического интерфейса - кнопки и вещи - не с точки зрения игрового потока. Вернее, у вас есть воссоздание правильного игрового потока на графических интерфейсах.

Смежные вопросы