Bbeol Arcade
← マガジン一覧へ アーケードTOPへ →
開発ノート

テスト用に作った自動プレイBotがゲームを永遠に終わらなくしてしまった話

Bbeol エディター · 読了時間 3分
テスト用に作った自動プレイBotがゲームを永遠に終わらなくしてしまった話

今日の開発ノートは自慢話ではありません。率直なやらかし報告に近いです。

パズルゲームを開発していると、テストを効率化するために裏技やデバッグツールを作ることがよくあります。ナンバーポップの盤面は6列8行、合計48マスの数字タイルで構成されています。例外処理をテストするために毎回人間が指で1-2-3と繋いで確認するのは、手首も疲れますし時間も足りませんでした。

そこで、管理者認証を通すことで起動する秘密兵器、開発ノート専用の自動プレイ機能を実装しました。


コンピュータは疲れを知らず、容赦もありませんでした

この自動プレイBotの仕組みはシンプルです。盤面に並んだ48個の数字をサーバーアルゴリズムでリアルタイムに分析し、1から始まる最長で効率の良いルートを見つけ出し、人間の代わりにタイルをポンポンと消してくれる機能です。

1倍速の通常スピードから2倍速、さらには5倍速のターボモードまで搭載しました。管理者認証なしでは起動すらできないよう厳重に保護し、一般ランキングの集計にも影響が出ないよう完全に隔離しました。

ここまでは実に平和でした。温かいコーヒーを淹れてモニターの前に座り、コンピュータが一人で器用にパズルを解いていく姿を満足げに眺めていたのです。

事件が起きたのは、スコアチャレンジ(記録挑戦モード)を起動した瞬間でした。


226点を超えても残り時間は90秒満タン?

ナンバーポップのスコアチャレンジは、基本90秒の制限時間で競うモードです。そしてこのモードには、プレイヤーの挑戦意欲を掻き立てる大切なルールがあります。

長い数字のコンボを決めると、繋いだ長さに応じて制限時間が少しずつ補充されます。4個のタイルを消すと4点とともに制限時間が0.9秒プラスされる仕様です。

人間が遊ぶときは、これが程よい緊張感を生み出します。目でルートを探すのに2秒、指を滑らせるのに1秒かかるため、どんなに上手い人でも時間は少しずつ削られ、最後は0秒に向かってスリリングに終了します。

しかし、コンピュータは違いました。

コンピュータには悩む時間が0.1秒も必要ありませんでした。盤面に新しいタイルが補充された瞬間に最も長い4点や5点のルートを正確に見つけ出し、1秒間に何度も連続して弾けさせ始めたのです。

その結果、何が起きたでしょうか。

時間が減るスピードよりも、コンボ成功で時間が回復するスピードのほうが圧倒的に速かったのです。

226点を超えてLV.5マスターに達しても90秒満タンを維持する実際のゲームキャプチャ

上のスチルカットこそが、まさにその現場です。

スコアはすでに226点を突破し、難易度は最高レベルである「LV.5 マスター」に到達しました。ヒントはなんと23個も溜まっています。それなのに画面右上の残り時間をご覧ください。

いまだに90秒のままです。0.1秒も減ることなく、常に90秒満タンのまま永遠に維持されています。


百聞は一見にしかず:無限ループで暴走する実際の映像

文章だけでは想像しづらいと思いますので、実際に録画したテスト映像をご覧ください。

90秒のゲージが減る暇もなく、タイルを消すたびに時間ボーナスを飲み込んで暴走し続ける現場です。

自動プレイBotが時間を無限回復して終わらない実際の録画映像

映像のタイマーバーを見ていただくと分かりますが、時間が減る隙が全くありません。

スコアは200点、300点とぐんぐん跳ね上がり、タイルは休むことなく弾け続け、タイマーは90秒に張り付いたままです。このまま放置すれば、一晩中コンピュータが一人で10万点を叩き出し、ブラウザのメモリがパンクするまで終わりそうにありませんでした。

結局、私は画面上部に用意していた赤い「中断」ボタンを慌てて押し、強制的にBotを止めざるを得ませんでした。


バグのおかげで学んだ貴重な教訓

開発を楽にするために作ったツールのおかげで、リリース前に重大な設計上の欠陥を洗い出すことができました。

もし将来、人間離れした超人的な動体視力を持つ凄腕プレイヤーが現れたらどうなるでしょうか。1秒に5コンボを叩き込み続け、永遠にゲームを終わらせずにサーバーを占拠してしまうかもしれません。想像しただけでも冷や汗が出ます。

今回の暴走事件をきっかけに、スコアチャレンジの時間補充システムにしっかりとした安全装置を導入することに決めました:

  1. 時間ボーナスの減衰システム: プレイが長引くほど、同じ4コンボを達成しても獲得できる追加時間が少しずつ減少する仕様を検討しています。
  2. 1プレイあたりの最大ボーナス時間上限(キャップ): どれだけ操作が速くても、1ゲーム内で蓄積できる追加時間に現実的なリミットを設定します。
  3. 腕前への報酬とゲームバランスの調和: 上手いプレイヤーが気持ちよく疾走できる爽快感は維持しつつ、永久機関のような無限ループは物理的に起きないよう調整します。

デバッグ用のチートツールを作ったつもりが、ゲームエンジンの限界値をまざまざと突きつけられた有意義な1日でした。

次回の開発ノートでは、この無限ループ防止ロジックをどのようにスマートに解決したのか、実際のバランス調整についてお届けします。インディーゲーム開発者の奮闘記はまだまだ続きます!

#開発ノート#ナンバーポップ#バグ分析#自動プレイ