我如何使我的程序多次成功地追溯命令?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何使我的程序多次成功地追溯命令?相关的知识,希望对你有一定的参考价值。

在开始讨论我的问题之前,这里是有关我的问题的程序的简短概述,以便您理解。我的程序与机器人有关,下面代表了我的程序对机器人执行的一些命令。用户输入的命令存储在commandList.size数组中。

  • L命令表示机器人向左转。
  • F命令表示机器人向前移动。
  • T命令表示机器人从以下位置向后追溯命令用户输入到程序中。例如,如果用户已经输入命令“ L COMMAND,R COMMAND”,则用户输入“ T 2”,这将需要使机器人向右转然后向左转,以便向后读取命令数组。 “ T 2”表示回溯前两个命令。

问题

[如果用户让我的机器人左转,则用户输入“ T 1”以追溯先前输入的命令,然后在用户使机器人前进后,键入“ T 2”以追溯前两个命令,程序将停止工作。该程序应使机器人前进,然后向左转,因为这是最后输入的两个命令。需要忽略“ T 1”命令,因为这没有计算在内。如何使我的程序多次成功地追溯命令?

另一个例子

L COMMAND (Turn left)
"T 1" (Retrace the left command - this work)
B COMMAND (Move backwards)
"T 2" (THIS IS WHERE THE PROGRAM STOPS WORKING - the program needs to skip "T 1" and retrace the F command / B command - Here is the issue) you understand? 

上面的问题与我在程序中确定的T命令有关。

控制台示例以突出显示该问题-这不起作用。机器人应向后移动并向右移动。 T 1命令应忽略。

>Move robot right 
>T 1 to retrace last step which works
>Backwards command
>T 2 retrace last two commands. 

T命令代码

否则,如果(part.length == 2){

            if (part[0].equals("T") && represents(part[1])) {

                robot.saySomething("Retracing your desired commands");


                int speakingDelay = 3000;
                try {
                    TimeUnit.MILLISECONDS.sleep(speakingDelay);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                int a = Integer.parseInt(part[1]);

                //checking if user has requested more then executed commandList

                if (commandList.size() >= a) {

                    int index = commandList.size() - 1;

                    for (int i = 0; i < a; i++) {

                        commandHistoryList.add(commandList.get(index));

                        index--;

                    }

                    System.out.println(commandHistoryList);

                    limit = commandList.size() - 1;

                    terms = commandList.size() - a - 1;

                } else {

                    System.out.println("limitimun Value exceeded
");

                    invalidInputs++;

                }

            } else {

                System.out.println("Invalid Command
");

                invalidInputs++;

            }

        }

T命令代码的控制台输出

User1999 please enter a command. 
L 2 100
Moving Left

User1999 please enter a command. 
L 2 100
Moving Left

User1999 please enter a command. 
R 2 100
Moving Right

User1999 please enter a command. 
R 2 100
Moving Right

User1999 please enter a command. 
L 2 100
Moving Left

User1999 please enter a command. 
L 2 100
Moving Left

User1999 please enter a command. 
R 2 100
Moving Right

User1999 please enter a command. 
T 3
[R 2 100, L 2 100, L 2 100]
Moving Right
Moving Left
Moving Left

User1999 please enter a command. 
B 2 100
Moving Backwards

User1999 please enter a command. 
B 2 100
Moving Backwards

User1999 please enter a command. 
T 3
[R 2 100, L 2 100, L 2 100, B 2 100, B 2 100, T 3]
Moving Backwards
Moving Backwards
[R 2 100, L 2 100, L 2 100, B 2 100, B 2 100, T 3, B 2 100, B 2 100, T 3]
Moving Backwards
Moving Backwards
[R 2 100, L 2 100, L 2 100, B 2 100, B 2 100, T 3, B 2 100, B 2 100, T 3, B 2 100, B 2 100, T 3]
Moving Backwards
Moving Backwards
[R 2 100, L 2 100, L 2 100, B 2 100, B 2 100, T 3, B 2 100, B 2 100, T 3, B 2 100, B 2 100, T 3, B 2 100, B 2 100, T 3]
Moving Backwards
答案

尝试:

if (commandList.size() >= a) {
  commandHistoryList.clear();         // don't rerun previous reruns.
  int index = commandList.size() - 2; // exclude the T command
  for (int i = 0; i < a; i++) {
    commandHistoryList.add(commandList.get(index));
    index--;
...

很明显,如果您在代码的其他地方使用commandHistoryList,则会破坏它。

更新:如果这行得通,那么如果T X导致执行上一条T命令,则您将不得不执行某些操作。必须在循环中跳过这一点。

以上是关于我如何使我的程序多次成功地追溯命令?的主要内容,如果未能解决你的问题,请参考以下文章

(discord.py) 如何使我的 setprefix 命令正常工作?

android studio中片段内的RecyclerView使我的应用程序崩溃

如何使我的片段适合我的工具栏和底部导航栏,并使它仍可滚动?

如何像在 grails 中一样使我的 h2 数据库在 micronaut 中持久化?

如何安全地赋予我的功能而不使我的主要形式卡住

导航抽屉:fragmentTransaction.commit() 使我的应用程序崩溃