416

ぷよぷよプログラミング解説 第2章: 関数を作って計算式を再利用

by
puyolufar
puyolufar
ぷよぷよプログラミング Advent Calendar 2020 | 17日目 (3週目)

皆さんこんばんは。
クリスマスイヴまであと1週間ですね。

前回の予告にて、サンプルコードに含まれるコピペまがいの長大かつ瓜二つな式についてぼやきました。
今回は、この難解な式をもう少し改善してみます。

関数って?

関数の一例

まずは現物を見てみましょう。
↓これが関数です。
----
    // 組ぷよの落下がはばまれているか判定
    static isBlockingPair(x, y, dx, dy) {
        return y + 1 >= Config.stageRows || Stage.board[y + 1][x] || (y + dy + 1 >= 0 && (y + dy + 1 >= Config.stageRows || Stage.board[y + dy + 1][x + dx]));
    }

----
以上のコードを player.js 427~428行目の間 (最後の閉じ波かっこの直前) に挿入してみてください。
【注意】ぷよキャンの影響により、本記事からコピペするとコードエディターの挙動が怪しいことになってしまいます。ので、手打ちをお勧めします。

真ん中の return で始まるオレンジの式は、予告の時に僕が難癖付けたあの式と同じものです。
さて、これをどう使うのか?

player.js 202行目を、
---- 原文ここから
                if(y + 1 >= Config.stageRows || Stage.board[y + 1][x] || (y + dy + 1 >= 0 && (y + dy + 1 >= Config.stageRows || Stage.board[y + dy + 1][x + dx]))) {
---- 原文ここまで
以下のように書き換えても、依然として正常動作します。
---- 関数導入バージョンここから
                if(this.isBlockingPair(x, y, dx, dy)) {  // 参考: https://puyo-camp.jp/posts/133472
---- 関数導入バージョンここまで

解説

上記の例では、以下のようなことを行っています。
  1. まず、新しい関数 isBlockingPair を作りました。
  2. そこに202行目の長い式をコピペして、関数が202行目の計算式を再現するようにしました。
  3. これにより、202行目の式は関数で代用できるようになります。
もう少し簡単に説明すると、「そこであの計算を行う」という挙動を保ったまま、式の場所を移動しました。

実習: 二つを一つに

さて、そもそもあの式の難点は長いうえに2回書いていることでした。
その式を切り離して関数にすると、何がうれしいか?

実は、184行目の同じ式も、202行目と同様に書き換えることができます。
(やってみましょう!)

あの長い式を関数にするとき、その関数に isBlockingPair という名前を付けました
この名前を付けたというところがポイントで、名前さえあればどこでも同じ計算を再現できるのです。

おかげで2回書いていた式が1回だけになりました!
もう3回目・4回目の計算も関数を呼ぶだけでOK! やったね!

まとめ

関数をうまく作ると、このように計算式の使い回しを簡単にできます。
整理整頓や効率化が好きな方は、ぜひ詳しく調べてみてほしいなぁ。
地味な改善ですが、誰にも悟られないようこっそり進化するというのも、中々味のある体験です。

ちなみに、同じ計算式を2回書いてしまうことは現場でもよくあることで、後から手直しをすることにより徐々に改善しています。

おまけ

実は今回定義した関数をさらに分解することもできます。
----
    // 組ぷよの落下がはばまれているか判定
    static isBlockingPair(x, y, dx, dy) {
        return y + 1 >= Config.stageRows || Stage.board[y + 1][x] || (y + dy + 1 >= 0 && (y + dy + 1 >= Config.stageRows || Stage.board[y + dy + 1][x + dx]));
    }

----
↓この return の行の中に、ほぼ同じ式が2つあるのですが…初心者には見抜けないかもしれません。
----
    // 組ぷよの落下がはばまれているか判定
    static isBlockingPair(x, y, dx, dy) {
        return this.isBlockingOne(x, y) || (y + dy + 1 >= 0 && this.isBlockingOne(x + dx, y + dy));
    }

    // 操作中のぷよの落下がはばまれているか判定 (1マスだけ注目)
    static isBlockingOne(x, y) {
        return y + 1 >= Config.stageRows || Stage.board[y + 1][x];
    }

----
こうなります。

次回予告

次回更新はクリスマスイヴ。
いよいよぷよグラミング解説のメインディッシュ「連鎖」について解説します。
コンピューターは4つくっついてるぷよをどうやって探しているのでしょう…?

次の記事
更新日時:2020/12/24 19:17
(作成日時:2020/12/17 19:00)
コメント( 0 )
コメントするにはログインが必要です
シェア