2011-08-03 107 views
2

我創建了一個基於javascript的Karel機器人(Wikipedia)這樣的小機器人。減慢javascript的評估執行速度

Karel4Web

機器人可以用一些簡單的命令進行控制,諸如「前」,「右拐」等。

用戶可以編寫一個JavaScript程序來控制機器人,然後通過JavaScripts「eval()」函數來執行機器人移動。

問題是我想讓機器人緩慢移動,以便您可以看到他在做什麼,以便您可以突出顯示編輯器中的當前代碼行。

當前方法:解析

在通過解析在textarea的各行,然後建立動作的堆疊然後將其與一個接一個執行我已經解決了這個(在離線版本)的時刻window.setTimeout。但是這當然是有限的,因爲我必須爲每個小的JavaScript語言構造編寫解析代碼,這是很多工作和容易出錯的。

一些額外的信息,以這樣的:

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

解析版本的js代碼:http://abi-physik.de/_niki2/js/niki.js

重要的功能是在腳本的底部:運行(),執行()

我目前正在逐行解析用戶腳本並將操作添加到堆棧。如果解析器遇到「if」,它將開始一個新的堆棧並將所有操作添加到該堆棧。如果解析器遇到「}」,它將關閉「if」堆棧並繼續將操作添加到基本堆棧。

任何想法,以改善這一點?

+0

您是否嘗試過在「;」上分割線條?或\ n然後傳遞給一個一個的評估 – Pradeep

+0

我想過了,但我還沒有嘗試過。如果條件會發生什麼? –

+0

在這種情況下,你也必須實現if,while循環的東西。 您可以將它們組合成單個代碼塊,但不會顯示動畫。 – Pradeep

回答

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語句的邏輯,但這是多種方式,讓一個你控制執行的速度。

0

Javascript沒有sleep()函數,所以是的,使用setTimeoutsetInterval是要走的路。

你可以先解析'指令',組合一組需要執行的動作,然後使用setInterval來安排一個定期調用的函數,它接受下一條指令並執行它(或清除間隔,如果沒有更多指令在等待處理)。

+0

這就是我正在做的事情(參見js代碼,我已經更新了這個問題)。問題是我必須將事情做爲while循環,for循環,函數等等,這很容易出錯並且容易出錯。 –