【问题标题】:How to make java wait for an event?如何让java等待一个事件?
【发布时间】:2013-06-19 03:31:01
【问题描述】:

我正在编写一个简单的tictactoe 游戏,其中每个玩家都可以是人类或人工智能。 因此,为了创建一个新的游戏实例,我所做的只是:

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

【问题讨论】:

  • 研究观察者模式...
  • 这里的状态模式可能会更好。
  • 我用谷歌搜索了这些模式,但我不明白它们如何消除让程序等待的需要。能简单解释一下吗?

标签: java events


【解决方案1】:

希望您不久前就知道了这一点,但只是为了完整性:

您的游戏必须在 GUI 上运行事件。具体来说,您的 AI 移动代码必须运行以响应人类玩家移动的点击——在 ActionLister 的 actionPerformed 方法的实现中。您需要从 GUI 的角度来考虑——按钮和其他东西——而不是在游戏流程方面。或者更确切地说,您已经根据 GUI 事件重新创建了正确的游戏流程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2020-08-31
    相关资源
    最近更新 更多