2

我创建了一个小机器人,例如基于 javascript的 Karel 机器人(维基百科)。

Karel4Web

机器人可以通过一些简单的命令来控制,例如“前进”、“右转”等。

用户可以编写一个javascript程序来控制机器人,然后通过javascripts“eval()”函数使机器人移动。

问题是我希望机器人慢慢移动,这样你就可以看到他在做什么,这样你就可以在编辑器中突出显示当前的代码行。

当前方法:解析

目前我已经解决了这个问题(在离线版本中),方法是解析文本区域中的每一行,然后构建一个动作堆栈,然后使用 window.setTimeout 一个接一个地执行。但这当然是有限的,因为我必须为每个小的 javascript 语言结构编写解析代码,这需要大量工作并且容易出错。

对此的一些附加信息:

解析版本:http ://abi-physik.de/_niki2/niki.php

解析版js代码:http ://abi-physik.de/_niki2/js/niki.js

重要的函数在脚本的底部:run()、execute()

我目前正在逐行解析用户脚本并将操作添加到堆栈中。如果解析器遇到“if”,它将开始一个新堆栈并将所有操作添加到该堆栈。如果解析器随后遇到“}”,它将关闭“if”堆栈并继续向基本堆栈添加操作。

有什么想法可以改进吗?

4

2 回答 2

1

我想说让这些函数注册到某个队列,而不是让它们直接执行 JavaScript。

var moveQueue = [];

function forward(){
  moveQueue.push(_forward);
}
function _forward(){
    alert("move forward");
}

function backward(){
  moveQueue.push(_backward);
}
function _backward(){
    alert("move backward");
}

比它运行时你会使用 setTimeout 和

function run(){
    var curStep = 0;
   function go(){
      moveQueue[curStep]();
      curStep++;
      if(curStep<moveQueue.length){
          window.setTimeout(go,500);
      }
   }  
}

您仍然需要对其进行解析以找出 if 语句逻辑,但这是允许您控制执行速度的众多方法之一。

于 2011-08-03T11:37:33.470 回答
0

Javascript没有sleep()函数,所以是的,使用setTimeoutorsetInterval是要走的路。

您可以首先解析“指令”,组装一组需要执行的操作,然后用于setInterval安排定期调用的函数,该函数接受下一条指令并执行它(或清除间隔,如果有没有更多的指令等待处理)。

于 2011-08-03T09:40:55.493 回答