游戏循环中的“撤消移动”

时间:2014-02-20 01:32:32

标签: java swing model-view-controller

所以我有一个国际象棋游戏。我正在尝试实现一种方法,用户可以撤消他们的最后一步。

enter image description here

我为菜单选项创建了适当的动作侦听器。动作侦听器将游戏的undo boolean设置为true。

我的游戏循环的伪代码:

while (!game end)
{
    if (undo)
    {
        undo the last move
        continue;
    }

    prompt user to input next move

    user inputs move into console

    model, view are updated

}

这种逻辑不起作用。游戏循环处理撤消的唯一时间是在用户输入下一步之后。所以..基本上它只是撤消了它们刚刚放入的移动。我需要它以便用户在GUI上单击撤消移动时,游戏循环执行if语句中的内容。

我觉得有一种更聪明的方法可以解决这个问题。

5 个答案:

答案 0 :(得分:3)

听起来这个阶段阻止了你的while循环执行

prompt user to input next move

user inputs move into console

我认为您需要研究threading,特别是为移动输入,绘制和撤消创建单独的线程。或者找到一种方法让用户输入他们的输入,而不会阻止while循环执行。

这是一个很好的并发教程 http://docs.oracle.com/javase/tutorial/essential/concurrency/

答案 1 :(得分:2)

没有太多可继续的,我建议您在撤消上一步之后但在提示下一次输入之前更新模型并查看...

while (!game end)
{
    if (undo)
    {
        undo the last move
        // Update the mode, view and update to the screen before moving on
        model, view are updated
        continue;
    }

    prompt user to input next move

    user inputs move into console

    model, view are updated

}

话虽如此,我同意jeff_kile,听起来你正在阻止事件调度线程所以...

答案 2 :(得分:2)

我认为最简单的解决方案是将撤消代码移出游戏循环。只要您将游戏状态存储在游戏循环本身之外,这应该是可能的。 (游戏循环将负责更新游戏状态)。通过将撤消代码移出游戏循环,可以阻止游戏循环(等待下一步移动),但是当菜单操作处理程序调用时,撤消仍然会起作用。

您的代码可能如下所示:

class RunGame
{
  GameState state;

  void undoButtonPressed() 
  {
    undo the last move in state
  }

  void main() 
  {
    while(!game end)
    {
      prompt user to input next move

      user inputs move into console

      model(state), view are updated
    }
  }
}

答案 3 :(得分:2)

while (!game end)

我认为整个问题都是从那一行伪代码开始的。游戏应保存在模型中,模型的状态决定它是否处于模式:

  • USER_PLAY - 启用所有可移动部件,一旦选中,可启用“移至”地点。
  • UNDO - 所有地方都被禁用,游戏在程序控制下反向动画。
  • OPPONENT_MOVE - 禁用所有场所,由计算机或远程用户控制游戏。

USER_PLAY中,GUI将等待用户的某个部分上的事件并在模型中设置MOVE_FROM_CHOSEN,然后它将触发GUI刷新,以突出显示该部分的可能移动。在第二个事件中,在可能移动到选择的位置之一上,它将移动该块,可能移除一块,并将状态设置为OPPONENT_PLAY

可以随时选中一个复选框(或其他)来生成控件,以确定要撤消的游戏数量。一旦确定了这些参数,模型状态将被设置为UNDO并且参数(要展开的移动次数)对动画使用Swing Timer起作用。

OPPONENT_MOVE可能会为对手的思维产生JProgressBar ......然后以与UNDO状态相同的方式转换为动画移动。

答案 4 :(得分:1)

基本上你的待办事项清单上有什么:

  1. 将游戏转换为可以拍摄快照的状态 游戏的当前快照,并具有改变状态的能力 游戏到快照
  2. 创建一个堆栈,您可以移动当前的快照 每次转弯时都会进入游戏状态。这个快照是 是当前时间游戏的确切状态。
  3. 撤消转弯,取消堆叠的最后一个快照 然后将游戏当前状态更新为第一个快照 堆栈(这是前一个转弯的状态)。
  4. 如果你想要你可以将转弯移到另一个堆栈上,那么你可以添加重做。