Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;“撤消移动”;在游戏循环中_Java_Swing_Model View Controller - Fatal编程技术网

Java &引用;“撤消移动”;在游戏循环中

Java &引用;“撤消移动”;在游戏循环中,java,swing,model-view-controller,Java,Swing,Model View Controller,所以我下了一盘棋。我正在尝试实现一种方法,用户可以撤消他们的最后一步 我为菜单选项创建了相应的操作侦听器。动作侦听器将游戏的撤销布尔值设置为true 我的游戏循环的伪代码: while (!game end) { if (undo) { undo the last move continue; } prompt user to input next move user inputs move into console

所以我下了一盘棋。我正在尝试实现一种方法,用户可以撤消他们的最后一步

我为菜单选项创建了相应的操作侦听器。动作侦听器将游戏的撤销布尔值设置为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上单击undo move时,游戏循环就会执行if语句中的操作


我有一种感觉,有一种更聪明的方法来处理这个问题。

听起来这个阶段在循环执行时阻塞了你的

prompt user to input next move

user inputs move into console
我认为您需要研究
线程
,特别是为移动输入、绘制和撤消创建单独的线程。或者找到一种方法,让用户在不阻塞while循环执行的情况下输入输入

这里有一个关于并发性的好教程

听起来这个阶段在循环执行时阻塞了

prompt user to input next move

user inputs move into console
我认为您需要研究
线程
,特别是为移动输入、绘制和撤消创建单独的线程。或者找到一种方法,让用户在不阻塞while循环执行的情况下输入输入

这里有一个关于并发性的好教程

如果没有太多内容,我建议您在撤消上一步操作后,但在提示下一次输入之前,更新模型和视图

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的观点,这听起来像是您正在阻止事件调度线程,因此…

在没有太多事情要做的情况下,我建议您在撤消上一步操作后但在提示下一次输入之前更新模型和视图

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的观点,这听起来像是你在阻止事件调度线程,所以…

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

您的代码可能如下所示:

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
    }
  }
}

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

您的代码可能如下所示:

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
    }
  }
}
我认为整个问题都是从那行伪代码开始的。游戏应在模型中进行,模型的状态决定其是否处于模式:

  • USER\u PLAY
    -所有可移动部件均已启用,一旦选择其中一个,可能的“移动到”位置将启用
  • UNDO
    -禁用所有位置,在编程控制下反向设置游戏动画
  • 对手移动
    -所有位置禁用,游戏由计算机或远程用户控制
USER\u PLAY
中,GUI将等待用户的一个棋子上的事件,并从模型中选择的
设置
MOVE\u,然后触发GUI刷新,突出显示棋子可能的移动。在第二个项目中,在选择的一个可能的移动位置上,它将移动该棋子,可能移除一个被拿走的棋子,并将状态设置为
对手\u PLAY

在任何时候,都可以选择一个复选框(或任何东西)来生成决定要撤消多少游戏的控件。一旦确定了这些参数,模型状态将设置为
UNDO
,并使用动画的Swing
计时器对参数(要展开的移动次数)进行操作

对手\移动
可能会产生一个
JProgressBar
供对手思考..”,然后以与
UNDO
状态相同的方式翻转到动画移动

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

  • USER\u PLAY
    -所有可移动部件均已启用,一旦选择其中一个,可能的“移动到”位置将启用
  • UNDO
    -禁用所有位置,在编程控制下反向设置游戏动画
  • 对手移动
    -所有位置禁用,游戏由计算机或远程用户控制
USER\u PLAY
中,GUI将等待用户的一个棋子上的事件,并从模型中选择的
设置
MOVE\u,然后触发GUI刷新,突出显示棋子可能的移动。在第二个项目中,在选择的一个可能的移动位置上,它将移动该棋子,可能移除一个被拿走的棋子,并将状态设置为
对手\u PLAY

在任何时候,都可以选择一个复选框(或任何东西)来生成决定要撤消多少游戏的控件。一旦确定了这些参数,模型状态将设置为
UNDO
,并使用动画的Swing
计时器对参数(要展开的移动次数)进行操作


对手\u移动
可能会产生一个
JProgressBar
供对手思考,然后以与
UNDO
状态相同的方式切换到动画移动。

基本上你的待办事项列表上有什么:

  • 将游戏转换为这样一种状态,在这种状态下,您可以拍摄游戏的快照 游戏的当前快照,并有能力改变游戏状态 游戏快照
  • 创建一个堆栈