避免循环,但仍然在游戏中通过计算机捕获每个动作

时间:2017-10-20 22:05:57

标签: java swing

请你建议我如何实现计算机在游戏中的移动,而不会在主方法中使用while循环,最终会给线程增加负担? 因为我在两个人类玩家之间进行游戏很容易,因为我可以通过管理actionPerformed()方法管理其移动。所以我不需要任何循环。

我已经有了计算机在computerPlays()方法内移动的逻辑。

如果一个玩家是人类,一台计算机,可能会更容易。我可以做一些事情:在每次移动后增加int n。然后在main()

if(n%2!=0)
{
computerPlays();
}

但是我仍然需要循环以获得完整的游戏流程。

如果两个玩家都是电脑怎么办?

如果您愿意帮助我,请尝试使用更简单的单词,因为我对Java很新。 感谢。

编辑:问题有什么不对?

2 个答案:

答案 0 :(得分:2)

使用javax.swing.Timer来调整模型的串行调用,在游戏结束时停止计时器。在引用的here游戏中,按 A 可在使用鼠标时切换动画。每次释放鼠标时,计算机都会通过计时器handler,首先移动玩家然后推进敌人;它重复这个序列,直到没有有效的移动或游戏获胜。

/** Animate one move; stop when no more moves or game won. */
public void actionPerformed(ActionEvent e) {
    if (!game.move(mouseRow, mouseCol) || game.won()) timer.stop();
}

答案 1 :(得分:1)

你的问题似乎含糊不清,但我会尝试尽力而为,提供一般提示。

您不应该使用循环来管理游戏逻辑,这会使您的GUI无响应,或者完全冻结它。

相反,您应该使用事件来运行游戏。您可以编写一个模拟游戏逻辑的类,在“游戏面板”中保留此类的实例。 然后,您注册所需的所有听众,以确定玩家何时尝试移动。每当一个动作被解雇时你都可以:

  • 询问您的游戏课是否必须移动。
  • 如果没有,您可以忽略该事件,或者您可以向用户发送警告/错误消息。
  • 否则,您可以设置游戏类的当前状态,为下一步操作做好准备。
  • 刷新游戏面板(如果需要)以使所有更改可见。
  • 如果计算机必须移动,则调用相应的方法。
  • 再一次,您刷新游戏面板,依此类推......

正如您所看到的,这种编程方式是事件驱动的,当发生某些事情时,您需要更改模型,然后更新视图。

如果计算机和玩家通过交替移动来玩游戏,那么在每个玩家移动后都可以轻松地让你的电脑玩游戏,否则你需要每次都检查一下是谁在移动。

此外,由于计算机播放速度太快,无法让用户了解发生的情况,因此您应该考虑使用计时器(请参阅official tutorial)为每次移动添加一些延迟。

希望这有帮助!