KEIS BLOGは株式会社ケイズ・ソフトウェアが運営しています。

KEIS BLOG

攻略 Elevator Saga =応用編=


前回に引き続き「Elevator Saga」を攻略していこうと思います。
第2回の今回は応用編で、基本編で紹介した初歩的なロジックを組み合わせより難易度の高いロジックを作成していきます。

Elevator Sagaとは
平たく言うとエレベータのシミュレーションゲームです。

エレベータを制御して各ステージ(Challenge)をクリアしていくゲームです。
各ステージ毎に設定された条件をみたす事でステージクリアです。
ステージは全部で19ステージあり、ステージが進むに連れて、階数が増えたり、エレベータが増えたりと、
どんどん難易度が上がっていきます。

最大の特徴は・・・。
ゲーム自体HTML5/JavaScriptで作られているのですが、
エレベータのアルゴリズムを「JavaScript」で書くことです。

Elevator Saga 関連リンク

Elevator Saga
http://play.elevatorsaga.com/

Help and API document
http://play.elevatorsaga.com/documentation.html

Source code
https://github.com/magwo/elevatorsaga

ステージクリア条件について

各ステージのクリア条件は大きく分けて4種類あります。
効率の良いロジックを組めば、どの条件も満たせるロジックを組むことが出来ます。(なかなか難しいですが・・。)

Challenge #: Transport [p] people in [s] seconds or less
-> [s]秒以内に[p]人移動
# 制限時間以内に出来るだけ多くの人を運ぶことが目的

Challenge #: Transport [p] people using [n] elevator moves or less
-> [n]回以内に[p]人移動
# 少ないエレベーターの移動回数で多くの人を運ぶことが目的

Challenge #: Transport [p] people and let no one wait more than [w] seconds
-> 最大待ち時間[w]秒以内で[p]人移動
# エレベータホールに人を待たせないようにエレベータを移動させることが目的

Challenge #: Transport [p] people in [s] seconds or less and let no one wait more than [w] seconds
-> [s]秒以内に最大待ち時間[w]秒以内で[p]人移動

前回サンプルの解説 – elevator_saga_01.js

おさらいを兼ねて前回掲載のサンプルを解説していきます。
運が良いとChallenge3までクリア出来ます。

{
    init: function(elevators, floors) {
        e = elevators[0]; // ... (1)
        e.on("floor_button_pressed", function(fn) { // ... (2)
            e.goToFloor(fn); // ... (3)
        });
        floors.forEach(function(f) { // ... (4)
            f.on("up_button_pressed down_button_pressed", function() { // ... (5)
                e.goToFloor(f.floorNum()); // ... (6)
            });
        });
    },
    update: function(dt, elevators, floors) {
    }
}

(1) 0番目のエレベータオブジェクトを取り出す。(エレベータが複数台あるときはループを使用)
(2) エレベータ内の行き先ボタン(フロアーボタン)が押されたときに発生するイベントを定義
(3) 行き先ボタンが押されたフロアにエレベータを移動
(4) 複数あるフロアーをループで繰り返す。
(5) フロアーの行き先ボタン(上または下)が押された時に発生するイベントを定義
(6) フロアーの行き先ボタンが押されたフロアーにエレベータを移動

エレベータ複数台対応 – elevator_saga_02.js

前回のサンプルにエレベータ複数台に対応したロジックを加えたサンプルです。
Challenge4までクリア出来ます。
追加点: エレベータ配列のループ、フロアーボタンが押された時のエレベータ選択ロジック

{
    init: function(elevators, floors) {
 
        elevators.forEach(function(e) { // ... (1)
            e.on("floor_button_pressed", function(fn) { // ... (2)
                e.goToFloor(fn); // ... (3)
            });
        });
        floors.forEach(function(f) { // ... (4)
            f.on("up_button_pressed down_button_pressed", function() { // ... (5)
                elevators.sort(function(ef, et) { // ... (6)
                    if (ef.loadFactor() < et.loadFactor())
                        return -1;
                    else
                        return 1;
                });
                elevators[0].goToFloor(f.floorNum()); // ... (7)
            });
        });
    },
    update: function(dt, elevators, floors) {
    }
}

(1) エレベータ配列をループで繰り返す。
(2) エレベータ内の行き先ボタン(フロアーボタン)が押されたときに発生するイベントを定義
(3) 行き先ボタンが押されたフロアにエレベータを移動
(4) フロアー配列をループで繰り返す。
(5) フロアーの行き先ボタン(上または下)が押された時に発生するイベントを定義
(6) エレベータ配列を乗員昇順に並べ替える
(7) フロアーの行き先ボタンが押されたフロアーに乗員数が一番少ないエレベータを移動

裏技
URLの後ろにアンカー(#challenge=n : nはchallenge番号)をつけるとchallenge移動ができます。

http://play.elevatorsaga.com/#challenge=n

まとめ
全2回に渡って「Elevator Saga」を攻略してきましたが、いかがだったでしょうか?
JavaScriptを使ってエレベーターのロジックを書くという斬新なゲームですが、なかなか奥が深く高度なアルゴリズムが学べるのではないでしょうか。
みなさんも全ステージ(Challenge)クリア目指して頑張ってみてください。

【関連記事】
Google App Engine 第一回
Google App Engine 第二回
Javaのライブラリを手軽にテストしたい!! Groovy入門 第1回
Google App Engine 第三回
Google App Engine 第四回
Google App Engine 第五回
Google App Engine 第六回
Google App Engine 第七回
Google App Engine 第八回
Google App Engine 第九回
Google App Engine 第十回
Google App Engine 第十一回
Google App Engine 第十二回
AngularJS入門01
AngularJS入門02
AngularJS入門03
AngularJS入門04
AngularJS入門05
AngularJS入門06
AngularJS入門07
AngularJS入門08
AngularJS入門09
攻略 Elevator Saga =基本編=