ポルトガル語の原文からAIが翻訳しています。レベル1をプレイ
Cloud Strike · 第1章

初飛行までの20分

Desert Strikeへのオマージュを、すべてClaudeと一緒に作りました。名前はその二つを混ぜたものです。 土曜日の正午に始めて、12:22には空を飛んでいました。

2026年9月10日 · 長文 · シリーズ第1回
20分
ブラウザで動くまで
1時間47分
最初の版まで
9
私が書いた文の数
1,240
tool use
US$ 11
実際の費用

下にあるゲーム——地形、ヘリコプター、敵、ミサイル、音、ミッション——は、 土曜日の午後に私が出した9つの指示から生まれました。

上の数字はその最初の版のものです。いまオンラインで遊べるのは、同じ着想にアート、音、 そして13ラウンドの批評を重ねたものです。

初日のCloud Strikeの砂漠
初日。砂漠全体が1.6 KBのノイズコードから生成されています—— テクスチャもアートファイルも一切ありません。

なぜこのゲームか

オマージュであり、錨でもある

1992年にDesert Strikeというゲームがありました。アイソメトリック視点で 攻撃ヘリを操縦し、弾薬と燃料を管理し、ウインチで人質を救出し、どの目標から叩くかを自分で 選ぶ。子どもの頃に遊んだゲームの一つです。

34年後、自分なりのオマージュを作りたくなりました。そしてこのゲームは 錨となるプロジェクトにもなりました——ゲーム開発、AIを使ったプログラミング、 そして一度もやったことのなかった「公開しながら進める」というやり方を学ぶための、 ちょうどよい口実です。

錨は実際の問題を解いてくれます。何かを「学んだ気になって」どこにも辿り着かない、 というのは簡単に起きます。動くか動かないかがはっきりする成果物があると、自分を ごまかしにくくなる。審判はゲームそのものです。

仕事の分け方

3つのセッションを並行して

1つのセッションでは作業しません。3つを同時に走らせ、それぞれに別の役割を 持たせています。

セッション何のためにつまり
アイデアを話す会話仕組みを考え、決める方法
制御用のセッション環境を整え、道具を作る計装
封じた隔離セッション長い自律性をもって作る生産

3つとも測りました。

どこ私の文tool use1文あたりのtool use
方法を考える28361.3
道具を作る2021810.9
ゲームを作る91,240137.8

端から端まで2桁の開きがあります。考えるのは会話です——私が1文、返事が1つ。道具を作る 段階では、指示1つにつき11歩近く進みます。生産とは、エンジンをかけて道を空ける ことです。

ゲーム全体を作るよりも、方法を考え出すほうに3倍多く話しました。


内部のしくみ

中心にある1つの関数

11ファイル、133 KBのJavaScript、ゲームエンジンなし。

noise.js決定論的ノイズ ノイズ terrain.js getHeight(x, z) すべて同じ関数を呼ぶ heli.jsヘリコプターentities.jsマップ上にあるものprojectiles.js弾とミサイルparticles.js炎と煙hud.jsパネルとミニマップ mission.js目標と区域 main.jsフレームループと後処理 input.jsキーボードとマウス audio.js合成音
11のファイル。砂色の矢印は、同じ関数を呼ぶために地形を読み込んでいる5つの モジュールを示しています。中段のモジュールはどれも隣を知りません——それらを縫い合わせて いるのがmain.jsです。これが最良の設計だとも、リファクタリングが不要だとも 思っていません。AIが生成したものそのままで、いまのところ手を入れないつもりです。

すべてはノイズから始まります。noise.jsは1.6 KB、依存関係は ゼロ。ある点を渡すと必ず同じ擬似乱数値を返す数学関数の集まりです。複数の周波数で足し合わせ ると、地形の起伏になります。

そしてすべては1つの関数に収束します。terrain.jsはその ノイズを受け取り、getHeight(x, z)を公開します——マップ上の点を渡すと、そこの 地面の高さが返ってくる。5つのモジュールが地形を読み込みますが、どれもそこから欲しいものは この関数だけです。ヘリコプターは、自分がどの高さを飛んでいるかを知るために。エンティティは、 地面に接地するために。弾は、着弾したかを知るために。パーティクルは、正しい面で弾けるために。 パネルは、ミニマップを描くために。物理エンジンもシーングラフの照会もありません—— 誰でも呼べる純粋な関数があるだけです。

そして誰も隣を知りません。ヘリコプター、エンティティ、弾、パーティクル、 パネルは同じ段に並んでいて、互いに関心がありません。それらを縫い合わせているのは、 最後に1つだけ置かれたmain.jsです。だからこそ6つのファイルを一度に、 ひとまとめに書き直しても何も壊れませんでした——どれも地形に応え続けさえすればよかったから です。

サブシステム

既製のエンジンなら箱から出てくるものが、ここではコードです。

サブシステム何をするか
地形ノイズから起伏、道、オアシス、平坦地を生成する
描画シーンを描き、ブルーム——光源からにじみ出る輝き——を含む後処理に通す
音響ローター、武器、爆発、警報を、すべてリアルタイムで合成する
パーティクル炎、煙、砂埃、破片を、使い回す固定のプールから出す
弾道、射程、そして地面と目標への当たり判定
エンティティレーダー、対空砲、戦車、ジープ、兵士、人質、補給箱、着陸地点
ミッション目標、集計、そして勝利条件
入力キーボードとマウス。照準はワールド内のカーソル位置から導出する

組み上がる過程を分単位で

土曜日、12:02

以下は、後からテーマごとに整理し直したものではなく、実際に生まれた順番です。ファイルの 更新時刻とセッションのログをそのまま使いました。文字どおり、ゲームが自分で組み上がって いく様子です。

12:07 — index.html、8 KB
骨組み。1ページ、全画面の<canvas>1つ、そして3Dライブラリを 指すインポートマップ。まだ何も起きません。
12:08 — noise.js、1.6 KB
砂漠全体がここに住んでいます。オクターブで足し合わせた決定論的ノイズ—— ワールドのどの点の高さを尋ねても、関数は常に同じ値を返し、何も保存しません。ほぼすべての プロシージャル地形はこう動きます。ディスク上に高さマップはなく、あるのは式です。 6分目に書かれ、その後一度も触られていません。
12:08 — audio.js、5.5 KB
音も6分目。このゲームには音声ファイルが1つもありません。 ローターの唸りは純粋なホワイトノイズで、低域だけを通すように濾し、そのうえで矩形波によって 毎秒13回刻んだものです。それだけ——ランダムな雑音を、リズムで切る。あとは耳が組み立てて、 ヘリコプターの音として聞こえます。武器も、爆発も、ロックオン警告も、同じ場所から出て います。
12:22 — ゲームが動く
最初の一文から20分後、ページはコンソールエラー1つ出さずに読み込まれました。 問題はもう見えています——カメラが垂直すぎる、地形に粒がない、山の影がマップ中に にじんでいる——それでもこれはゲームです
12:23 — 最初の良いバグ
ゲーム内の時間が止まります。原因は、痛い目を見て初めて覚えるたぐいのもので した。ブラウザはタブが見えていないあいだフレームを描きません。次のフレームを 要求する関数が、そもそも呼ばれないのです。直し方は、シミュレーションを手で1歩進める見えない ボタンを用意すること——これが偶然、このプロジェクトで最も役に立つテスト道具になりました。
12:23 – 12:26 — テスト
移動、射撃、戦闘。続いてウインチ、着陸地点、対空ミサイル。本物の欠陥が1つ 浮かびます——照準が、実際に狙う代わりに緊急モードに落ちてしまう。
12:47 – 13:11 — ミッション、ヘリ、弾、操作
ミッション(目標、区域、道)、慣性とロールを持つヘリコプター、弾、そして キーボードとマウスの処理。4ファイル、36 KB。
13:39 – 13:40 — パーティクル、エンティティ、HUD、地形
最後の全体調整。entities.jsだけで40 KBあります。レーダーとは何か、 対空砲とは、兵士とは、人質とは、指揮所とは何かを知っているファイルです。これが世界 です。
13:42 — build.mjs、1.4 KB
30行のバンドラが、すべてを218 KBのHTMLファイル1つに縫い合わせます。 ファイルを1つダウンロードし、ブラウザで開き、遊ぶ。インストールもサーバーも要りません。
初日の着陸地点
初日の砂漠上空の低空飛行
初日のゲーム:着陸地点と低空飛行。見えているものはすべてコードで生成された ジオメトリです——読み込んだ3Dモデルも、テクスチャもありません。

技術スタック

最初に1つだけ制約を課しました。ブラウザで、3Dで、何もインストールせずに動く こと。その結果、ウェブ用の3Dライブラリと素のJavaScriptになり、ゲームエンジンは 使いませんでした。ビジュアルエディタなし、既製の物理なし、既製のパーティクルシステムなし ——すべて手で書いています。

第1章にとっては正しい判断でしたし、どこかの時点でおそらく間違いになるでしょう。


品質のエンジン

作る側は裁かない

AIと並んで作ることの問題は、AIが同意してくれることです。爆発を頼めば爆発を作り、 そしてAI自身がそれを素晴らしい出来だと思っています。作る者が評価も兼ねると、基準は下へ滑っていき、すでに 出来ているものの高さで止まります。

そこで、gauntlet loop——作る者と批評する者を向かい合わせに置き、毎周とも文脈を 真新しくするという発想——に倣って、役割を分けました。一方に作る者。もう一方に、 コードを一度も見たことがなく、何を試したかも知らず、並べた2枚の画像だけを受け取る 批評者——私のものと、品質の参照。問いは1つ、どちらが優れているか、そしてなぜか、 観点ごとに別々に。パレット。光。動き。シルエット。カメラ。観点ごとに判定が下ります。

基準についての注記

批評者に渡した参照は、目標ではありませんでした。あれは方向を与える計器 です。評価者にとっては「これは良い」と言うより、「パレットが単色だからこちらが劣る」 と言うほうがはるかに易しい。比較は、具体的で手の打てる批評を生むために存在します。

最初の視覚的判定は容赦のないものでした——5観点対0で私の負け。しかも 有益でした。名前がついていたからです。単色のパレット、太陽が高すぎて露出が飛んでいる、 平べったい爆発、動きを先読みしすぎるカメラ、視覚的な目印のない敵。

並行して走っていたゲーム性の批評者は、より優しく、そしてより厳しいものでした。

操作感  ·  勝ち
資源、輸送、武装、ミッション  ·  引き分け
戦闘の駆け引き  ·  負け対空ミサイルが回避不能、8回中0回

2人の批評者が挙げた6つの欠落は、6ファイルにまたがって一度に直しました。その途中で つまずきが1つ。モデルの安全フィルタがコマンドの1つを拒みました——よりによって、空の色と 陽光の色を変えるものでした。1文字も変えずに送り直したら、35秒後に通りました。

避けられなかったミサイル

2ラウンド目、批評者は意見ではなく測定値を持って戻ってきました。「DODGE!」の警告が 着弾の0.20秒前に出る——そこに人間の反応時間は存在しません——回避動作の 再使用待ちが2.2秒で、3発斉射をしのげない。さらに2種類の敵兵器はまったく警告を 出していませんでした。

3つの数字、3つの修正。次のラウンドでは猶予0.62秒、6回中6回の回避、そして3発斉射を 生き延びた。回避不能から公平へ、2回の反復で。しかもそのどれ1つとして私が 始めたものではありません。私は見てすらいませんでした。

最初の2ラウンドで負けていたカメラは、3ラウンド目で引き分けに持ち込み、そこで止まりました。 目標達成、観点は固定、以後誰も触りません。

どこで止まったか

「砂が一色、棒付きキャンディの木」

5ラウンドを経ても、4つの視覚的観点が動きませんでした。パレット、光、動き、シルエット。 そして私が何を試したかを知らない批評者は、回を追うごとに正確な言葉で同じことを言い続け ました。

「砂が一色」  ·  「棒付きキャンディの木」  ·  「ブロックの兵士」
「敵の種別が、地面の色付きリングでしか見分けられない」

正しい指摘でした。この記事の最初の画像をもう一度見てください。一色の砂漠に、潰れた緑の 球でできた茂みが生えています。

そしてここで、この章で最良だったと思う判断が来ます——やめる、という判断です。

ある観点が3ラウンド続けて収束しないとき、規則は基準を下げるのではなく原因を 報告することです。ここでの原因は構造的で、後から見れば明らかでした。 プロシージャルなコードでアートを生成して、視覚的な豊かさには到達できない。 どのラウンドも、求められた結果を出す手立てを持たない系のパラメータをいじっていたのです。

そこでループは自ら止まり、4つの観点すべてに「手立てがないため停止」と記録し、問題を私に 返しました。開始から1時間47分後、私の手元には遊べるゲームと、何が足りないかの正直な診断と、 記録の中に嘘が1つもない状態がありました。


中断

道具を作るための2時間半

診断は、アートを作る手立てがない、というものでした。ゲームはおよそ12時間止まりました—— その一部は私が眠っていた時間です——そしてその窓の中で、2時間半の連続作業アセットのパイプラインを組み上げました。依頼(「継ぎ目なく並ぶ砂漠の地面」、 「背の低いヤシの木」、「軍用車両」)を受け取って、出来上がったファイルを返す部品です。 自由に使えるアートのライブラリから取ってくるか、注文に応じて生成し、出どころを記録します。

そして「私が組み上げた」は言葉の綾です。夜通し働いたのはClaudeでした。yolo modeで 解き放たれ——一歩ごとに私の許可を求めて止まることなく——他に何も巻き添えにせず失敗できる 隔離された砂場の中で。

その前に、決定的な一歩がありました。本物の視覚的参照を集めに行くことです。 「きれいにして」とは頼めません。けれどもジャンルの画像を集め、そこからパレットと光の向きを 取り出し、それを作業の材料にすることはできます。後から出てきた品質のかなりの部分は、 画像を集めたあの退屈な30分に生まれています。

そして、私には予測できなかった失敗が1つありました。生成したテクスチャの背景を切り抜く ために、そこを純粋なマゼンタで塗るよう生成器に頼みました。自然界のどこにも現れない色で、 まさに後から見つけて消しやすいからです。返ってきたのはほぼ純粋なマゼンタ でした。

目には同一。厳密な色の値を探していた切り抜き処理にとっては、マゼンタなど存在しません でした。何も消えず、どのテクスチャも派手な長方形に囲まれて出てきます。直し方は、色を 仮定するのをやめ、各画像の縁で測るようにすることでした。

これは、生成器の上に自動化を重ねたときにだけ現れる失敗です。人間が判断することは正しく 当て、機械が要求することを外す——そしてその2つの隔たりは、機械が壊れるまで目に見えません。

前と後

砂漠が質感を得る

道具が整い、ループが再開しました。13ラウンドの批評、17枚の生成テクスチャ、そして箱の 代わりに入ってくる本物の3Dモデル。

同じ軍事基地を、工程の3つの時点で。

基地、アセットを入れた最初のラウンド
基地、中間のラウンド
基地、最後のラウンド
左:最初のテクスチャが届いたところ。中央:地面と建造物に変化が出てきたところ。 右:章の終わりの状態。

そして対空砲——さきほど回避不能だったのと同じもの——の前と後。

対空砲、前
対空砲、後
同じ目標、同じ角度、ラウンドを隔てて。
オアシス
レーダー施設
章の終わりのオアシスとレーダー施設。

動いているところ

爆発する対空砲
被弾する兵士
評価ラウンド中に取られた実際のフレーム——対空砲の爆発と、被弾した兵士。
誰かが見ていたからこそ出てきた6つの欠陥

ラウンドを重ねるなかで、6つの静かなリグレッションが捕まりました。基地が爆発の火球を隠して いた。フィルタが炎のフレームを暗くしていた。戦闘の途中でパーティクルのプールが尽きていた。 画像の撮影中に手榴弾が炸裂していた。コードの行末コメントが誤って行を飲み込んでいた。そして エンジンがポリゴンの裏面を捨てるせいで、火球の半分が消えていた。どれ1つ ゲームを壊してはいません。どれもが、フレームごとに見ている評価者がいたから浮かび上がり ました。


勘定

16ドル

最初からすべて記録してあったので、勘定は1行ずつ合います。

 方法道具ゲーム合計
私の文2820957
機械の応答32152564748
tool use362181,2401,494
実作業時間2.4 h4.3 h8.7 h15.4 h
処理したトークン≈ 370M

そして費用。誤解を招かないために2行必要です。

US$ 16
実際に払った額
(サブスクリプションの按分)
US$ 822
従量課金のAPIなら
かかっていた額
52×
その差

月額のサブスクリプションはUS$ 200です。それを週で按分し、自分の総消費のうちこの章が 占めた割合を測りました——34%。16ドルになります。もう一方の数字は、同じ作業を従量課金の サービスとして請求した場合の額です。


耳に入る細部が1つ。無線で、ヘリコプターはSandstormと呼ばれます。 これは化石です。ゲームの最初の名前がそれで、同名の公開済みゲームがあると知るまで使って いました。名前は変わり、コールサインは残りました。


ゲームが出来上がったあと

仕事のもう半分

ゲームは1時間47分で遊べる状態になりました。それを誰かが開ける場所に置き、どう作ったかを 語るには、4日間と35.9時間の作業がかかりました。

その部分が前の節の数字に入っていないのは、別のことを扱っているからです。自分の機械で 動くフォルダを、見知らぬ誰かの機械で開くものに変えること——そしてそのあと、中で何が起きたかを 説明すること。

itch.ioで遊べるようになるまで4つの版

ゲームはもう動いていました。ファイルを開けば遊べる——私はこの章のあいだずっとそうやって 遊んでいました。公開するのに4回かかりました。

v0.1.2  ·  最初のアップロード
v0.1.3  ·  プレイボタンが404を返した — itch.ioのサーバーはフォルダのアドレスを解決しない
v0.1.3  ·  誰が開いてもポルトガル語で始まった
v0.1.4  ·  itch.ioの枠の中ではマウスホイールが後ろのページをスクロールし、キーボードに焦点が移らず、画面が黒くなって安定するまで震えた

最初と最後のあいだで、ルールもアートも音も1つも変わっていません。 変わったのは、他人のページの中でゲームが動くために必要なものです。

最後の項目には、ゲーム側に新しいコードが要りました。それがないと、itch.ioの枠の中での 最初の数秒は安定するまで震える黒い画面でした——グラフィックスカードが、 プレイの真っ最中に、描画に使う小さなプログラムをコンパイルしていたのです。直し方は シェーダの事前ウォームアップ——LOADINGがまだ画面に出ているあいだに、 全部まとめてコンパイルさせてしまう。ゲームではありふれた手法で、それをここへ連れてきたのは 公開という行為でした。

そしてその前の、誰の目にも触れない部分

何をなぜ
公開用の別ビルドテスト用のフックをバンドルから外し、3DライブラリをCDNから取らずに埋め込み、メッシュの精度を落とす
セキュリティの見直し漏れているグローバル変数なし、アドレスの読み取りなし、開発時だけの分岐の残りなし
アセットの減量プレイヤー1人あたり8.7 MBから5 MBへ——ページを開く人は、待つつもりで開いていない
ライセンスこんなに早く決める必要があるとは思っていなかった判断
2度決めたホスティングブラウザゲームにはitch.ioのほうが良いと分かって、最初の選択を取り消した
3度の改名最初の名前は公開済みのゲームと衝突し、2つ目は自分の判断で捨てた。そのたびにタイトル、開始画面、ライセンス、言語キーに手が入った
2つの言語ゲームとこの文章で、別々に決めて同じ答えに行き着いた——既定は英語、ポルトガル語はワンクリック先

減量は思っていた以上に効きました。重さが1か所に集まっていたからです。ゲームはプレイヤー 1人あたり8.7 MBで出ていて、そのうち3分の1以上をたった1つのファイルが占めて いました——兵士、3.6 MB。その中身はほとんどアニメーションでした。24本の動作 シーケンスがあり、ゲームが使うのは8本。誰も見ない16本を外し、ジオメトリを圧縮したところ、 1.4 MBまで落ちました。

空は、プレイ中には誰も見分けられない解像度で保存されていて、1.5 MBから0.5 MBになりました。 車両も合わせて、合計は5 MBに着地——そしてバンドルは、ゲームが実際に求めるファイルだけを 運ぶようになりました。どこからも参照されていない9つは、外に残りました。

そして、いまあなたが読んでいるこの前線

ゲームを公開するのは半分です。もう半分がこれ——文章と、それを載せるサイトと、 記事が私以外の誰かにとって存在するために要るすべて。

何を何が要ったか
この文章数えきれないほど書き、測り、書き直した——最初の版は、機械が書いた文章の癖をひととおり備えていた
数字セッションのログから1つずつ数えた。最初の集計は最大で4.5倍に膨らんでいて、ゼロからやり直すことになった
画像初日のゲームは、リポジトリにならなかったフォルダから回収し、当時どう見えていたかを撮るためだけに動かし直した
言語全文を翻訳し、言語ごとにアドレスを分け、同じページだと検索エンジンに伝える印を付けた
サイトドメイン、ホスティング、そして章が出るたびにまとめていくページ
計測何人が来て、何人が最後まで読み、何人が言語を切り替えるかを知ること。加えて法が求めるクッキーの告知
メーリングリストサービスを選び、フォームを作り、送ってもらったものがどう扱われるかを書く一文を用意する
アカウントitch.ioに1つ、Xに1つ、ドメインを1つ——どれも、まだ空いている名前が要った

この記事の最初の版は、いわゆるAI slopだらけでした。何かが面白いと示す代わりに 面白いと予告する文、すぐ下の数字と食い違う体裁のいい対句、本文が決して答えない修辞疑問。 「もっとうまく書いて」と頼んでも、そのどれ1つ消えません。効いたのは、悪い箇所を1つずつ つまみ出して、それぞれを規則に変えることでした——そこから出てきた一覧は、次の章以降にも 効きます。

2つ目の勘定

2つの半分——ゲームを作ることと、そのあと公開に出すこと——を同じやり方で測りました。 1列目は前の節の勘定そのもの、方法と道具とゲームの全部です。2列目はその後に来たもの—— 公開用のビルド、ストアのページ、サイト、そして4か国語のこの文章です。

 ゲームを作る
方法・道具・ゲーム
公開して語る
区切りより後
2つの合計
期間9/4 18:39
→ 9/6 19:18
9/6 23:05
→ 9/10 23:05
経過時間48.6 h96 h144.7 h
実作業時間15.4 h35.9 h51.3 h
私の文57303360
機械の応答7482,6853,433
tool use1,4942,5244,018
サブスクリプション費用US$ 16US$ 25US$ 41

金額では2つはほぼ並びます——US$ 16に対してUS$ 25。違いは、それぞれが私自身をどれだけ 必要としたかにあります。ゲームを作るのに57文、公開するのに303文。

次に来るもの

第2章、すでに進行中

この記事が出た時点で、次の章はもう始まっていました。いま作業台にあるもの。

音を本気で。初日のオシレータによる音は役目を果たしましたが、そろそろ 本物の音響エンジンの番です——イベントで鳴る音、ミキシング、そして銃がそれらしく 聞こえるかを判定する評価者。

性能。プレイヤーの機械に合わせて変わる品質段階、ジオメトリの統合、 そして運任せにせずゲームが守るフレーム予算。

アセットをもう一段上へ。実際の標高データから彫り出した地形、モデルごとの 物理ベースのマテリアル、破壊、そしてボリュメトリックな効果。

そして何より望んでいること——これをオンラインに出して、あなたに遊んでもらう こと。1レベル、ブラウザで、インストールなしで。

コードと道具について

いまのところ、コードも、使ったプロンプトも、作った道具も公開しないことにしました。 もっと先では公開するかもしれません。当面は自分の過程を共有することに集中します——論理、 判断、間違い、数字、そして舞台裏。私が語れるのはそれです。

これを追いかけたい方へ

このゲームは、間違いを見せたまま、数字を開いたまま、1章ずつ公開の場で育っていきます。 そしてあなたの声を聞きたい——コードについてではなく、ゲームについて。難易度は公平に 感じますか。ヘリコプターは思ったとおりに応えますか。この最初のレベルに足りなかったものは 何でしょう。ここから送ってください、 またはXのプロフィールで返信を。

レベル1をプレイ 次の章を受け取る