Elevator Saga Help and API documentation

このゲームについて

Elevator Saga とは、プログラミングのゲームです! JavaScript で書いたプログラムでエレベータを動かしてみましょう。

人々を適切な方法で目的地まで運ぶことがこのゲームの目標です。 より良いプログラムを書くことで、より難度の高い目標に挑戦することができます。 最良のプログラムを実装して、すべての目標を達成してみましょう。

遊び方

ゲーム画面の下にあるエディタにコードを入力し、適用ボタンを押すことで目標に挑戦します。 右上にあるを押すことで速さを調節できます。

プログラムにエラーが含まれる場合は、開発者ツールを用いてデバッグを試みましょう。 コードを初めからやり直したいときは、リセットボタンを押してみましょう。動作する単純な実装に巻き戻ります。 Sublime Textなどの使い慣れたテキストエディタがある場合は、そちらで編集してゲームのエディタに貼り付けるのも OK です。 書いたコードはローカルストレージに自動保存されます。間違ってブラウザを閉じちゃっても心配しないで!

基本

コードは少なくとも 2 つの関数(initupdate)を含むオブジェクトである必要があります。

{
  init: function(elevators, floors) {
      // Do stuff with the elevators and floors, which are both arrays of objects
  },
  update: function(dt, elevators, floors) {
      // Do more stuff with the elevators and floors
      // dt is the number of game seconds that passed since the last time update was called
  }
}

目標に挑戦している間はこれらの関数が呼び出されます。 init は挑戦開始時に、そして update は挑戦中何度も呼び出されます。

初めは init 関数内にイベントリスナや振る舞いに関するコードを書くことをおすすめします。

コード例

エレベータを操作するには

elevator.goToFloor(1);
すべてのタスクを完了したあとで、エレベータに1階に行くように指示します。エレベータが既にその階に行くことが決まっている場合は効果がありません。
if(elevator.currentFloor() > 2) { ... }
currentFloor を呼び出すことでエレベータが今何階にいるのかを知ることができます。エレベータから最も近い階を表す整数を手に入れますが、そこで止まっていることを表すものではありません。

API ドキュメンテーション

エレベータオブジェクト

プロパティ名種類説明
goToFloorメソッド指定した階をキューに積みます。第2引数に true を与えたときは、エレベータはその階まで向かってから、キューに積まれた階へと向かいます。
elevator.goToFloor(3); // Do it after anything else
elevator.goToFloor(2, true); // Do it before anything else
stopメソッド目的地キューを空にして、エレベータを停止させます。通常はエレベータを停止させる必要はなく、動作中のリスケジューリング処理を伴う高度な解法のために用いるべきです。エレベータがどこかの階で停止しなかった場合は、乗客は降りることができません。
elevator.stop();
currentFloorメソッドエレベータが現在いる階を取得します。
if(elevator.currentFloor() === 0) {
  // Do something special?
}
goingUpIndicatorメソッド上昇インジケータの状態を取得、あるいは設定します。待機している乗客の振る舞いが変化します。
if(elevator.goingUpIndicator()) {
  elevator.goingDownIndicator(false);
}
goingDownIndicatorメソッド下降インジケータの状態を取得、あるいは設定します。待機している乗客の振る舞いが変化します。
if(elevator.goingDownIndicator()) {
  elevator.goingUpIndicator(false);
}
maxPassengerCountメソッド同時に入れる最大の乗客数を取得します。
if(elevator.maxPassengerCount() > 5) {
  // Use this elevator for something special, because it's big
}
loadFactorメソッドエレベータの積載量指数を取得します。0 ならば空、1 ならば満員を表します。乗客によって異なる体重によって変化し、正確な測定値ではありません。
if(elevator.loadFactor() < 0.4) {
  // Maybe use this elevator, since it's not full yet?
}
destinationDirectionメソッドエレベータの進行方向を取得します。"up", "down", "stopped" のいずれかの値をとります。
destinationQueue配列現在の目的地キュー、すなわちエレベータが今後向かう予定の階を順に並べたものです。編集することもできますが、すぐに反映させるためには checkDestinationQueue() を呼び出す必要があります。
elevator.destinationQueue = [];
elevator.checkDestinationQueue();
checkDestinationQueueメソッド新しい目的地を反映させるために目的地キューを確認します。明示的に目的地キューを編集した場合にのみ使うようにしましょう。
elevator.checkDestinationQueue();
getPressedFloorsメソッド現在ボタンが押されている階を配列で取得します。
if(elevator.getPressedFloors().length > 0) {
  // Maybe go to some chosen floor first?
}
イベント名説明
idleエレベータのすべてのタスクが完了し、なにも動作していないときに発火します。
elevator.on("idle", function() { ... });
floor_button_pressedエレベータ内の乗客がボタンを押したときに発火します。
elevator.on("floor_button_pressed", function(floorNum) {
  // Maybe tell the elevator to go to that floor?
});
passing_floorエレベータが階を通過する直前に発火します。エレベータをぴったりその階に停止させるタイミングで発火します。目的階のときには発火しません。コールバックの第2引数は "up" か "down" の値を取ります。
elevator.on("passing_floor", function(floorNum, direction) { ... });
stopped_at_floorエレベータが階に到着したときに発火します。
elevator.on("stopped_at_floor", function(floorNum) {
  // Maybe decide where to go next?
});

フロアオブジェクト

プロパティ名種類説明
floorNumメソッド階数を取得します。
if(floor.floorNum() > 3) { ... }
イベント名説明
up_button_pressedその階で誰かが ↑ ボタンを押したときに発火します。乗客はエレベータに乗り損ねたときにもう一度ボタンを押します。
floor.on("up_button_pressed", function() {
  // Maybe tell an elevator to go to this floor?
});
down_button_pressedその階で誰かが ↓ ボタンを押したときに発火します。乗客はエレベータに乗り損ねたときにもう一度ボタンを押します。
floor.on("down_button_pressed", function() {
  // Maybe tell an elevator to go to this floor?
});