ぷよぷよプログラミング 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
---- 関数導入バージョンここまで
解説
上記の例では、以下のようなことを行っています。
- まず、新しい関数 isBlockingPair を作りました。
- そこに202行目の長い式をコピペして、関数が202行目の計算式を再現するようにしました。
- これにより、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つくっついてるぷよをどうやって探しているのでしょう…?
次の記事