5日間の作業ログ — AIと2人でアメフトゲームを作って公開するまで
- teru44

- 12 時間前
- 読了時間: 21分
2026年7月25日から7月30日まで。実際のやり取りをほぼそのまま時系列で並べた記録。
会話の相手はClaude(以下クロちゃん)。私はコードを1行も書いていない。書いたのは要望と、違和感と、判断だけ。
この記事の書き手もクロちゃん。クロちゃんの視点で読んでもらえたら面白いと思います。
完成物:JATA BLITZ RUSH
Day 1 — 7月25日:ゼロから試合が成立するまで
【00:43 はじまり】
前日にアプデの入ったクロちゃんで何か作りたい!と思い立つ。
アンソロピック(Anthropic)が発表したClaude Opus 5は、最上位モデル「Fable 5」に迫る高性能を半額のコストで実現した主力AIモデルです。主な特徴として、自己検証能力の強化、100万トークンのコンテキスト、価格据え置きが挙げられます。
基本スペックと料金
公開日: 2026年7月24日
API料金: 入力100万トークンあたり5ドル、出力100万トークンあたり25ドル(前世代のOpus 4.8から据え置き)
コンテキストウィンドウ: 100万トークン
最大出力: 12万8,000トークン
私:「そうだ。アメフトのゲーム作ろう🏈」
これが全部の始まり。思いつきだった。
最初の確認で「ダウンシステム込みのフル骨組み」を選んだ。ここは正解だったと思う。アメフトはダウンとヤードの管理そのものがゲームなので、そこを省くと別の何かになってしまう。
【00:52 脱線(重要)】
私:「ちょ!ロモ捕まった?」
作業と関係ない。トニー・ロモ(元カウボーイズQB、現解説者)についての確認だった。結果は思ったより軽い内容で、ほっとした。
私:「びっくりしたー!飲酒運転かよ大好きな選手だったし今も好きな解説者だからかなり心配したよ!」
この脱線が、2日後に事故を起こす。後述。
【01:08 最初の試遊】
私:「ランだと簡単に相手抜けてタッチダウンまで1発だったよ。ロングパスは難しい。あとラインマンも入れた完璧な配置と人間的な動きは全部入れたい」
初期プロトタイプは「7人対7人、ラインマンなし」だった。それを11対11のフル配置にしてもらった。
ここで入ったのが、後々ずっと効くことになる物理の土台。慣性つきの移動(急に止まれない、急に曲がれない)。認識のズレ(守備は0.4〜0.7秒遅れて反応する)。ブロックの押し合いと、振り切るまでの時間。
【01:55 要望が一気に増える】
私:「割と本格的になってきたいい感じ。あとは本物のプレーコールで権利フリーなのを集めて読み込ませて沢山のコールを選べるように。エンドゾーンの更に奥が続いてるのが設定ミスなのでアウトオブバウンズをしっかり設定。時間で進み、画面から離れるとタイムアウトで場面を保存、4クォーター制にして守備側もスペシャルチームも入れたい。今まとめてもらうのはプラクティスモードの位置付けで続けましょう。レッドゾーンは詰将棋みたいで面白い」
このメッセージが実質の要件定義になった。今の完成形に入っている要素のほとんどがここに書いてある。
「レッドゾーンは詰将棋みたいで面白い」という一言が特に効いた。ゴール前は狭くて選択肢が少ないぶん、読み合いが濃くなる。あの感覚を壊さないように、以後ずっと気をつけることになる。
【03:18 守備側を作る】
私:「守備側が先だね。真逆のプレー、守備のコールもリスト作って選択できるようにしましょう!主にラインバッカーの真ん中を操れるように、パス守備2ディープとかはコーナーバックに合わせるとか。ブリッツ系のコールにはエッジを動かせるといいね」
守備は12コール。Cover 2/3/4、Cover 1 Man、Tampa 2、Cover 0 Blitz、Zone Blitz、Nickel Blitz、46 Bear、Run Blitz、Goal Line、Prevent。
コールごとに操作する選手が変わるのがポイントだった。ゾーンならMLB、2ディープならCB、ブリッツならエッジ。
【04:39 「自力でできることが少ない」】
私:「バランスは良さそう。自力でする事は少ないね、プレーコール次第なのかな。連打してオフェンスライン崩すとかブリッツの仕掛けをコントロールしたりとかできる事増えたら嬉しい」
これがこのゲームで一番大きな転換点だったと思う。
それまでは「プレーを選んだら見ているだけ」に近かった。ここから連打という操作が入る。ブロックされている状態で連打すると、振り切ってQBに迫る。ボールキャリアの近くでタップすると飛び込む(28%でファンブル誘発、外すと0.45秒動けない)。
効果は劇的だった。実測で120プレー中0サックだったのが22サックに。「自分でやった感」が一気に出た。
【05:16 iOSの罠、1回目】
私:「そしたら連打でiPhone Safariでもアップにならないように画面ロックお願い」
連打するとダブルタップ拡大が発動する。当然の話だった。ここでボタンを除外した対策が入る。
この対策を、3日後に自分で壊すことになる。
【06:11 反転表示】
私:「上下反転出来ない?あとスタート前に触ると全部オフサイドなので位置変えたり選手変えたり出来ないね」
守備のとき、自分が上から下向きに守るのは直感に反する。画面ごと180度回転させる機能が入った。
同時にプレスナップ操作も。守備側はドラッグで立ち位置を変える、タップで11人の誰でも選べる、JUMPボタンで踏み込む(早すぎるとオフサイド5ヤード)。
「フライング覚悟で仕掛ける」という駆け引きが生まれた。
【06:26 プラクティスから「試合」へ】
私:「良さそう。守備はデフォルトで反転でOK。そしたらゲーム通して作り込んで欲しい。今のはプラクティスモードとしてキープしつつ1からゲーム面を構築お願い」
ここで4クォーター制の試合モードが立ち上がる。
【08:45 負けた】
私:「ヤバ!かなり良い。そして悔しいロングパス連発で負けたよ」
自分で作ったゲームに負けて悔しがっている。いい兆候だった。
【14:14 2ミニッツのドキドキ】
私:「良い感じだった!!ちゃんとやらないと結構やられるのでスコアよりスリリングだった!あと、前後半の残り時間でダウン関係なくFG蹴る仕組み入れたい。2ミニッツのドキドキ感も出したいね。プレーのテンポは今よりほんの少しゆっくりじっくりでも良いので、ランの時は時間の進みもあり、アウトオブバウンスでしっかり時間止めてハドルを組む頭脳戦の感じも欲しい」
時計管理が本格的に入った。プレーごとに5〜7秒消費。プレー間に25〜35秒(2ミニッツは11〜18秒=ノーハドル)。時計が止まる条件はパス失敗、アウトオブバウンズ、得点、ターンオーバー、タイムアウト。タイムアウトは前後半3回ずつ。スパイクで時計を止められる(ダウンを1つ失う)。
時計が「資源」になった瞬間、ゲームの性格が変わった。勝っていれば走って時間を潰し、負けていれば外に逃げて止める。
【15:08 トーナメント化】
私:「楽しかった!とても良い!タイムアウト使わなかったけどw でも楽しく出来たし駆け引きも良い感じだしバランス良さそう。3試合勝ち続けて優勝みたいな一本道にして少しずつ難易度上げられる?かなり微調整で」
3ラウンドのトーナメントが入る。負けたら1回戦から。
「かなり微調整で」という指定が良かったと思う。急に強くすると理不尽になる。1段ずつ、ほんの少しだけ。
【23:42 難易度の確認】
私:「守備でもインターセプト奪う機会が多かったのが点に繋がったので得点も高かった印象なのでスコアだけでは見えない良いバランスに感じた👍子供も遊ぶのでむずかしすぎは避けたいので良い難易度です」
この一言で難易度の方針が固定された。以後、CPUを強くする話は出ていない。
Day 1の成果:11対11の物理、22の攻撃プレー、12の守備コール、4クォーターの試合、時計管理、3ラウンドのトーナメント、中断セーブ。
1日でここまで来た。
Day 2 — 7月26日:エンブレム地獄
ここからが本番。というか、地獄。
【07:32 1回目の事故】
Charlie(別のAI)にチームロゴを作ってもらった画像を見せた。
私:「これはアウトだよねw Charlieにロゴお願いしたんだが」
出てきたのは8頂点のコンパスローズが円に入ったデザイン。ネイビーとシルバー。
シアトル・マリナーズのロゴだった。
【07:34 手描きを渡す】
私:「手描きでこれを作って渡したのに。クロちゃん側で星と円を組み合わせて図形として作れる?」
自分で描いた図形があった。紺の円板に、5角星が白抜きで入っていて、星の先端が円のリングを突き破って5つのウェッジに分割している。
これを渡したのに、Charlieはコンパスにしてしまった。
クロちゃん側で数式から起こしてもらった。画像生成ではなく、座標計算で。
【07:41 STAR MARK STUDIO】
パラメータをいじりながらリアルタイムでマークを作れるツールを作ってもらった。頂点数、大きさ、くびれ、回転、角の丸み、円の大きさ、切り抜き幅。そしてSVGとPNGで書き出せる。
このツールが後で効いてくる。
【07:52 敵チームの色】
私:「敵のカラー 1 ワインレッドと白 2 黒とオレンジ 3 紫と黄緑 でどう?」
ここでクロちゃんが色差(ΔE)を計算して返してきた。自チームのネイビー×メタリックグリーン、芝の緑と比べて、どれも十分に離れているか。
数字で確認してから決めるという習慣が、ここから始まった。
【08:13 カウボーイズ問題、明文化】
私:「ロゴはどうしようか、と思ってる途中で送信してたw Charlie私に寄り添いすぎててカウボーイズ一筋の私好みのロゴしか作れないみたい」
自分で気づいていた。でもまだ「そういうこともあるよね」くらいの認識だった。
【10:26 ローアングルのバグ】
私:「OK1進める。あとごめん今更だけどローアングルだとエンドゾーンの奥まで続いちゃうバグ直せる?観客席とか入れたいね手順進んだら」
リプレイに疑似3Dのローアングル視点を入れたら、フィールドがエンドラインを越えて無限に続いていた。
修正して、ついでにスタジアムの観客席を追加。このときはコードで点々を打つ方式だった。
【11:22 ゴールポスト】
私:「観客席は良いですが、ゴールポストがめり込んでておかしい」
ゴールポストの寸法が、フィールドの横幅から計算されていなかった。実際の寸法(クロスバー3.33ヤード、アップライト間11.7ヤード)から引き直した。
【11:39 3D化、1回目の失敗】
Meshyでエンブレムを3D化してもらったものをGLBで渡した。クロちゃんがPythonでソフトウェアレンダリングして返してきた。
私:「ごめん、色も形も似すぎてた!」
またマリナーズだった。
Day 2の教訓:幾何学的なマークを画像生成AIに作らせるのは筋が悪い。
Day 3 — 7月27日:クレスト、芝、天候
【エンブレムを戻す】
私:「また手描き案作ってから出すので一旦これにもどして。敵チームはアルファベットで、チームの名前も入れた方が良いかも」
コンパスの3Dエンブレム(38KB)を撤去して、自作の星マークに戻した。
ついでにエンドゾーンの構成を実際のNFLに合わせた。エンドゾーン=チーム名を大きく、ミッドフィールド=マーク。
【チーム名の話】
私:「JATA Platinums プラチナムスは変?」
変だった。理由は2つ。
英語として。チーム名は複数形が基本だが、それは「人の集団」を指す名詞だから。プラチナは物質名詞なので複数形にすると座りが悪い。実際、物質・現象系の名前は単数形のまま使うのが定石だ。Miami Heat、Orlando Magic、Utah Jazz、OKC Thunder、Tampa Bay Lightning。
日本語として。「プラチナムス」は発音しづらい。
JATA PLATINUMに決定。
私:「元ネタは空条承太郎のスタンド、スタープラチナから星を取ったのがネーミング理由なので。時間を操り性格無比なフィジカル最強スタンドに影響されたチームというイメージ」
これを聞いて、クロちゃんが指摘した。この命名がゲームと噛み合っていると。
時を止める→タイムアウト、スパイク、2ミニッツの時計管理。精密動作性A→プレーコールの読み合い。スタープラチナ・ザ・ワールド→リプレイのスローモーション。
完全な後付けなのに、後付けに見えない。
そしてもう一つ。名前から星を取ったのに、マークには星が残っている。
【Charlieの再挑戦(2回目の事故)】
プロンプトを英語で組んでもらってCharlieに投げた。返ってきたのは、ネイビーの円章にメタリックに面取りされた銀の5角星。
ダラス・カウボーイズだった。
私:「これはカウボーイズすぎません?」
構造を画像で固定した型紙を作って、「星は実体ではなく空白である」と明示したプロンプトを添えて再挑戦。
3回目もカウボーイズだった。
【原因の特定】
私:「そしたら残念なお知らせw Charlieだめだ私のカウボーイズ愛が消せないw これは私がカウボーイズの話だけじゃなくて好みも伝えてるからなのかもね」
Day 1の00:52、トニー・ロモの話をしたことを覚えているだろうか。
AIは対話の履歴から相手の好みを学習する。カウボーイズの話を重ねてきた相手に対しては、「ネイビー×シルバーの星」が正解だと学習済みになっていた。だから禁止事項を書いても、より強い信号のほうに引っ張られる。
自分の愛が、自分の邪魔をしていた。
【P2の決定 — 数字で決める】
自分で手描きの新案を出した。輪郭だけの星を円に重ねて、境目を白で切る構成。
これをクロちゃんに測ってもらった。「先端が円を突き破っているか」を8パターンで振って、それぞれ24pxに縮小したときに黒い塊がいくつ残るかを自動カウント。
結果、元案は突出−11%でリング5分割・16px判別可。P2(貫通)は突出16%でリング5分割・16px判別可。P4(もっと深く)は突出44%だがリングが10分割になりNG。P5(細い線)は16pxで4つの塊に崩壊。
面白い発見があった。元案はすでに突き破っていた。星の外径は円より小さいのに、miter接合(角を尖らせる処理)で先端が伸びて、円を超えていた。ただ切れ目が細すぎて見えていなかっただけ。
P2で確定。
【クレストをコードで描く】
Charlieが3回失敗したので、クロちゃん側で作ることにした。ただし画像ではなくcanvasで毎回描画する方式。
どのサイズでも輪郭が崩れない。文字が本物のフォント。ファイルが増えない(3KBのコードだけ)。
そして何より、星が絶対に埋まらない。

そこから細かい調整が続いた。
私:「もう少しJATA文字が見やすくしたいのでネイビーの帯幅をちょっとだけ太くするか、もしくはJATAの文字の高さを下げるか」
私:「原因がネイビーの枠内にあるシルバーの円かも!これと文字が被ると読みづらいので重ならないようにしたいの」
ここで犯人が判明した。canvasのtextBaseline='middle'。あれは文字の見た目の中心ではなくemボックスの中心を基準にするので、Bebas Neueのように大文字が上に寄るフォントだと外側にはみ出す。
計算上は6.5px空いているはずなのに実際は当たっていた。大文字の高さの比率(0.697)を実測して、基準そのものを変えた。
私:「JATA文字をもう少し太字にできる?文字だけはこんなインパクトある系のフォントがいいかな」
Bebas Neueは太いウエイトを持っていない。Antonに変更した。Bebas Neueの60pxでキャップ高42px・JATAの幅80pxだったのが、Antonは54pxでキャップ高46px・幅98px。サイズを下げたのに、高さも幅も増えた。書体を替えるとはこういうことだった。
私:「リボンの中のPLATINUMの文字をリボンのカットに合わせて上を広く、下を狭く、立体感のある文字の角度にできる?」
canvasは台形変形を直接サポートしていないので、文字を48本の横スライスに切って、各スライスの横幅を変えて貼り直す方式で近似した。上1.06倍→下0.90倍。
【芝】
自分で生成した芝のテクスチャを渡した。
私:「芝は良い感じにできた。3D化はどうする?」
3D化しないほうがいいという回答だった。芝は平面のテクスチャなので、Meshyに投げると凹凸のあるメッシュを作ろうとして破綻する。
加工は3段階。刈り目の縦縞を除去(ゲーム側で描くので二重になる)。色をゲームの芝に合わせる。タイル化(12通りの切り出しを試して継ぎ目が最小の組み合わせを自動選択)。
ここで一度失敗している。縮小したら520バイトまで潰れて、ただの緑一色になった。原寸から切り出す方式に変えて解決。
【天候】
私:「夜空も入れたい!ローアングルの場合。あ、デーゲームとか天候も入れるとしたら昼、夜、雨、雪4種くらい作る?」
作った。ただし見た目だけで終わらせなかった。
DAYは青空で補正なし。NIGHTは星空(コード描画)で補正なし。RAINは雨雲+雨脚150粒で捕球0.80倍・加速0.95倍。SNOWは雪雲+雪片110粒で捕球0.90倍・加速0.86倍。
実測すると、パス成功率は晴れ62%、雨53%、雪43%。ラン平均は晴れ5.1ヤードに対して雪5.6ヤード。
「雪の日は走れ」が数字として成立した。同じプレーブックなのに最適解が変わる。
なお、依頼した空の画像はスタジアム込みの構図で返ってきた(空だけと頼んだのに)。空の部分だけ切り出して使った。5枚で合計23KB。
【5ステージ化】
私:「ステージ増やします!1stラウンド(ワイルドカード)、2ndラウンド、クォーターファイル、セミファイナル、ファイル。ファイルはドーム球場にします!」
WILD CARDはRIVERSIDE RAIDERSと昼の試合。2ND ROUNDはGRANITE WOLVESと薄曇り。QUARTERFINALはGOLDEN LANCERSと夜。SEMIFINALはHARBOR SENTINELSと雨。FINALはIRON CROWNSとドーム。
ドームは天候が無効。屋内なので捕球+2%、加速+2%、ファンブル−20%。「天候の言い訳は効かない」という設定にした。
ドーム内観の画像も自分で生成して渡した。屋根から観客席まで1枚に入っていたので、地平線をまたいで全域に敷く方式にした。
【ファンブル】
私:「ランでゴリ押せるのは大好きですが、ファンブルを現実の確率くらいの低確率で入れて、雨と雪はそれぞれ更にファンブル率増えます」
NFLのラン1回あたりのファンブル率は約1.5〜2%。それに合わせた。
1プレーあたり、通常1.3〜1.8%、ドーム1.0〜1.4%、雪2.5〜3.3%、雨3.1〜4.2%。快走中は1.35倍。大きく走るほどリスクが増える。
ここでサンプル数の教訓があった。200回で測ったとき雨4.5%という数字が出て、設定値より高かった。700回に増やしたら2.3%に落ち着いた。低確率の事象は桁を上げないと判断を誤る。
Day 4 — 7月28〜29日:拡張と、捨てる判断
【エスカレーター事件】
私:「フィールドと観客席の間が矛盾してて、エンドゾーンが見えないところからのリプレイだとエスカレーターみたいに隙間からフィールド出てくる感じ(分かるかな?)」
分かった。この表現が完璧だった。
原因は、芝の描画を「カメラから42ヤード先」で打ち切っていたこと。エンドラインで切るべきところをカメラからの相対距離で切っていたので、境目がカメラと一緒に動いていた。
修正前は境目が常に403pxで固定されていた。地面だけがスライドして見えるわけだ。修正後はボール位置に応じて460pxから326pxまで正しく変わる。
直し方はyFarの計算を1行変えるだけ。原因の特定が9割だった。
【PC操作】
私:「ゲームUIに戻りましょう。PC操作だとどうなってます?矢印で動かしたい。」
キーボードが完全に未対応だった。追加した。
矢印キーとWASDで移動。Spaceで場面ごとの主要アクション。1〜4でレシーバーへパス。Enterでジャンプ/次へ。Tabで操作選手の切り替え。
パスだけは工夫が要った。タップと違って「誰に投げるか」を指せないので、キーボードを使うとレシーバーの頭上に番号バッジが出るようにした。しかも空き具合の色で枠が光る。
【ピンチズームと、iOSの罠2回目】
私:「リプレイの動画をピンチインピンチアウトでアップと引きに出来たりする?」
0.7〜4.5倍のピンチズームとパンを実装。
そして事故った。
私:「ズームしたあとの挙動がスマホだとおかしい。画面タップで一時停止と再生以外の他のボタン効かなくなる」
iOSはtouchstartでpreventDefault()すると、clickイベントを生成しない。ピンチを自前で扱うために全域に効かせたら、CAMも速度も閉じるボタンも死んだ。
Day 1の05:16で同じ対策を入れていたのに、同じ罠を踏んだ。過去の自分の対策を読み返すべきだった。
【ストリップサックと連打ガード】
私:「出来ればQBサックの時もファンブル実装ありでお願いしたい。サック自体が確率低いのでビッグプレーになると盛り上がりそう!連打からのサック気持ちよく決まった時あったんだけど、連打した勢いでリプレイとか次のプレーとかすっ飛ばしちゃうからサック後とかは連打をそっちで止めてもらえると嬉しい」
両方入れた。
ストリップサックはサックの10%。400プレー回して361サック中39回で、ちょうど10%。NFLの実測が10〜12%。
連打ガードは、プレー終了後650ミリ秒・リプレイを開いてから700ミリ秒の入力無効化。
【FGの確率カーブ】
私:「FGは距離で確率変動出来る?」
もう距離で変わってはいたが、30/40/50ヤードの4段階しかない階段状だった。NFLの実測に沿った15点の曲線に作り直して補間するようにした。
25ヤード98%、33ヤード94%、43ヤード84%、52ヤード68%、60ヤード40%。いずれもNFL実測とほぼ一致。
天候も効く。42ヤードでドーム88%、通常85%、雨78%、雪75%。
そしてプレーコールのボタンに成功率が表示されるようにした。「ここで刻むか、蹴れる位置まで進むか」の判断材料になる。
エクストラポイントも同じカーブに乗せた。15ヤードからのスナップなので33ヤードのFG相当で94%。
【チーム選択と6チームの紋章】
私:「チーム選びも可能になる?デザインも全チーム揃えないとね!」
同じ骨格(円板+輪郭の星をくり抜く)で、頂点数と配色だけ変える方式で6チーム分を作った。
JATA PLATINUMは5頂点でネイビー×オフホワイト。RIVERSIDE RAIDERSは6頂点でワインレッド×白。GRANITE WOLVESは4頂点(45度回転)でスレート×クリムゾン。GOLDEN LANCERSは4頂点・細身でオーカー×黒。HARBOR SENTINELSは8頂点でブラック×オレンジ。IRON CROWNSは7頂点でパープル×黄緑。
全チーム24pxで分割が生き残ることを実測で確認。

【チーム能力】
私:「チームのパラメータを変えられる?JATA PLATINUM ランとラン守備が強い、RIVERSIDE RAIDERS パスとパント強い…みたいな」
7項目の能力値を持たせた。見た目だけでなく実際の判定に効かせた。
実測(各700回)のパス守備では、同じ攻撃を守らせてGRANITE WOLVESが相手パス成功率18%、HARBOR SENTINELSが22%、IRON CROWNSが46%。
ここで一度失敗している。パス能力を「送球のブレ」に掛けたのに、まったく差が出なかった。
ショートパスは送球のブレがほぼゼロなので、掛けても意味がなかったのだ。「タイトなカバーでも捕れるか」に効かせ直したら、31%〜47%というはっきりした差が出た。
【オーロラ】
私:「バランス的にピンクとグレーか濃いピンクと水色にどこかのチーム変更できる?ハマらない?」
色差を測って、濃いピンク×水色を選んだ。ピンク×グレーはΔE61、濃いピンク×水色はΔE93。
どのチームに当てるかは色的にはどこでも良かったので、テーマで決めた。選んだのはGOLDEN LANCERS。このチームの特性は「悪天候に強い」。
濃いピンクと水色はオーロラの色であり、寒空の現象だ。名前をAURORA LANCERSにしたら、配色(ピンク×シアン)、チーム名(オーロラ)、能力(雨雪に強い)、この3つが全部つながった。しかも紋章が4頂点の細い針なので、槍にもオーロラの光条にも見える。
私:「完璧!良い配色バランスになった!」
【サウンド】
音声ファイルを一切使わず、Web Audioで全部合成した。
観客のざわめきはノイズをバンドパスに通したループ。タックルはノイズバースト+低い衝撃音。ホイッスルは2音のトライアングル波。タッチダウンは歓声+ソウ波の3音アルペジオ。
そして不評だった。
私:「歓声がずっと鳴ってる?これは不快なので、プレー中は消す。相手攻撃にブーイングするとしたらプレー前だけです。ビッグプレーでも歓声。他は静かですよアメフトは。」
その通りだった。
プレー中は無音。相手の攻撃・スナップ前はホームの大歓声。スナップの瞬間に消える。ビッグプレーは湧いて1.6秒で静まる。
静かな中でスナップ前だけ沸くという緩急が、アメフトらしさそのものになった。音は「鳴らす設計」より「鳴らさない設計」のほうが効く。
【ハイライト集】
TD・INT・ファンブル・サック系を自動記録して、試合終了後に連続再生。実測で1試合8本、メモリ331KB。
ここでバグを出した。
私:「リプレイの後、進めなくなる」
ハイライト再生の出口を作り忘れていた。結果画面を隠して再生を始めるのに、閉じたときに出し直していなかった。画面上のボタンが全部消えて、何も押せない状態。
【All-22の撤廃】
リプレイ中に各レシーバーのルートを線で描く機能を作った。
うまくいかなかった。
私:「プレーの軌道、ルートではなく方向を指すのが殆どであまり意味をなしてないので無くてもいいかな。」
作り直した。今度は実際に走った軌跡を描くようにした。
私:「直ってないね!リプレイ無くなった!てかこれ要らない!A22撤廃。そこまでトークン使う機能じゃない」
撤廃した。
ルートを見せるにはプレー全体を止めて俯瞰で眺める必要があるのに、このゲームのリプレイは「決定的な瞬間に寄る」設計だった。目的が正反対だった。
私:「ついでの追加機能と思っていたのですが、多分予想より複雑な処理なので英断だと思います!自画自賛?笑」
自画自賛していいと思う。作ったものを捨てる判断が一番やりにくい。
【最後の細かい直し】
私:「ザルは流石に可哀想wwww『守備力は課題』とかにしてあげようw」
IRON CROWNSの説明文が「攻撃は最強、守備はザル」になっていた。クロちゃんが書いた。「守備力は課題」に変更。
同時に、タイトル画面が「3連勝で優勝」のままだったのも発覚。5ステージに増やしたときの直し漏れだった。今回はラウンド定義から自動生成するようにした。
Day 5 — 7月30日:公開
引き継ぎ用のZIPを作った。本体のjata-blitz-rush.html、仕様書のHANDOVER.md、記事素材のdevlog.md、回帰テストやクレスト書き出しツールなどのtools一式、クレストと紋章一覧のassets。
これをコーディ君(ローカルのコーディングエージェント)に渡した。
コーディ君の仕事は、タイトル画面の縦スクロール対応(チーム選択を足したぶん縦に伸びて、小さい画面で下のボタンに届かなくなっていた)、各画面に「◀ TITLE」を追加、次へ進む操作に「▶」を追加、途中保存データの整理。そして390×664表示・トーナメント復帰・回帰テスト8/8・本番HTTP 200・ブラウザエラー0を確認。
公開完了。
まとめ — 5日間で学んだこと
【完成物】
形式は単一HTMLファイル。サイズ246KB。コード3,241行(うちJavaScript 3,004行)。関数154個。埋め込み画像8枚で105KB。外部依存はGoogle Fontsだけ。音声ファイルはゼロ。
【1. AIに向く仕事と向かない仕事】
向くのは、質感(金属・芝・空・観客席)、世界観・雰囲気、大きく見せる絵。向かないのは、幾何学的に正確な形、文字が入るもの、小さく使うマーク。
芝、夜のスタジアム、4種類の空、ドームの内観 — これらは生成AIが圧倒的に良かった。素材として最高で、マークとしては最悪。
【2. 「なんとなく」を全部潰す】
このプロジェクトで一番効いたのは、感覚で決めずに毎回測ったことだと思う。
FG成功率は各3000回で検証。ファンブル率は700回(200回では誤った結論を出した)。チーム能力は各700回。紋章の視認性は24pxでの塊の数を自動カウント。配色はΔEで既存色との距離を測定。
目視では絶対にできない品質管理。
【3. 違和感を言葉にできるかどうか】
うまくいったパターンは共通していた。こちらが「何が変か」を言葉にする。AIが原因を数字で特定する。直したあと実測で確認する。
「エスカレーターみたいに隙間からフィールド出てくる」「歓声がずっと鳴ってて不快」「線が方向しか指してない」
この解像度で言えれば、だいたい直せる。「なんとなく良くして」では絶対にこうならなかった。
逆に、AIに丸投げして失敗したのがロゴだった。あれは「何が正解か」を言葉にできていなかった。
【4. 自分の好みがAIを歪める】
Charlieがカウボーイズから離れられなかったのは、私がカウボーイズの話をしすぎたから。
AIは対話の履歴から相手の好みを学習する。それは長所でもあるが、「今回はそれを避けたい」というときに裏目に出る。
同じAIに全部やらせるのではなく、文脈を持っていない場所で作らせるという選択肢を持っておくべきだった。
【5. 同じ罠は2回踏む】
iOSのtouchstartでpreventDefault()するとclickが死ぬ問題。Day 1で対策していたのに、Day 4で自分で壊した。
過去の自分の対策を読み返す。引き継ぎ書に「既知の落とし穴」の章を作ったのはこのためだ。
【6. 捨てる判断】
All-22分析ビューは、作ってから撤廃した。
直しても直しても別のところが顔を出すときは、だいたい機能そのものが土台と合っていない。直し続けるより捨てるほうが早い。
まだ終わっていないこと
チームマスコット — 6チーム分。おおぐま、ケルピー、フェンリル、ヴァルキリー、アルゴス、バジリスク。モチーフだけ決めてある。
優勝画面にクレストとトロフィー。FGブロックを実プレー化。パントリターン、キックオフリターン、オンサイドキック。
手描きの星から始まって、URLが立つところまで5日。
マスコットが揃ったら、また続きを書く。
JATA BLITZ RUSH — プレイはこちら




コメント