「もしも」を動く形にするには:思考実験を小さなゲームにする設計書
遊びを見つける執筆にClaudeを使用しています。

「もしも、欲張るほど危なくなる灯りがあったら、人はどこでやめるのでしょう」。頭の中でこの問いを回しているうちは、答えは気分で変わります。さっきは3つでやめると思い、次は6つまで行けそうな気がしてきます。 思考実験は、動かした途端に曖昧さが残らなくなります。ボタンを押す回数、消える確率、遊ぶ回数を決めなければ、画面が動かないからです。この記事では、読者が自分の「もしも」を一つ選び、ブラウザで動く最小のゲームにするまでを、設計書の形で確かめます。題材として「欲張りの灯り」を一本通しで扱い、そのあとで自分の「もしも」に置き換える方法を示します。結果の数字はここには書きません。動かして記録するのは読者です。
「もしも」を変えられる数字に分解する
「もしも」の文章は、そのままではゲームになりません。実装の前に、次の4つに切り分けます。
- 登場するもの、問い:画面に何があるか、欲張りの灯りの場合:灯り、銀貨、回数
- 操作、問い:読者が何をできるか、欲張りの灯りの場合:「ともす」と「銀貨にする」の2つ
- 変えられる数字、問い:条件を動かすつまみは何か、欲張りの灯りの場合:消えやすさの基本値と増え幅、全体の回数
- 観察する量、問い:何を見れば答えが出るか、欲張りの灯りの場合:何個でやめたか、合計の銀貨
特に大切なのは3行目と4行目です。「もしも」を「つまみ」に変えておくと、後から条件を一つだけ変えて比べられます。観察する量が決まっていなければ、遊んだ後に「面白かった気がする」としか言えません。
自分の「もしも」を選ぶ場面を考えてみます。候補が「もしも重力が時々逆になったら」「もしも手持ちが毎回1つ減ったら」「もしも欲張るほど危なくなったら」と3つあったとします。次の3つを見て、一つに絞ります。
- 操作を2つ以内に言い切れるか
- 数字のつまみを3つ以内に絞れるか
- 1回の流れが1分以内に終わるか
当てはまる数が多い候補から作ると、最初の一本が完成しやすくなります。
例:欲張りの灯りを30行で動かす
ルールは次のとおりです。「灯りをともす」を押すたびに灯りが1つ増え、そのたびに消える確率が上がります。消えるとその回の灯りは失われます。「銀貨にする」を押すと、いまの灯りの数だけ銀貨を得て、次の回に進みます。5回で終了です。
消える確率は「基本値 + 増え幅 × 灯りの数」とします。基本値0.05、増え幅0.08なら、1つ目で0.13、5つ目で0.45になります。12個目では1.01と1を超えるので、必ず消えます。
次のコードを index.html として保存し、ブラウザで開くと動きます。外部の読み込みはありません。
<!doctype html>
<meta charset="utf-8">
<title>欲張りの灯り</title>
<p>回 <b id="r">1</b>/5 灯り <b id="g">0</b> 銀貨 <b id="s">0</b></p>
<button id="add">灯りをともす</button>
<button id="keep">銀貨にする</button>
<pre id="log"></pre>
<script>
const BASE = 0.05, STEP = 0.08, ROUNDS = 5;
let glow = 0, silver = 0, round = 1;
const $ = id => document.getElementById(id);
const say = t => { $("log").textContent += t + "\n"; };
function show() {
$("r").textContent = Math.min(round, ROUNDS);
$("g").textContent = glow;
$("s").textContent = silver;
if (round > ROUNDS) {
$("add").disabled = $("keep").disabled = true;
say("終了:銀貨 " + silver);
}
}
function next() { glow = 0; round++; show(); }
$("add").onclick = () => {
glow++;
if (Math.random() < BASE + STEP * glow) {
say("第" + round + "回:灯り" + glow + "で消えた");
next();
} else show();
};
$("keep").onclick = () => {
silver += glow;
say("第" + round + "回:灯り" + glow + "で確保");
next();
};
show();
</script>先頭近くの BASE、STEP、ROUNDS の3つが、先ほどの「変えられる数字」です。画面下のログには、各回に灯りがいくつで終わり、消えたのか確保したのかが残ります。これが「観察する量」の記録になります。
動かして記録する:問いと手順
動かす前に、問いを一文で決めます。たとえば「灯りを何個で必ず確保する方針が、5回の合計銀貨をいちばん多くするか」です。
準備するものは、保存した index.html、メモ用の表計算かノート、そして「n個になったら必ず『銀貨にする』を押す」という決めごとです。消えた回は、その決めごとの途中で消えただけなので、そのまま次へ進みます。
手順は次のとおりです。
- nを2、3、4、5、6の5通りに決めます。
- nごとに、5回で1プレイとして20プレイ行います。ページの再読み込みで最初からやり直せます。
- 1プレイごとに「終了時の銀貨」を1行で記録します。
- 5つのnそれぞれについて、20個の平均を出します。あわせて最小値と最大値も書き留めます。
1回の結果は運の影響が大きいため、1プレイの合計では比べません。nごとに20プレイとしたのは、そのぶれをならすためです。これより少ないと、平均の差が運の差と区別しにくくなります。
結果の読み方は次のようになります。
- 平均がnの増加とともに一度上がって下がるなら、「ちょうどよい欲張り方」が途中にあります。
- ほぼ横ばいなら、つまみの値が緩すぎるか厳しすぎる可能性があります。次の節で数字を動かします。
- 最大値が大きいのに平均が低いnは、当たれば大きいが安定しないやり方です。ゲームとしての緊張感を見るなら、こちらも大事な手がかりになります。
数字を一つだけ動かして「もしも」を分岐させる
最初の結果が出たら、STEP を0.04や0.12に変えて同じ手順を繰り返します。「もしも増え幅がもっと小さかったら」という新しい問いが、そのまま次の実験になります。
ここで起こりやすい誤りが4つあります。
- 同時に複数の数字を変える。 BASE と STEP を一度に動かすと、どちらの影響か分からなくなります。変えるのは一回に一つです。
- 途中で方針を変える。 20プレイの途中で「今回は直感でやろう」と切り替えると、そのnの平均が意味を失います。
- 気分で回数を決める。 平均が好みの形になった時点でやめると、結論が先に決まってしまいます。回数は事前に決めた20で止めます。
- 確率の計算ミスを疑わない。 「5つ目で0.45のはずなのに、もっと早く消える」と感じたときは、感覚より先にコードの式を読み直します。
結果が「予想どおり」だったときも、一つ確かめます。予想どおりの結果が、ルールの面白さを示すとは限りません。最適なnがすぐ分かるなら、そのゲームは考える余地が少ないということです。逆に、つまみを少し動かしただけで最適なnが大きく動くなら、数字の設計に遊びがあります。ここで感じ取った手応えが、次の改良の方向になります。
公開して、他の人にも動かしてもらう
動く形になった「もしも」は、アソバースに投稿して他の人に遊んでもらえます。確認済みの事項に沿って、準備の要点を整理します。
- 投稿はHTMLまたはZIPの直接アップロード、または公開済みURLです。入力、表示の確認、公開の3段階で進みます。下書き保存もできます。
- 公開にはメールアドレスの確認が必要です。
- ZIPの場合は直下の index.html が入口になり、素材は相対パスで参照します。この記事のコードは1ファイルなので、そのままアップロードできます。
- 投稿画面の「紹介文と遊び方を作成」は下書きを作るだけです。「この文章を使う」を押したときにだけ反映されます。「何を確かめるゲームか」を一文で足しておくと、遊ぶ人が問いを共有しやすくなります。
注意したいのは記録の扱いです。アップロード作品の中の localStorage は一時メモリーの互換処理で、永続的な保存を前提にしないのが安全です。また、ゲーム内スコアの共通ランキングは現在提供されていません。実験の記録を残したいなら、終了時にログへ結果を表示しておき、遊んだ人が自分で控えられる形にします。クラウドセーブの使い方は、現在の案内で確認してください。
プレイ回数は作品の起動の実測回数で、人数ではありません。数字が伸びたときも「何人が遊んだか」とは読み替えず、レビューのコメントなど、遊んだ人の言葉で手応えを確かめます。
次の行動
まず自分の「もしも」を一つ選び、「登場するもの・操作・変えられる数字・観察する量」の4行を書き出します。次に、このコードの BASE、STEP、ROUNDS を自分のルールの数字に置き換え、最初の20プレイを記録してみてください。続きの分岐も、数字を一つ動かすだけで始められます。

