画面の上から、光る羊の群れが流れてくる。引ける線は1本だけで、3秒ほどで溶ける。その1本で群れを裂いて、柵の口へ折りたたむ。堰き止めようとすると群れの圧で線が破られるので、上流で流れを裂くしかない。
「ひとふでヒツジ」というブラウザゲームを作った。いまはネットで、線を引く側(羊飼い)と狼側に分かれて対戦できる。実物はここ。
コードはAI(Claude)が書き、私は遊んでダメ出しをする係。この記事は、このゲームが一度「打ち切り」になってから、対戦になって公開されるまでの1週間の話だ。
2回、1回、3回で飽きた
始まりは、新作の企画を3案出してもらったことだった。8案を出し、重複を消して6案、採点して最終3案。その1位がこれだった。
v0.1ができた。核のループだけ。一筆、圧破り、柵。機械の検証では「上流で裂く」戦略が74.8%で単独支配していて、読んで打つプレイが成立している。遊んだ。2回で飽きた。
v0.2。波の前に契約を選ぶ3択、色を間違えたときの罰、ノルマ、締切。制限を足して判断を増やそうとした。1回で飽きた。 悪化した。
v0.3。契約を全部やめて、波の合間に強化を選ぶ3択を7種類、即時の得点、連鎖。波ごとの稼ぎは90→257→407→573→619→679と気持ちよく伸びる。3回で飽きた。
3版すべてで機械の検証は合格し、3版すべてで飽きられた。AIは反省文を書いた。題材ごと打ち切り、と。
「核は面白い。繰り返すだけなのがつまらない」
打ち切りの判断は、私が覆した。飽きはした。でもゲーム自体は面白かった。同じことを繰り返すだけなのがつまらないだけで、ステージにギミックが増えて進む形式にしたり、対戦にしたりすれば、まだ面白くなりそうな気がする。そう伝えた。
反省文のほうにも、実はその答えが書いてあった。短く浅い作品では、乱数は繰り返しに耐える力を生まない。 乱数の組み合わせは中身の量に比例するから、中身が薄ければ数回で見切られる。中身が薄いまま何百回も遊ばれる作品は、毎回の違いを外から調達している。他人か、プレイヤー自身の創作か、厚い中身か。私が挙げた2案は、そのうちの2つだった。ギミック=厚い中身、対戦=他人。
最初の一手は2〜4日で
発展案を5方向で作ってもらって、それぞれ壊しにいかせた。どれも単独では穴があって、組み合わせると補い合う。ただし、いきなり大きく作らない。
最初の一手は「狼と、夜3つ」。今までの面を夜1として、夜2は波3以降に狼が1頭、夜3は狼と突風。工数2〜4日。私の仮説「ギミックが増えて進めば面白くなる」を、26ステージ作り込む前に、その20分の1の工数で確かめる。
狼は羊を食べない。狙っている群れへ光の糸が伸びていて、近くの羊が逃げる。この押し出しは線1本ぶんの力があるので、狼にタダで羊を押させて柵へ入れられる。 線で止めることもできるが、噛まれると線が早く磨耗する。防ぐか、使うか。突風は3秒前に予告が出て、線が風を受け止めると風が線に沿った流れに変わる。風よけにも、滑り台にもなる、同じ1本。
機械の合格条件は1つだけにした。「ギミックを足しても、最適な一筆の置き所が変わらないなら、見た目が違うだけの同じ問題」。測ったら、夜1で最強だった「上流で裂く」は、夜2では「狼を使う」に負け(1929対2035)、夜3ではシードごとに勝者が4つの打ち方に割れた。筆が変わった。
遊んだ。面白かった。そして言った。「どうせなら線を描く側と狼側とで対戦できたら面白そう」。
狼側にも、持ち手がいる
対戦にする前に、AIは「そもそも勝負になるのか」を測った。結論は、なる。ただし今の狼のままでは、ならない。
狼の「どこを狙うか」を5種類に差し替えてAIの羊飼いにぶつけても、収容率は54.6〜58.9%の幅しか動かなかった。しかも賢く狙う狼は、羊飼いを有利にする。狼の押し出しは相手に利用される力なので、寄るほど資源を献上する。移動だけで遊ばせると、狼側は何を考えても結果が変わらない、退屈な側になる。
だから狼側に「牙」を持たせた。押すと一定時間、恐怖が強くなる。冷却あり。これで狼側は「狙う→押す→結果を見る」の一周が回る。
遊んだ。狼側も面白かった。そこで欲が出て、「羊飼いも狼もいろんな特徴のキャラがいて、遊ぶほど解放されるといい」と言った。ダッシュが得意な狼とか、吠える狼とか、線で攻撃できる羊飼いとか。
8体作って、5体は数字で落ちた
キャラ案は8体できた。そのうち5体は、実装する前に、このゲームの実測値と突き合わせて落ちた。
| 落ちた案 | 理由 |
|---|---|
| ダッシュが得意な狼 | 速さを1.5倍にしても収容率が42.6%対42.4%で動かない |
| 伏せる狼 | 押している時間が牙の9%しかない |
| 線で攻撃する羊飼い | 読む距離が縮んで、腕の差が出る幅を自分で狭める |
| 送り(コンベア)の羊飼い | 加速の下限が羊の最高速より遅い。乗せても何も起きない |
| 線を破って走る狼 | 5秒ごとに線を折られると、相手の対処手段が消える |
生き残ったのは「向きを書き換える」形だけだった。これは測った数字と一致する。押す力は倍にしても飽和するが、向きの定着は「無操作」と「上流で裂く」を分けている当のものなので、余地はそこにしかない。
それで「筒」という筆が入った。線を引き終わるときに手首を返すと、線の先から光が走って、貫いた羊の向きが書き換わる。一晩遊ぶと開く。
遊んで、私はこう言った。「筒が普通の筆とどう違う使い方ができるか分からなかった」。調べたら、待機中に何も出ていなかった。使い方が伝わっていないだけで、面白いかどうかの判定はまだ出ていない。ここは今も宿題だ。
別のAIに読ませた
そのあいだに、別のAI(Codex)にコードを読ませて、7往復で不具合を10件直した。これは別の記事に書いた。私自身が実際に遊んで出した指摘も2つあった。文字が読めない。出てきた羊が最初から左右に寄りすぎていて線すら引けない。どちらも直った。
ネットに置く
そして私は言った。「サーバーに置いて、アクセスした人たちで対戦を遊べる形に直せるか」。
置き先は普通のレンタルサーバーで、常時動くプログラムは置けない。だから対戦サーバーは立てられない。代わりに、ブラウザ同士を直接つなぐ(WebRTC)。サーバーは最初の待ち合わせの伝言板(PHP)だけをやる。
設計で1つ、採らなかった道がある。両方のブラウザで同じ計算を回して、入力だけを交換する方式。通信量が少なくて済むけれど、JavaScriptの三角関数の結果はブラウザによって最下位の桁で違い得る。羊は群れの相互作用で動くので、最下位の桁の差でも数秒で盤面が別物になる。ずれたら直しようがない。だから、羊飼い側のブラウザが計算を回して、1秒に15回、全状態を相手に送る。通信量は羊34頭ぶんで毎秒3KBほど。節約する理由が、そもそも無かった。
同じPCの2窓で1夜を通し、両画面の点が一致。WebRTC経由でもう一度、一致。相手のタブを閉じても、残った側が固まらず理由を出して終わる。ここまで確かめてから、上げた。
上げた日
サーバーへの転送はAIが直接やった。新しいフォルダに2ファイルを置いただけで、既存のものには触れていない。上げてから、本番で1人用が動くこと、待ち合わせの伝言板が返事をすること、本番経由で2窓をつないで1夜を通し、両画面とも1015点で一致することを確かめた。
そのあと、合言葉なしで「羊飼いで待つ」「狼で待つ」を押せば知らない人と組める形まで入れた。
残っている未確認は1つ。別の回線・別のネットワークの2台で繋がるか。 確かめたのは同じPCの2窓なので、証明にはなっていない。中継サーバーを置いていないので、繋がらない組み合わせは必ず出る(一般に1〜2割と言われている)。ここは手元では原理的に確かめられない。
1週間で起きたこと
打ち切りから公開まで、日付を見返すと1週間に収まっていた。版はv0.1からv0.6まで、不具合の修正は数えていない。
この1週間でいちばん大きかったのは、「足したら悪化した」という観測だと思っている。v0.2で制限を足して悪化し、v0.4で能力を足して良くなった。同じ「足す」でも、縛りを足すのと、できることを足すのは逆に効く。反省文には法則13として残っている。
そしてもう1つ。面白いかどうかは、最後まで私が遊んで決めている。機械の検証は「最適な打ち方が変わったか」までは見てくれるが、「4回目に遊びたくなるか」は見てくれない。だから最初の3版は、検証に合格して、飽きられた。
いまの版が4回目に遊びたくなるものかどうかは、まだ分からない。対戦は相手がいて初めて動く。最大の未確認は、技術ではなく「同時に2人来るか」だ。






