Godotで対戦ゲームにチャレンジ
たこ焼き名人_改もとりあえず完成したし、次は対戦ゲームを作ってみたいと思っていた。Directorでオセロや囲碁や5目ならべみたいなのを作ったことがあったので、同じようなものを今なら簡単に作れるだろうと思ったわけだ。
作るものを考える
最終的に作りたいものはあるんだけどClaudeと少しやり取り。作りたいものの名前を忘れたのでざっくり質問した。
最終的に一番作りたいのは相手にコマを渡して盤面に置かせる4目ならべ的なゲーム。イタリアのゲームだったっけ?
数種類の特定の形状や色のコマを相手に渡して盤面に置かせる。それで縦横斜めどこか1列に並んだら勝ち。負けだっけ? ネット検索したら出てくる?
すぐに「クワルト(Quarto)ですね!」と教えてくれた。まさにそれ!
しかし、最初は対戦の仕組みを学ぶためにもっと単純なものを作ろうと思い、最初は三目並べ(〇×ゲーム)にしようと思った。思ったんだけど、きっと作っていてつまらないだろうと思ってやめた。
Connect Fourを作ってみよう
Claudeとまた話をして「Connect Four(四目並べ)」を作ることにした。遊んだことないけど、三目並べよりやや複雑だし動きもある。
画面を作る
まずはIllustratorでデザインを作成。それをPNG書き出ししてGodotに読み込んで。

そしてClaudeにコードを書いてもらう。もう全然自分でコードは書かない。Claudeに指示出して出てくるコードを貼り付けるだけ。
ここに細かくメモする予定だったけど、たこ焼きより仕組みが単純なので、ガンガン進めてしまった。コードを自分で書いていないので事細かに書いていっても自分用のメモとしては機能しないし。
実装の順番
最終的にネット越しに対戦できるようにするのが目標だけど、まずは動きを見ないとどうにもならないので以下の流れで進めて行った。思いついたままに進めてるので進行が雑。
画面の上部の余白クリックでディスクが落ちてくるようにする
落下時に2回跳ねるようにする
SEを入れる
CPUにランダムに落とさせるようにする
ディスクが4枚揃った判定アルゴリズムの実装
CPU戦で難易度を設定できるようにするUI実装
CPUの難易度別アルゴリズムの実装
対戦用サーバの選定(結局今回もTalo)
対戦機能の実装
1人で対戦テスト
バグ修正
消音ボタンの追加
こんな感じで進めた。
割とすぐにできた
CPUのアルゴリズムはこんな感じだった。
Easy:完全にランダムにディスクを落とす
Normal:勝利/ブロック優先(貪欲法)
・自分が勝てる列があれば即打つ
・相手が次に勝つ手があればブロック
・それ以外はランダム
Hard:評価関数(Greedy/貪欲法ベース)
・中央列を優先するスコア
・3つ並びの脅威をカウントしてスコア化
Expert:ミニマックス+アルファベータ枝刈り
深さ4まで先読みして、自分のスコアを最大化しつつ相手のスコアを最小化する手を選ぶアルゴリズム。アルファベータ枝刈りで計算を効率化。
※最初深さ8にしたら固まったので4まで下げた
こんな感じになってちゃんと動いてるっぽい。

なんかすごいよね。AI。
itch.ioにアップ
最後にitch.ioにアップする。そして家族と対戦のテストをしたらいきなりバグを発見された。連打でディスクが何枚も落ちてくるという初歩的なバグ……。1人で遊んでると気づかない。というか、連打しようなんて思いつかなかった。
Claudeに訊いたらコードを2行ほど追加してあっさり直った。
もうこれで完成でいいや。たこ焼きの時のようにページをいろいろいじったりもせずプレーンな状態。
次は何作ろうかな?
おわり
