【问题标题】:How do I get my Human and Computer player to take turns in Connect4 game?如何让我的人类和计算机玩家轮流参加 Connect4 游戏?
【发布时间】:2019-05-06 10:38:54
【问题描述】:

我刚刚实现了一个播放器界面,以使我的程序更加面向对象。游戏有一个电脑玩家和一个人类玩家,两者都是从玩家界面实现的。

但是,我如何确保人和计算机轮流使用我的主要方法?如果我当前运行此代码,它只允许玩家 1 玩直到他们获胜,然后移动到计算机上。

【问题讨论】:

  • 不要将游戏循环 while(true) 放在 getUserInput 中,而是将它放在你的 main 函数中
  • 我将如何在 main 中构造 while true?
  • 如果我在我们的 getuserinput 中使用,那么它会中断

标签: java eclipse oop


【解决方案1】:

我采用了不同的方法,并将我的代码添加到公共 github 存储库中。总之,我为 BoardPositions 创建了对象,为玩家创建了一个接口,其中包含两个实现它的类,即人类玩家和计算机玩家。 Player 接口有一个 makeMove() 方法,在人类玩家实现中,它将通过 sysout、sysin 获取值。对于计算机播放器,我创建了一个名为 ComputerStrategy 的抽象类,它允许实现多个计算机策略,并且计算机播放器的 makeMove 方法委托给该策略。我还创建了一个在 Main 类的 Main 方法中实例化的 GameController,它允许您通过询问有多少人类玩家(然后是每个人类玩家的名字)和有多少计算机玩家来设置游戏。我还让每个人类玩家选择一个独特的角色来代表他们在棋盘上的棋子。

它没有完全实现,需要添加检查获胜者的逻辑,控制器也会随机化玩家顺序,并且需要循环让玩家轮流,直到游戏板已满而没有获胜者或找到获胜者.

对于计算机策略,我的想法是从阻止任何潜在的获胜动作开始,我将 ComputerStrategy 设为一个抽象类,因为它应该具有辅助方法,例如是否存在潜在的下一个获胜动作,如果存在则返回列。

这可能与您想象的不同,但是如果您从中得到任何东西,请支持我的回答:)

GitHubRepo https://github.com/krebznet/connect4.git

附言 这是当前状态下的输出,虽然计算机策略很笨,但控制器工作正常。

【讨论】:

  • 有趣的邓肯——我真的很喜欢这样的安排!非常感谢您的回复,像您这样的人应该获得骑士头巾
  • 谢谢 :) 我在答案中添加了控制台输出,需要工作才能解决错误,但喜欢为玩家的游戏位置设置首字母并为计算机设置数字的想法
  • 保持面向对象并跳出框框思考!
【解决方案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 中定义,并在HumanPlayerComputerPlayer 中覆盖,以计算您已经拥有的验证他们是否获胜的代码。


如果您有任何其他问题,请告诉我。

【讨论】:

  • 感谢您对 Paul 的帮助,非常感谢。 hasWon 在播放器中应该是什么样子?
  • public boolean hasWon();。然后在HumanPlayerComputerPlayer 中覆盖它,我没有深入研究您的算法,但似乎条件应该是if(Connect4.placeCounter(boardColumn, 1)) return true;。您希望将 boardColumn 设为类变量,以便可以从函数中访问它。
  • 对不起,保罗,我很困惑。你认为你可以重组我的代码来告诉我这是如何工作的吗?我非常感谢您的帮助,但是每次我更改代码中的某些内容时,都会破坏其他地方的内容。我非常接近完成这个项目,这是最后一步,非常感谢您的帮助
  • pastebin.com/8ARrzruT - 如果可行,请告诉我。如果您对代码有任何疑问,请告诉我。
  • 用 do...while 循环替换 main 中的 while 循环:pastebin.com/ckm1nNmF。这是因为hasWon中的placeCounter()在进入游戏循环时触发的。这不是必需的,但您可能希望将 placeCounter() 放在 hasWon() 之外,因为 hasWon() 函数放置碎片没有多大意义。谢谢,每个人都很漂亮:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
相关资源
最近更新 更多