我刚刚实现了一个播放器界面,以使我的程序更加面向对象。该游戏有一个计算机玩家和一个人类玩家,两者都可以从玩家界面实现。
但是,如何确保人和计算机轮流使用我的主要方法?如果我当前正在运行此代码,则它仅允许玩家1玩到赢,然后再移动到计算机上。
答案 0 :(得分:3)
我采用了另一种方法,并将我的代码添加到了公共github存储库中。总结中,我为BoardPositions创建了对象,为播放器创建了一个接口,该接口具有两个实现它的类,即Human Player和Computer Player。 Player接口具有方法makeMove(),在人类播放器实现中,它将以sysout,sysin的方式获取值。我为计算机播放器创建了一个名为ComputerStrategy的抽象类,该类允许实现多个计算机策略,并且计算机播放器的makeMove方法委托给该策略。我还创建了一个GameController,该游戏控制器在Main类的Main方法中实例化,它允许您通过询问多少个人玩家(然后是每个个人玩家的名称)和多少计算机玩家来设置游戏。我还让每个人类玩家都选择一个独特的角色,在板上代表他们的作品。
它没有完全实现,需要添加检查获胜者的逻辑,控制器还随机化玩家顺序,并且需要循环进行玩家轮流,直到游戏板上装满没有获胜者或找到获胜者为止。
对于计算机策略,我的想法是通过仅阻止任何可能的获胜手法来简单地开始工作,我将ComputerStrategy设置为抽象类,因为它应具有辅助方法,例如是否存在潜在的下一个获胜手法,如果有则返回该列。
这可能与您想像的有所不同,但是如果您从中得到任何帮助,我的回答就可以了:)
GitHubRepo https://github.com/krebznet/connect4.git
P.S 这是当前状态下的输出,使用笨拙的计算机策略可能会出现一些问题,但是控制器可以正常工作。
答案 1 :(得分:2)
在主要功能中移动游戏循环while
,否则它正在等待游戏以HumanPlayer.getUserInput()
结尾。另外,您应该添加一个函数来验证任一玩家是否获胜,因为它与getUserInput
的定义不匹配。
HumanPlayer human = new HumanPlayer();
ComputerPlayer computer = new ComputerPlayer();
while(!human.hasWon() && !computer.hasWon()) { // Remove the loop from getUserInput() !!!
human.getUserInput();
computer.getUserInput();
}
函数public boolean hasWon()
应该在Player
中定义,并在HumanPlayer
和ComputerPlayer
中被覆盖,以对已经拥有的代码进行数学运算,以验证它们是否获胜。
如果还有其他问题,请告诉我。