マガジン

一枚の紙に企画を収める:画面にする前の最後の確認

遊びをつくる

執筆にClaudeを使用しています。

色紙の試作コース、小さな駒、ノートを並べたゲーム制作の作業机。
記事のテーマをもとに制作したAI生成イメージ。実際のゲーム画面ではありません。

「ブラウザゲームを作ろう」と決めて、エディタを開く直前の場面を考えてみます。頭の中には遊びの手触りがあり、メモには思いついた機能が並んでいます。ところが、コードを書き始めると「1回は何秒なのか」「失敗したら何が起こるのか」といった基本の数値や挙動を、手を止めて決める場面が何度も出てきます。決めていなかった箇所は、実装の途中で場当たり的に埋まります。 この記事は、画面にする前に企画を一枚の紙に収め、紙の各行が実装のどこに対応するかを確かめる実験の設計書です。確かめたいことは二つあります。一つは、企画が8つの枠に収まるかどうかです。収まらない箇所は、まだ決まっていない箇所です。もう一つは、紙に書いた各項目に対応する実装の置き場所があるかどうかです。置き場所のない項目は、文章としては存在しても、ゲームには何も影響しません。結果は書きません。手元の企画で行えば、答えが出る形にしてあります。

この記事の目次
  1. 準備するものと、紙を区切る8つの枠
  2. 手順:書く、対応させる、突き合わせる
  3. 公式作品で枠埋めの練習をする
  4. 記録の取り方と、結果の読み方
  5. 次の行動

準備するものと、紙を区切る8つの枠

準備するのは次のものです。

  • A4の紙1枚と、太さの決まったペン(細すぎるペンは文字を詰め込む原因になるため避けます)
  • タイマー(10分に設定します)
  • 対象にする企画(まだ作っていないもの、作り始めたばかりのもの。可能なら別の企画をもう1本)
  • 実装用のエディタ(手順の後半で使います)

紙は縦横に線を引き、8つの枠に区切ります。各枠の文字数の目安も先に決めておきます。上限を超えた分は「あふれ」として数えるためです。

  1. 毎回やること:プレイヤーが繰り返す行為を、1文(40字程度)で書きます。
  2. 終わり方:勝ち、負け、時間切れの条件を、合わせて2文までにします。
  3. 制約の数値:回数、個数、速度、時間など、数値で書けるものを箇条書きで並べます。
  4. 一回の長さ:1回の遊びが何秒か何分かを、数字で書きます。
  5. 入力:使う操作(キー、タップ、ドラッグなど)を列挙します。
  6. 失敗したとき:失敗の直後に画面で起こることと、再開までの手順を、2文までにします。
  7. 最初の30秒:初めて開いた人が何を見て、何をするかを、3文までにします。
  8. 作らないもの:今回は作らないと決めた機能を、3つ以上書きます。

保存が必要な企画なら、9枠目に「残すもの」を任意で足します。何を、どの単位で残すかを書く枠です。アソバースでは、アップロード作品内のlocalStorageやsessionStorageは一時メモリーの互換処理として扱われます。作品ごとのクラウドセーブ(JSONで128KiBまで)はSDKを通して使います。残すものがあるなら、実装方式を決める前に、紙の上で中身と大きさを見積もっておくと判断が楽になります。

手順:書く、対応させる、突き合わせる

手順1:10分で書く

タイマーを10分にセットし、エディタやコードは見ずに8枠を埋めます。決まっていない枠は、空欄のまま残します。「たぶんこうなる」と推測で埋めると、後の読み取りができなくなります。10分で終わらなければ、そこで打ち切ります。何分で書き終えたか、または何枠が未完成かは、そのまま記録になります。

手順2:対応表を作る

紙を裏返すか、別の紙に、次の形で対応表を作ります。左の2列は紙の内容、右の2列は実装の置き場所と確認方法です。

  • 3 制約の数値、紙に書いたこと:失敗は3回まで、実装での対応先:残り回数を持つ変数と、0で終了する分岐、確認する方法:意図的に3回失敗して終了画面が出るか見る
  • 4 一回の長さ、紙に書いたこと:1回30秒、実装での対応先:制限時間の定数と、残り時間を減らす処理、確認する方法:開始から終了までを計る
  • 5 入力、紙に書いたこと:左右キーとドラッグ、実装での対応先:キー入力とポインタ入力のイベント処理、確認する方法:それぞれ単独で操作して同じ結果になるか見る
  • 6 失敗したとき、紙に書いたこと:1秒後に同じ位置から再開、実装での対応先:再開用の状態の初期化処理、確認する方法:失敗から再開までの流れを3回繰り返す

この表の右端が書けない行が出てきます。書けない行は「実装先なし」と記入して数えます。紙には書いてあるのに、コードのどこにも居場所がない行です。

手順3:数値を突き合わせる

実装が一部でもできたら、紙の数値と、コードの定数を並べて比べます。次のHTMLは、保存してブラウザで開くだけで動く最小構成です。PAPERに紙の数値、GAMEに実装の定数を写し、差分を表示します。値は説明用の例なので、自分の企画の数値に置き換えます。

html
<!doctype html>
<meta charset="utf-8">
<pre id="out"></pre>
<script>
// 紙の枠3・4の数値(例。自分の企画の数値に置き換えます)
const PAPER = { roundSeconds: 30, lives: 3, goal: 5 };
// 実装側の定数(実際のコードの値を写します)
const GAME = { roundSeconds: 30, lives: 3, goal: 6 };

const lines = [];
let diff = 0;
for (const key of Object.keys(PAPER)) {
  const same = PAPER[key] === GAME[key];
  if (!same) diff++;
  lines.push((same ? "一致  " : "差分  ") + key +
    "  紙=" + PAPER[key] + "  実装=" + GAME[key]);
}
for (const key of Object.keys(GAME)) {
  if (!(key in PAPER)) {
    diff++;
    lines.push("紙になし  " + key + "=" + GAME[key]);
  }
}
lines.push("差分の数: " + diff);
document.getElementById("out").textContent = lines.join("\n");
</script>

例ではgoalの値だけをあえて変えてあり、差分がどう表示されるかを見るための設定です。「紙になし」と出る行は、実装には数値があるのに紙に書かれていないものです。調整のために後から足した値が、ここに現れやすくなります。

公式作品で枠埋めの練習をする

自分の企画の前に、既存のゲームを紙に起こす練習をしておくと、枠の粒度がつかめます。アソバースの公式作品のうち、数値が確認できる2本を題材にします。以下は、案内で確認できる範囲だけで埋めた枠です。設計から読み取れることとして扱い、作者の意図とは断定しません。

紙ひこうき郵便

  • 毎回やること:風に流されながら手紙を集め、郵便受けへ向かう。
  • 終わり方:最後の6秒で赤い郵便受けへ向かう。風船にぶつかると紙が傷み、3回で終了する。
  • 制約の数値:海辺は36秒で5通、丘は40秒で8通、山は44秒で10通。
  • 一回の長さ:ルートにより36〜44秒。
  • 入力:左右キー、ドラッグ、矢印ボタン。

時計じかけの台所

  • 制約の数値:本番は1皿28秒、配膳6秒、ミスは3回まで。見習いは時間制限なし。
  • 毎回やること:材料をレシピ順に入れ、火にかけ、針が緑の範囲に来たら止めて配膳する。
  • 6つのレシピがあり、料理ごとに100点で評価される。

ここで注目したいのは、数値の枠がどちらも具体的に埋まる点と、紙に書けない部分が残る点です。「最初の30秒」「失敗したとき」「作らないもの」の枠は、確認済みの範囲では埋められません。この部分は、作品を実際に開いて確かめます。開いたうえで、自分の言葉で枠を埋めてみてください。8枠が埋まるかどうかは、読者自身が確かめる実験の一部です。

記録の取り方と、結果の読み方

記録する項目は、次のとおりです。単位と回数も決めておきます。

  • 書き終えるまでの時間(分。10分で打ち切った場合は「未了」と記入)
  • 各枠の文字数と、上限を超えた枠の数(あふれ)
  • 空欄の枠の数
  • 対応表で「実装先なし」と記入した行の数
  • 実装後の突き合わせで出た差分の数(「紙になし」を含む)

回数は、同じ企画で2回(実装前と、実装後に書き直した紙)、できれば別の企画でも1回ずつ行います。1本だけでは偶然との区別がつかないためです。

結果は、次のように読みます。

  • 空欄が多い場合、その枠が未決の箇所です。実装に入る前に、そこだけ先に決めます。
  • あふれが出た場合、1枠に複数の話が混ざっています。1つの遊びに2つの目的が入っていないか見直し、必要なら分けます。
  • 「実装先なし」の行が多い場合、文章として書いただけで、挙動に落ちていません。その行を実装の作業項目に書き換えるか、紙から削ります。
  • 実装後の差分が多い場合、紙の数値に根拠がなかった可能性があります。調整が必要な数値は、「30秒」と1点で書かず、「25〜35秒」のように幅で書いておくと、差分の意味が読み取りやすくなります。
  • 「紙になし」が多い場合、紙に書かないまま足した要素が多いということです。8枠の外に出た要素は、企画の外側に広がり始めている目印です。

誤りやすい点も挙げておきます。

  • 文字を小さくして詰め込むと、あふれが見えなくなります。ペンの太さと文字数の上限を、先に守ります。
  • 実装を見ながら書くと、紙が実装の写しになり、突き合わせの意味が失われます。手順1ではコードを開きません。
  • 「楽しい」「気持ちいい」のような抽象語で枠を埋めても、対応先は書けません。行為や数値に言い換えます。
  • 数値を「後で決める」と書くと、空欄と同じ扱いになります。幅でもよいので、いまの仮の値を書きます。
  • 実装後に紙を更新せず捨てると、2回目の比較ができません。1回目の紙は、書き直した紙と並べて残します。

次の行動

まず手元の企画を1本選び、10分で8枠を埋めて、空欄の数を数えてください。次に、実装を始める前に対応表の「実装先なし」の行を確認します。ゲームを投稿する段階では、紙の「入力」と「最初の30秒」が、遊び方の説明(任意の作者申告)を書くときの素材になります。投稿画面の「紹介文と遊び方を作成」で作られる文章は下書きで、「この文章を使う」を押した場合だけ反映されます。反映する前に、紙の内容と合っているか読み比べておくと、説明のずれに気づけます。