codecombat-desert-1

プログラミングの学習を、Webゲーム感覚で気軽に始められるサービス【CodeCombat】の攻略記事です。(無課金でも楽しめるステージのみを紹介しています…)

今回は、サーバン砂漠編Part1ということで「強力な砂ヤク」から「秒読み」までのステージを1つずつ攻略していきます!

codecombat-desert-2


強力な砂ヤク

codecombat-desert-3

牛によく似た「ヤク」と呼ばれる動物が近づいてきたら、右方向へ移動して避けていくのが目標となるステージです。

今までに出てきた構文を使えば、簡単に組み立てられるはず!

loop {
    // 現在の位置を取得する
    var x = this.pos.x;
    var y = this.pos.y;
    
    // 「ヤク」が近くにいないか確認する
    var yak = this.findNearestEnemy();
    
    // 「ヤク」が10m未満に近づいたら、右へ10m移動する
    if (this.distanceTo(yak) < 10) {
        x += 10;
        this.moveXY(x, y);
    }
}

プログラミングのポイントは、「ヤク」が近づいてきたかどうかをチェックする方法と、指定した距離になったら右へ移動する条件分岐を書くところでしょう。


オアシス

codecombat-desert-4

前ステージと同様に「ヤク」を避けながら、画面右側にある水源のオアシスへたどり着ければクリアとなります。

ただし、今回は「ヤク」を避ける時だけ左へ移動し、その後にまた右方向へ移動していくようにプログラミングする必要があります。

loop {
    // 現在位置と敵の存在チェック
    var x = this.pos.x;
    var y = this.pos.y;
    var yak = this.findNearestEnemy();

    // 
    if (this.distanceTo(yak) < 10) {

        // 「ヤク」を避ける場合は左方向へ移動
        x -= 10;
        this.moveXY(x, y);

    } else {

        // 通常時は右方向へ移動
        x += 10;
        this.moveXY(x, y);

    }
}

前ステージでは、右方向へ移動するのに「x += 10」と書いていたので、逆に左方向へ移動するのであれば「x -= 10」と値を引いてあげればOKです。


Basin Stampede

codecombat-desert-5

今回のステージでは、「ヤク」が画面左側から右方向へ大量に走ってくるので、上下に避けながら移動する必要があります。

ポイントは、上方向へ移動するには「 yPos + 1」、 下方向へ移動するには「yPos - 1」とコーディングするところでしょう。

loop {

    // 周囲に「ヤク」がいるかのチェックと、現在位置の初期設定
    // X座標に関しては、常に5mずつ移動するように設定
    var yak = this.findNearestEnemy();
    var xPos = this.pos.x + 5;
    var yPos = 17;

    if(yak) {
        // 「ヤク」と自分のY座標を比較する
        if(yak.pos.y > this.pos.y) {

            // 自分よりも上側に「ヤク」がいたら下方向へ移動
            yPos -= 1;

        } else {

            // 自分よりも下側に「ヤク」がいたら上方向へ移動
            yPos += 1;

        }
    }
    this.moveXY(xPos, yPos);
}


サルヴの道

codecombat-desert-6

画面右上にある「オアシス」を目指して移動するのですが、途中で「敵」が出現するので倒しながら進む必要があります。

「敵」の倒し方は今まで通りでOKですが、周囲に敵がいるかのチェックは「loop」処理内に書くことを忘れないようにしましょう!(常にチェックするために…)

// 現在位置を取得
var x = this.pos.x;
var y = this.pos.y;

loop {
    // 常に敵をチェックするためにloop内に書く
    var enemy = this.findNearestEnemy();
    
    if(enemy) {

        // 「cleave」が利用できる時は発動
        if(this.isReady("cleave")) {
            this.cleave(enemy);
        
        }
        else {

            // 敵がいなければ移動する
            this.attack(enemy);

        }
    }
    else {

        // X,Yそれぞれ「5m」ずつ移動する
        x += 5;
        y += 5;
        this.moveXY(x, y);

    }
}

「cleave」の発動をしなくても敵を倒せるかもしれませんが、念のため書いておきました。


Crossroads

codecombat-desert-7-2

4方向から敵が出現するので、トラップを仕掛けて敵を倒しながら一定時間経つまで死なないようにするのが目標となるステージです。


トラップを仕掛けるための「ハンマー」を装備するのを忘れないようにしましょう。

codecombat-desert-7-1

あとは、敵が近づいたら「buildXY()」を使ってトラップを仕掛けるだけです!

loop {
    // 「敵」の存在チェック
    var enemy = this.findNearestEnemy();

    if(enemy) {
        if(enemy.pos.x < this.pos.x) {

            // 左方向から出現する「敵」にトラップを仕掛ける
            this.buildXY("fire-trap", 24, 34);

        } else if (enemy.pos.x > this.pos.x) {

            // 右方向から出現する「敵」にトラップを仕掛ける
            this.buildXY("fire-trap", 56, 34);

        } else if (enemy.pos.y < this.pos.y) {

            // 上方向から出現する「敵」にトラップを仕掛ける
            this.buildXY("fire-trap", 40, 18);

        } else if (enemy.pos.y > this.pos.y) {

            // 下方向から出現する「敵」にトラップを仕掛ける
            this.buildXY("fire-trap", 40, 50);

        }
    }
    this.moveXY(40, 34);
}

トラップは「fence」ではなく、「fire-trap」なので間違わないように…!

あと、仕掛ける座標位置によっては反応しない場合もあるので、上手くいかないようであれば何度か座標を調整すると良いでしょう。


轟くヤクの足

codecombat-desert-8

上下から出現する「ヤク」を見つけたら、すかさず「垣根」を作って阻止するのが目標のステージです。

「ヤク」の現在位置は「pos.y」で取得できるので、これに条件分岐でどの方向から出現しているのかを書いていけば良いでしょう。

// 現在位置の取得
var x = this.pos.x;
var y = this.pos.y;

loop {
    // 「ヤク」の存在チェック
    var yak = this.findNearestEnemy();
    
    if (yak) {
        if(yak.pos.y > y) {

            // 「ヤク」が上から出現したら、「ヤク」の10メートル下に垣根を作る
            this.buildXY("fence", x, yak.pos.y - 10);

        }
        else {

            // 「ヤク」が下から出現したら、「ヤク」の10メートル上に垣根を作る
            this.buildXY("fence", x, yak.pos.y + 10);

        }
    } else {
        // オアシスへ向かって10mずつ移動する
        x = x + 10;
        this.moveXY(x, y);
    }
}

編集画面内のステージ上をマウスでなぞると、「X・Y」の座標を確認できるのでチェックするクセを付けておくと便利ですよ。


治療師のケア

codecombat-desert-9-2

今回のステージでは、体力を回復してくれる「ヒーラー」がいるので、危なくなったら「heal me」と言いましょう。

そこで、自分の体力情報を取得できるアクセサリーを装備するのを忘れないようにします。

codecombat-desert-9

これにより、「health」コマンドで現在の残り体力を取得でき、「maxHealth」で体力の最大値を取得できるようになります。

あとは、体力が半分になったら「ヒーラー」のところへ移動し、回復してもらえるようなプログラミングを行うだけです!

loop {

    // 現在の体力を取得
    var getHealth = this.health;

    // 半分の体力値を取得
    var healthLimit = this.maxHealth / 2;
    var enemy = this.findNearestEnemy();
    
    // 体力が半分になったら…
    if(getHealth < healthLimit) {

        // 「ヒーラー」のところへ移動
        this.moveXY(65, 46);

        // 「heal me」と言って体力を回復
        this.say("heal me");

    }
    else if(enemy) {
        this.attack(enemy);
    }
}

「ヒーラー」の近くに行くだけでは体力を回復してくれないので、必ず「heal me」と言うようにしましょう。


Operation 'Killdeer'

codecombat-desert-10

このステージでは、体力が危なくなったら味方陣地へ戻り、全員で「敵」を攻撃するというスタイルになっています。

今回は、「体力に問題はないか?」を確認するための関数を作り、それによって条件を分岐させるようにプログラミングしていきます。

// 「体力」に余裕があるかどうかを確認する関数を作る
this.shouldRun = function() {
    if (this.health < this.maxHealth / 2) {
        // 体力が半分になったら「true」を返す
        return true;

    } else {
        // 体力に余裕がある場合は「false」を返す
        return false;

    }
};

// ループ処理
while (true) {
    // 「敵」の存在チェック
    var enemy = hero.findNearestEnemy();
    
    // 関数を使って残り「体力」による条件分岐
    if(this.shouldRun()) {
        // 体力が少ない場合は、味方陣地へ移動
        this.moveXY(75, 37);

    }
    else {
        // 体力に余裕がある場合は攻撃を続ける
        this.attack(enemy);
    
    }
}

ループ処理の「while()」は、直接「true」を指定すれば、今まで利用していた「loop」とほぼ同じ動きになります。

関数を作る際に、「return」で「true・false」を返すようにプログラミングすれば、条件分岐で使いやすいので覚えておきましょう。


サルヴの偵察者

codecombat-desert-11-2

このステージでは「旗」を使って、「垣根」や「トラップ」を仕掛けながら敵を倒し続けることになります。

そのため、まずは「旗」を装備するのを忘れないようにしましょう。

codecombat-desert-11-1

「旗」は、マウスで任意の箇所をクリックすることで配置することができます。

あとは、「旗」の色によって仕掛けるトラップを使い分けるようにすればOK!

loop {
    // 「黒色」と「緑色」の旗を使用
    var flagGreen = this.findFlag("green");
    var flagBlack = this.findFlag("black");
    
    // 「緑色」の旗の場合
    if(flagGreen) {

        // 「垣根」を仕掛ける
        this.buildXY("fence", flagGreen.pos.x, flagGreen.pos.y);
        // 旗の回収
        this.pickUpFlag(flagGreen);

    }
    // 「黒色」の旗の場合
    else if(flagBlack) {

        // 「fire-trap」を仕掛ける
        this.buildXY("fire-trap", flagBlack.pos.x, flagBlack.pos.y);
        // 旗の回収
        this.pickUpFlag(flagBlack);

    }
    // センターに移動
    this.moveXY(43, 31);
}

「ヤク」が出現したら「垣根」を仕掛け、「敵」が出現したら「fire-trap」を仕掛けましょう。ちなみに、周りにいる「アーチャー」が事前に「ヤク」か「敵」のどちらが出現するのかを教えてくれるので、よーく見ておきましょう。

マウスで「旗」を仕掛けるタイミングが重要なので、しっかりプログラミング出来てもクリアが難しいアクション性の高いステージと言えるでしょう。


秒読み

codecombat-desert-12-2

このステージでは、ゲームの「経過時間」によって条件を分岐させて、攻撃したりコイン収集させたり違った動作をプログラミングすることになります。

そのため、時間を操作できる「腕時計」を装備しておきましょう!

codecombat-desert-12-1

あとは、「now()」コマンドからゲームの経過時間を取得できるようになります。

loop {
    // 「コイン」と「敵」の存在チェック
    var enemy = this.findNearestEnemy();
    var item = this.findNearestItem();
    
    if (this.now() < 10) {

        //     // 最初の10秒までは攻撃を続ける
        this.attack(enemy);

    }
    else if (this.now() < 35) {

        // 35秒経過するまではコイン収集する
        if(item) {
            this.moveXY(item.pos.x, item.pos.y);
        }

    }
    else {

        // 35秒後は、再び攻撃を仕掛ける
        if(enemy) {
            if(this.isReady("cleave")) {
                this.cleave(enemy);
            }
            else {
                this.attack(enemy);
            }
        }

    }
}

35秒経過後の攻撃については、「敵」が大量に出現するので「cleave」を発動するようにしておきましょう!


「サーバン砂漠編Part2」に続く…

「CodeCombat攻略まとめ」はこちら!