我创建了一个基于javascript的Karel机器人(Wikipedia)这样的小机器人。
可以通过一些简单的命令来控制机器人,例如“前进”,“回转”等等。
用户可以编写一个javascript程序来控制机器人,然后通过javascripts“eval()”函数进行操作,以便机器人移动。
问题是我希望机器人缓慢移动,以便您可以看到他在做什么,以便您可以在编辑器中突出显示当前的代码行。
当前方法:解析
目前我通过解析textarea中的每一行然后构建一个动作堆栈然后用window.setTimeout一个接一个地执行来解决这个问题(在离线版本中)。但这当然是有限的,因为我必须为每个小的javascript语言构造编写解析代码,这是很容易的工作和错误。
其他一些信息:
解析版本:http://abi-physik.de/_niki2/niki.php
解析版本js代码:http://abi-physik.de/_niki2/js/niki.js
重要的功能位于脚本的底部:run(),execute()
我目前正在逐行解析用户脚本并将操作添加到堆栈中。如果解析器遇到“if”,它将开始一个新的堆栈并将所有操作添加到该堆栈。如果解析器遇到“}”,它将关闭“if”堆栈并继续向基本堆栈添加操作。
有什么想法改善这个吗?
答案 0 :(得分: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语句逻辑,但这是允许您控制执行速度的众多方法之一。
答案 1 :(得分:0)
Javascript没有sleep()
功能,所以是的,使用setTimeout
或setInterval
即可。
您可以先解析'指令',汇编一系列需要执行的操作,然后使用setInterval
来安排定期调用的函数,该函数接受下一条指令并将其执行(如果没有其他指令等待处理,则清除间隔。)