2

JavaScript に基づいたカレル ロボット (ウィキペディア) のような小さなロボットを作成しました。

カレル4Web

ロボットは、「前進」、「右折」などの簡単なコマンドで制御できます。

ユーザーは、javascript プログラムを記述してロボットを制御し、javascript の「eval()」関数を介してロボットが動くようにすることができます。

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

現在の方法: 解析

現時点では、テキストエリアの各行を解析し、window.setTimeout で次々に実行されるアクションのスタックを構築することで、これを (オフライン バージョンで) 解決しました。しかし、これにはもちろん制限があります。なぜなら、小さな JavaScript 言語構造ごとに解析コードを書かなければならず、これは多くの作業とエラーが発生しやすいからです。

これに関するいくつかの追加情報:

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

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

重要な関数はスクリプトの最後にあります: run(), execute()

現在、ユーザー スクリプトを 1 行ずつ解析し、アクションをスタックに追加しています。パーサーが「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 ステートメントのロジックを理解するために解析する必要がありますが、これは実行速度を制御できる多くの方法の 1 つです。

于 2011-08-03T11:37:33.470 に答える