Elevator Saga Help and API documentation

このゲームについて

これはプログラミングのゲームです!
あなたは JavaScriptのプログラムを書いてエレベーターの動作をプログラミングします。

ゴールは効率的にユーザを各階に運ぶことです。
うまく運ぶとより難しい課題にチャレンジすることができます。
素晴らしいプログラムだけがすべてのレベルにチャレンジ・完了することができるのです。

プレイ方法

ゲームビュー下部にコードを書き、 Apply ボタンを押すとそのレベルが開始されます。
ゲーム中の時間の速度は のボタンによって調整することができます。.

あなたのプログラムにエラーがある場合、 ブラウザ上の開発ツールを用いることでデバッグできます。 最初からやり直したい場合は Reset ボタンを押します。すべてがリセットされるのでバグはなくなりますが、初期状態に戻ります。
もし、 Sublime Textのようなエディタを使いたいのでしたら、コードをそのエディタで編集してコードを貼り付けてください。
画面下部のプログラムは自動的にローカルストレージに保存されます。このため、誤ってブラウザを閉じても消えることはありません。

プログラムの基本

プログラムは initupdateという2つの関数を含む必要があります。

{
    init: function(elevators, floors) {
        // elevators、floorはarray型です
    },
    update: function(dt, elevators, floors) {
        // elevators、floorはarray型です
        // dtは最後にupdate関数を呼び出してから、この関数が呼ばれるまでのゲーム内の秒数です。
    }
}

この2つの関数はゲーム中に自動的に呼び出されます。
init はゲームの開始時に、update はゲーム中に繰り返し呼ばれる関数です。

一般的に、多くのコードは initにイベントリスナーとロジックが書かれます。

コード例

エレベータの制御方法

elevator.goToFloor(1);
他のタスクが完了したのちにエレベーターを1階に移動させます。エレベータに対して1階に異動する指示を出している場合、何も起こりません。
if(elevator.currentFloor() > 2) { ... }
currentFloor()関数は現在の回数を返します。ただし、エレベータが階の間を移動している際、この関数は丸めた値を返すことに注意してください。

イベントリスナー

イベントをListenすることで、フロア到着時やボタンを押された際にプログラムを実行することができます。

elevator.on("idle", function() { elevator.goToFloor(0); });
idleイベント: タスクのキューが空でエレベータが動いていないときに発火します。この例ではフロア0に移動します。
elevator.on("floor_button_pressed", function(floorNum) { ... } );
floor_button_pressedイベント: 乗客によってボタンが押された時に発火します。floorNumには押された階が入ります。
floor.on("up_button_pressed", function() { ... } );
up_button_pressed"イベント: そのfloorで待っているユーザが上ボタンを押したときに発火します。上の階に行きたい乗客がいることを示します。

API ドキュメント

Elevator オブジェクトt

PropertyType説明
goToFloorfunction第一引数に指定されたフロアをキューに入れます。第二引数にtrueを設定するとキューに入ることなくその階に向かいます。そのあと、キューに入っているフロアに向かいます。
elevator.goToFloor(3); // ほかのキュー動作の後に3階に向かいます
elevator.goToFloor(2, true); // キューの内容にかかわらず2階に向かいます
stopfunction動作キューをクリアし、エレベータをストップします。通常、エレベータをストップすることはありません。この関数は再スケジューリングロジックの実装のために用意されています。この関数が呼ばれたときおそらくエレベータはフロアに停止していないので、乗客は降りることができません。
elevator.stop();
currentFloorfunctionエレベータのいるフロアを返します
if(elevator.currentFloor() === 0) {
    // 何らかの動作
}
goingUpIndicatorfunctionUpのインジケータをset/getします。これはフロアで停止した際の乗客の行動に影響します。
if(elevator.goingUpIndicator()) {
    elevator.goingDownIndicator(false);
}
goingDownIndicatorfunctionDownのインジケータをset/getします。これはフロアで停止した際の乗客の行動に影響します。
if(elevator.goingDownIndicator()) {
    elevator.goingUpIndicator(false);
}
maxPassengerCountfunction最大乗車人数を取得します
if(elevator.maxPassengerCount() > 5) {
    // なにか特別なことにこの大きなエレベータを使います
}
loadFactorfunctionエレベータに乗っている人々の重さを得ます。そのエレベータごとに0が空、1がFULLを示します。
if(elevator.loadFactor() < 0.4) {
    // Maybe use this elevator, since it's not full yet?
}
destinationDirectionfunctionエレベータの今の状態を得ます。 "up", "down" or "stopped"のいずれかです。
destinationQueuearrayそのエレベータの今の行き先キューをgetします。これは設定することが可能です(空にすることも可能です)。変更を即座に反映したい場合、checkDestinationQueue関数を呼ぶ必要があります。
elevator.destinationQueue = [];
elevator.checkDestinationQueue();
checkDestinationQueuefunctionこの関数はdestinationDirectionを手動で編集した場合に呼ぶ必要があります。この関数はdestination queueを参照し、次の宛先を決定します。
elevator.checkDestinationQueue();
getPressedFloorsfunction現在押されているフロアを配列で取得します。
if(elevator.getPressedFloors().length > 0) {
    // 最初に押されたフロアに行く?
}
EventExplanationExample
idleこのイベントはエレベータがなんのタスクも持っていないときに発火します。
elevator.on("idle", function() { ... });
floor_button_pressed乗客がエレベータ内の行き先フロアボタンを押したときに発火するイベントです。
elevator.on("floor_button_pressed", function(floorNum) {
    // この階に行くようにエレベータに命令する?
})
passing_floorエレベータがフロアを通過する直前に発火するイベントです。そのフロアに停止すべきかを判断するのに利用できます。ただし、このイベントはdestination フロアには発火しません。尚、"Direction"は"up"か"down"です。
elevator.on("passing_floor", function(floorNum, direction) { ... });
stopped_at_floorフロアに到着した時に発火するイベント。
elevator.on("stopped_at_floor", function(floorNum) {
    // 次にどこに行くかを決定する?
})

Floor object

PropertyTypeExplanationExample
floorNumfunctionそのフロアの階数を示します。
if(floor.floorNum() > 3) { ... }
EventExplanationExample
up_button_pressedフロアで乗客が"up"ボタンを押した際に発火するイベントです。乗客がエレベータに入れなかった場合、再度ボタンは押されます。
floor.on("up_button_pressed", function() {
    // この階に行くようにエレベータに命令する?
})
down_button_pressedフロアで乗客が"down"ボタンを押した際に発火するイベントです。乗客がエレベータに入れなかった場合、再度ボタンは押されます。
floor.on("down_button_pressed", function() {
    // この階に行くようにエレベータに命令する?
})