テストは通っていた。人間が遊んで見つけたもの。Claude Codeと作る軍人将棋【第3回】

テストは通っていた。人間が遊んで見つけたもの。Claude Codeと作る軍人将棋【第3回】 ゲームを作らせてみた

前回は、CPUと人間の「覚えていられる情報」の差から、盤上の事実で確定した駒だけを表示する「判明」を加えた1.1.1までの話でした。

Claude Codeは、作るたびに大量の自動テストを回します。この時点でチェックは200万件を超えていました。ゲームのEXEを起動して最後まで自動で対局し、画面のスクリーンショットまで確認します。

それでも、私が遊ぶと問題が出てきます。今回は1.2.0から、スマートフォン版を加えたリリース候補1.3.0までの話です。画面が暗くなって戻らない。効果音が一度も鳴っていない。「閉じる」が真下のボタンに吸われる。そして、ルールの穴がひとつ。

※Claude Codeは、ファイルの作成やコードの実装・テストなどをAIに任せられるAnthropicの開発ツールです。今回はモデルにClaude Opus 5.5を使いました。詳しくはClaude Codeとはをご覧ください。

再現手順の分からない不具合を、ログから突き止めた

1.1.1の研究モードで遊んでいたとき、画面がおかしくなりました。

1.1.1の研究モードで、盤以外の画面が暗くなり、左右のパネルが消え、上部のボタンの一部だけが残っている

盤の周りが暗くなり、左右のパネルが消えています。外部チャットに書けたのは、これだけでした。

条件がわからんがバグった。分かる範囲で言うと研究モードでなんかをポチった。配置変更できるから完全フリーズじゃない、右上のボタンは無反応

何を押したか覚えていません。再現手順としては最悪の報告です。

これを1.2.0の修正項目の一つとして渡しました。Claude Codeは、まずコードを読んで原因を探しましたが、それだけでは特定できませんでした。そこで、私が遊んだときにUnityが残していた実行ログを確認しています。

原因は、そのログにありました。思考モニターで過去のTURNの判断を表示したまま新規対局を始めると、まだ存在しない判断を参照して、画面を描くたびにエラーが起きていました。ログには、このエラーが41,262件記録されていたそうです。描画の途中で止まるので、暗い背景だけが残り、ボタンも反応しなくなります。盤のクリックは別の処理なので動いていました。

Claude Codeは原因を直したうえで、画面の描画でエラーが起きても入力の状態を元に戻し、記録を残す仕組みを加えました。自動検証には、同じ手順の再現と、初期配置と対局中にそれぞれ160回ずつ画面操作をランダムに繰り返すテストを追加しています。

音が聞けないAIが作った効果音は、鳴っていなかった

1.2.0では、配置プリセット、設定画面、経過時間、戦闘の演出、効果音などをまとめて追加しました。

効果音は、外部の素材を使わずに作ってもらいました。Claude Codeは、木の駒が盤に当たる乾いた音を、スクリプトで合成しています。駒を選ぶ「コッ」、置く「コトッ」、ぶつかる「カッ」、倒れる「カタン」などです。

Claude Codeは作業ログに「音が聴けない分」と書き、生成した音の波形とスペクトルを画像にして、減衰の長さや音の高さを確かめていました。その結果、選択音は「音程感が強い」と判断して、減衰を短くしています。自動検証では、効果音の再生が画面の動きと同じタイミングで始まることを、演出の種類と速度の6通りで確認していました。

完了報告の「未確認・注意点」には、こうありました。

効果音は人の耳では聴いていません。波形・スペクトル、生成の再現性、映像との同期は確認済みなので、実際の音色は一度お聴きください。

聴いてみました。何も聞こえません。

エクスプローラーで開いたAssets/Generated/Resources/Audioフォルダー。sfx_clash、sfx_end、sfx_place、sfx_select、sfx_toppleのWAVファイルが並んでいる

生成された効果音のファイルです。ここから直接再生すると、ちゃんと鳴ります。

リソースのwavは音が鳴る。ポップな木琴で審議あるがそれはまた別の話。OBS起動して音声ミキサー拾ったが外部サウンドは反応する。駒動かしたときなどはへんじがないただのしかばねのようだ

ファイルは鳴る。PCの音も出ている。ゲームを動かしたときだけ、配信ソフトのOBSの音声ミキサーまで無反応です。

Claude Codeは、ゲームの中の音の出口を疑いました。Unityでは、音を聞き取る役目の部品(AudioListener)がないと、何も出力されません。このゲームはカメラをプログラムの中で作っていて、その作り方ではこの部品が付かず、シーンにもありませんでした。

面白いのは、修正の前に診断用の機能を足して、原因を確かめてから直したことです。Unityが実際に出力している音の大きさを測る機能を作り、修正前と修正後で比べました。

項目 修正前 修正後
音を聞き取る部品(AudioListener) 0個 1個
効果音を直接再生したときの出力の最大値 0.0000 0.2079
駒をクリックしたときの出力の最大値 0.0000 0.2079
音量100%/50% 0/0 0.459/0.229

1.2.0のテストが確かめていたのは、効果音の「再生の要求」が正しいタイミングで出ていることでした。その要求が実際に音になって出てくるかは、見ていなかったわけです。Claude Codeも報告で、その点を認めています。

1.2.0 の同期テストは「再生要求が正しいタイミングで出たか」しか見ていませんでした。ご指摘どおり、可聴な出力は保証していませんでした。

以後の自動検証には、音を聞き取る部品がちょうど1つ有効であることの確認が加わりました。1.2.0の検証記録の書き方が、出力まで確かめたように読めることも自分で指摘し、訂正を予定に入れています。最終判定は、やはり人の耳でお願いします、とのことでした。

なお、このときの修正では、200万件を超える全テストの実行を省いてもらいました。変更は音まわりだけなので、全体の確認はリリース候補の段階でまとめて行うことにしています。

「閉じる」が、真下のボタンに吸われた

1.2.1の設定画面で、今度はこうなりました。

1.2.1の初期配置の画面で設定パネルを開き、「閉じる」にカーソルを合わせている。パネルの裏には初期配置用のボタンが隠れている

明らか不具合。上の添付画像、対局開始前に設定を開いて閉じるを押すと盤面ランダム変更になる。コンパネ外のここをクリックしたら閉じる。閉じるの真下はおまかせ配置ボタン。

設定パネルの「閉じる」を押しても、クリックがパネルの裏に隠れている「おまかせ配置」に吸われてしまいます。パネルは閉じず、自分の駒の配置だけが変わります。「閉じる」が効くのは、カーソルの下におまかせ配置がない位置を押したときだけでした。設定の別のボタンでも、裏にあるCPUの強さのボタンが押されました。同じ確認の中で、あそびかたを開いている間に裏の「研究モードへ」が押せてしまう、盤面の操作も通ってしまう、という同じ種類の問題も見つかりました。

このゲームの画面は、UnityのIMGUIという仕組みで作られています。IMGUIでボタンが重なると、クリックを受け取るのは見た目で上にあるボタンではなく、プログラムの中で先に処理されたボタンです。後から重ねて描いた設定パネルは、それだけでは裏のボタンへのクリックを遮りません。

IMGUIにも、表示している間はほかの入力を止める専用の窓(GUI.ModalWindow)はあります。ただ、当時のこのゲームの画面はそれを使っておらず、入力を止める処理もありませんでした。盤面の操作も、パネルの四角を避けるだけでした。

修正では、設定やあそびかたなど、手前に出る画面を登録すると、最前面の画面だけがクリックを受け取るように作り直しました。閉じるクリックが背後に届かないよう、マウスボタンを離すまで背後の入力も止めます。

確認の方法も変えています。Windowsのマウスカーソルを実際に動かしてクリックする検証を作りました。まず、修正を無効にしたビルドで不具合を再現できることを確かめ、そのうえで修正版が全項目を通ることを確認しています。人間がクリックしたときと同じ経路で試さないと、見つからない種類の不具合だったからです。

総司令部に入られても、終わらない

ルールの穴も見つかりました。まず、1.1.1で負けた対局です。

1.1.1の対戦モードの終局画面。自軍の総司令部に敵の駒が入り、自軍には地雷2枚と軍旗だけが残っている。結果は「CPUの勝ち(相手に動かせる駒がない)」

終盤、こちらの総司令部に敵の駒が入りました。ところが対局は終わりません。総司令部を占領して勝てるのは、大将から少佐までの駒だけです。入ってきた駒は、それ以外でした。

占拠されて終わったーからのタンクなのでまだ負けじゃない。バンザイアタック繰り返して終了。

総司令部に入られても続いたこと自体が、その駒の正体の手がかりになります。最後は、こちらに動かせる駒がなくなって負けました。

次は、1.2.0での対局です。

1.2.0の対戦モード、TURN 215、経過8分33秒。自軍の損失29枚、敵軍の損失27枚。盤上の自軍は中尉と軍旗だけ、敵は4枚

こちらに残ったのは中尉と軍旗だけ。どちらも総司令部を占領できません。それでも対局は続きます。

占領出来る駒がなくなっても試合終わらない問題

当時のルールでは、手番の駒が動かせなくなるか、800手に達するか、戦闘のない状態が160手続くまで終わりません。

1.3.0で、この扱いを決めました。

  • 双方とも占領できる駒がなくなったら、引き分け。
  • プレイヤーだけがなくなった瞬間、審判が一度だけ「投了しますか?」と確認する。続行すれば、敵の動かせる駒をなくすなどの勝ち筋で最後まで戦える。
  • CPUは投了しない。

スマートフォン版で審判の確認が表示された画面。「審判より 総司令部を占領できる駒がなくなりました」「大将〜少佐がすべて失われました。総司令部占領による勝利はできません。続行すれば、敵の動かせる駒をなくすなど他の勝ち筋で最後まで戦えます。投了しますか?」と「続行」「投了」のボタンがある

のちに、スマートフォン版で実際に出た審判の確認です(後の版で撮影)。自軍の損失28枚のうち、大将から少佐までの10枚がすべて取られた時点で表示されました。このときは投了しています。

最後にもう一つ、CPUの側だけ占領できる駒がなくなっても、プレイヤーには知らせません。知らせてしまうと、CPUの残りの駒に大将から少佐がいない、という正体の情報を漏らすことになるからです。Claude Codeは、この点をルールの説明に明記しています。

スマートフォンでも遊べるようにした

1.3.0では、Android版も作ってもらいました。スマートフォンでは研究モードを載せず、対戦モードだけにしています。ゲームの本体はPC版と同じコードで、画面と操作だけAndroid用です。

PC上で縦長のウィンドウに表示したAndroid版の対局画面。上に敵軍の損失、中央に盤、下に自軍の損失と「あそびかた」「設定」「新規対局」のボタンがある

開発の途中、PCで確認した縦画面です。取られた駒は盤の上下に並びます。

実機での試験用には、手元のPixel 7 Proをつないでいました。ところが接続が不安定で、途中で切れてしまいます。Claude Codeは、途中から接続された私のGalaxy S26 Ultra(以下、S26)で、実機試験を続けました。

S26取り上げられちまった

S26では、実際のタップ、画面の回転、ホームボタンからの復帰など41項目の試験が通りました。回転を挟みながら28手進めた対局が、回転なしで進めた対局と同じ結果になることも確かめています。

S26で横向きに表示した初期配置の画面。左に盤、右にCPUの戦い方、自軍の配置、対局開始のパネルがある

S26を横向きにしたときの初期配置です。この画像は後の版で撮ったものです。右側の設定欄は指でスクロールする作りで、この画像では上下の端の項目が一部だけ見えています。横向きではPC版に近い配置になり、回転しても対局はそのまま続きます。

最後に、人間に確認してほしいことが並んでいました。

Claude Codeの報告の末尾。「既知の問題」と「Galaxy S26 Ultraで確認していただきたいこと」として、タップのしやすさ、縦横それぞれの見やすさ、効果音の聞こえ方、画面OFFや電話着信を挟んだときの一時停止と再開、対局を最後までプレイしたときの感触が挙げられている

タップの感触、見やすさ、音の聞こえ方、実際の電話や通知。自動試験では確かめきれない部分です。

S26で対局を最後まで遊び、問題なしとしました。一つだけ、駒を選んでから移動先を狙ったタップが動かせないマスに当たると、選択が解除されてしまう点が気になりました。致命的ではないので、改善候補として記録してもらうだけにしています。

S26は私が普段使いする端末です。この件のあと、開発中の試験はPixel 7 Proで行い、S26への転送は明示的に指示したときだけ、というルールを追加しました。

テストが確かめたものと、人間が確かめたもの

1.3.0の時点で、.NETのテストは31スイート、約252万件のチェックになりました。Windowsの実EXEでの自動対局、実際のマウス操作による確認、音の出力の測定、Androidの実機試験まで通っています。CPUの判断は、1.1.1から変わっていないことを毎回確認しています。

それでも、ここまでに挙げた問題を見つけたのは、人間のプレイでした。何を押したか分からない暗転。鳴らない効果音。裏まで届くクリック。占領できないまま続く対局。

見つけたあとのClaude Codeの動きも印象に残りました。ログから原因を探し、直す前に診断の仕組みで原因を確かめ、修正前のビルドで不具合を再現してから直す。そして、同じ見落としが起きないように、テストの側を増やします。

リリース候補の1.3.0は、日付が変わる直前に完成しました。スマートフォンで遊べるようになったので、あとは実戦です。次回は、スマートフォンで遊んだ対局が131ターンまで終わらなかった話です。

afさんのAIラボのトップへ

前の記事:記憶力MAXの相手に、人間は何を覚えていられるか。Claude Codeと作る軍人将棋【第2回】

次の記事:AIは間違っていなかった。長ターンにわたる膠着と審判。Claude Codeと作る軍人将棋【最終回】

ゲーム制作の一覧へ

ソース一式と最新バイナリー

AF-MilitaryShogiのソース一式と、現在の公開版はGitHubから利用できます。この記事は制作当時の記録で、最新バイナリーの内容とは異なる場合があります。Android版のAPKは配布していません。

コメント

タイトルとURLをコピーしました