ペーパーマリオのバトル(パズル)をアルゴリズムで解く

※ この記事は、ゲーム進行が(任天堂の意図しない形で)不正に有利になる遊び方を推奨するものではありません。 また、本記事の内容を実践したことによって生じたいかなる損害も保証しかねます。

ペーパーマリオ オリガミキングが面白そうな件

今年の夏休みはコロナ禍で帰省もできなくて暇だなぁ……。

こんなときはゲームで遊ぼう。

ペーパーマリオが面白いらしいよ。

え、、

もしかして、買ったの?

いや、人が遊んでいるのを見ているだけなんだけど、バトルがパズルなんだよねこれ。

www.youtube.com

どういうルールなの?

敵をスライドさせて、どちらかのパターンを作る。

❶ 敵4体の塊を1列に整列させる

❷ ステージの内周に2行2列に整列させる

ふむ。

きちんと揃えないと、マリオの攻撃が届かないんだよ。

子供向けのゲームだろうし、じっくり考えればいけそうだね。

ところが、時間制限回数制限があって、熟考もできなければ試行錯誤もできない。

ロジカルな思考力だけじゃなく、ひらめきも大事。

なにこれむずいじゃん。

むずかしいよ。

ザコ戦のバトルが毎回コレなので、なんとかコンピュータにパズルを解かせることはできないかなと思って、ちょっと考えてみたんだ。

ペーパーマリオ オリガミキング ザコ戦パズル解法アルゴリズム(草案)

f:id:tercel_s:20200809170201j:plain
f:id:tercel_s:20200809170228j:plain

なにこれ……やば

やばくないよ。

基本情報技術者試験によく出る探索アルゴリズムを応用したものだよ。

こういう探索アルゴリズムってどうやって実装するの?

for ループだとネストがどんどん深くなりそう。

こういうのは for 文で書いちゃダメで、再帰処理を使って実装するんだよ。

プログラミング言語の入門書にはあまり載っていないテクニックで、どちらかというとアルゴリズムとデータ構造の本によく出てくるね。

再帰処理かー……。

あれって鬼門だよね。 苦手な学生も多かったし……。

機会があれば、実装例も載せて再帰処理の勘所を紹介したいのだけど、あいにく身に付けたところで使いどころが限られているからね、、、

再帰的データ構造と Composite パターン

再帰処理と相性のよいデータ構造には、グラフといったデータ構造があるよ。

あるね。

配列やリストは、データ同士の繋がりも分かりやすいし、多くのプログラム言語がサポートしているけど、木構造のデータってどう表現するの?

それについては昔、すごい雑な記事を書いた気がする……。

tercel-tech.hatenablog.com

構文として木構造をサポートしている言語は無いの?

Lisp とかはサポートしてた気がする……。

そういえば、Common Lisp では、実行時のパフォーマンスを上げるために、再帰呼び出しが関数の末尾にくるように最適化したりするけど、まぁその話は今関係ないからいいや。

もっとメジャーな言語でお願いします。

それでいうと、C++とかJavaとか、その派生言語であれば「再帰的なデータ構造はこうやってクラス設計しましょう」という方法論は確立されているよ。

Composite パターンって言うんだ。

なるほど。

このへんをしっかり学びたければ、デザインパターンの本を読んでみよう。

最近は拡大解釈され過ぎて、「インフラデザインパターン」とか「クラウドデザインパターン」とかネコも杓子もデザインパターンという用語が濫用されがちだけど、ここでは「オブジェクト指向における再利用のためのデザインパターン」だよ。

というか、マリオの話をしていたはずなのにどうしてここまで脱線したのか。

いつもの事だね。

おまけ

ペーパーマリオ、ストーリーが素晴らしくて、ラストでうるっときました。

危うく泣くところでした。

Copyright (c) 2012 @tercel_s, @iTercel, @pi_cro_s.