2011-08-03 13 views
2

私はJavaScriptをベースにしたKarelロボット(Wikipedia)のような小さなロボットを作成しました。javascriptのevalの実行を遅く

Karel4Web

ロボットがように、このような「前進」、「turnright」などいくつかの簡単なコマンドで制御することができます。

ユーザは、ロボットを制御するためのjavascriptプログラムを作成し、ロボットが動くようにjavascriptの "eval()"関数を実行することができます。

問題は、彼が何をしているのかを見ることができるようにロボットをゆっくり動かし、エディタで現在のコード行を強調表示できるようにすることです。

現在の方法:私はテキストエリアの各行を解析した後、次いで、次々に実行されるアクションのスタックを構築すること(オフラインバージョンで)これを解決した時点で

の解析window.setTimeout。しかし、私はほとんどすべてのjavascript言語の構文解析コードを書く必要があるので、これは限られています。これは多くの作業とエラーが発生しやすいです。

これまでいくつかの追加情報:

解析バージョン:http://abi-physik.de/_niki2/js/niki.js

重要な機能は、スクリプトの一番下にある:バージョンjsのコード解析http://abi-physik.de/_niki2/niki.php

ラン()、(実行)

私は現在、行ごとにユーザースクリプトを解析し、そのアクションをスタックに追加しています。パーサが "if"を検出すると、新しいスタックを開始し、そのスタックにすべてのアクションを追加します。パーサが "}"を検出すると、 "if"スタックが閉じられ、引き続きアクションがベーススタックに追加されます。

これを改善するためのアイデアはありますか?

+0

";"で分割線を試しましたか?または\ n次にevalに1つずつ渡す – Pradeep

+0

私はそれについて考えましたが、まだ試していませんでした。if-conditionには何が起こるでしょうか? –

+0

この場合も、if、whileループのものを実装する必要があります。 1つのコードブロックに結合することはできますが、アニメーションは表示されません。 – Pradeep

答えて

1

私は、それらの関数がJavaScriptを直接実行するのではなく、いくつかのキューに登録していると言います。それはあなたがあなたがまだif文のロジックを把握するために、それを解析する必要があるでしょうが、これは許可する多くの方法の一つであるのsetTimeoutと

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

を使用する実行した場合よりも

var moveQueue = []; 

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

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

あなたは実行の速度を制御する。

0

JavaScriptはsleep()の機能を持っていませんので、setTimeoutまたはsetIntervalを使用してください。

最初に「命令」を解析し、実行する必要がある一連のアクションをアセンブルし、次の命令を実行する機能を定期的に呼び出すためにsetIntervalを使用して整理します処理待ちの命令がもうない場合)。

+0

これはおおまかに私がやっていることです(jsコードを見て、質問を更新しました)。問題は、whileループ、forループ、関数などを実装する必要があり、多くの作業とエラーが発生しやすいということです。 –

関連する問題