マガジン

「短く」の基準はどこか:行数・文字数・機能数

遊びをつくる

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

ゲームを実際に動かしながら、下書きの説明カードを鉛筆で確かめる手元。
記事のテーマをもとに制作したAI生成の写真風イメージ。

ゲームづくりをAIに頼むとき、「短く作って」と一言添える場面を考えてみます。返ってきたコードが前より小さければ、指示が効いたように見えます。ただ、何が小さくなったのかは、見ただけでは分かりません。行数が減ったのか、文字数が減ったのか、機能が削られたのかで、手元に残るゲームはまったく違います。 特に注意したいのは、行数だけが減る場合です。複数の処理を1行に詰め込めば、行数は減っても文字数は変わらず、読みにくさだけが増えます。反対に、機能を3つ削ったのに行数がほとんど変わらないこともありえます。「短く」という言葉が何に作用するのかは、言葉の印象ではなく、数えて確かめるしかありません。 この記事は、その確かめ方を実験の設計書としてまとめたものです。結果は書きません。同じ依頼文に条件だけを変えて何度か出力させ、行数・文字数・機能数を記録すれば、自分が使うAIと自分の書き方での答えが出ます。

この記事の目次
  1. 何を問うのか:「短さ」が作用しうる4つの場所
  2. 準備するもの
  3. 手順と記録の取り方
  4. 結果の読み方
  5. 起こりやすい誤り
  6. 次の行動

何を問うのか:「短さ」が作用しうる4つの場所

「短く」が作用する先は、少なくとも次の4つに分けられます。実験の前に分けておくと、結果を読むときに混ざりません。

  • コードの行数(空行とコメントを除いた行数で数えます)
  • コードの文字数(空白と改行を含めた総数で数えます)
  • 機能の数(入力、判定、ヒント、記録など、遊び手に見える働きの数です)
  • 説明文の長さ(コードの外に付く解説です。「短く」がこちらに効く可能性もあります)

問いは次の3つです。

  1. 「短く」とだけ書いたとき、4つのうちどこが変わるでしょうか。
  2. 行数、文字数、機能数のいずれかを数値で指定すると、指定したものだけが減るでしょうか。それとも他のものも連動して減るでしょうか。
  3. 指定した数値を守ったとき、ゲームとして遊べる状態は保たれているでしょうか。

3つ目は見落とされがちです。基準を満たしても、遊べなくなっていれば意味がありません。

準備するもの

  • 同じAIの同じモデル。途中で切り替えません。
  • 実行のたびに新しい会話を開く環境。前の出力が残っていると、2回目以降は影響を受けます。
  • ブラウザ。出力したHTMLを開いて動作を確かめます。
  • 記録用の表(紙でも表計算でも構いません)。
  • 下に示す計測用の小さなHTML。

題材は、小さくても機能の足し引きが見えやすい「数字当てゲーム」にします。基本の依頼文は次のとおりです。

ブラウザで遊べる数字当てゲームを、1つのHTMLファイルで作ってください。

この文の末尾に、条件ごとの一文を足します。

  • A 対照、末尾に足す一文:なし
  • B 曖昧、末尾に足す一文:「短く作ってください。」
  • C 行数、末尾に足す一文:「コードは◯行以内にしてください。」
  • D 文字数、末尾に足す一文:「コードは◯文字以内にしてください。」
  • E 機能数、末尾に足す一文:「機能は3つまでにしてください。」

CとDの「◯」は、先にAを5回実行し、行数と文字数の中央値を出してから決めます。どちらも中央値のおよそ半分にすると、無理のない範囲で制約が効いているかを見られます。あらかじめ数字を決め打ちすると、Aの出力がすでに範囲内だったときに、制約の効果を測れなくなります。

手順と記録の取り方

1. 機能のチェックリストを先に作る

機能数は、見た人によって数え方が変わります。そこで、実験の前に数え方を固定します。数字当てなら、たとえば次の8項目です。

  1. 数字の入力欄
  2. 「大きい/小さい」のヒント表示
  3. 試行回数の表示
  4. 再挑戦ボタン
  5. 過去の入力の履歴
  6. 最高記録(最少の試行回数など)
  7. 難易度や範囲の選択
  8. 効果音や演出

出力を見て、各項目が「ある/ない」を判定します。機能数はその合計です。出力を見てから項目を足すと基準がぶれるので、実験の途中では増減させません。

2. 各条件を5回ずつ実行する

条件は5つなので、合計25回です。生成のばらつきを見るため、1条件につき最低5回は取ります。1回だけでは偶然との区別がつきません。順番は条件ごとにまとめず、A→B→C→D→E→A…と回すと、時間帯や環境の影響が偏りません。

3. 出力を計測する

出力されたコードを、次の小さなHTMLに貼り付けると、行数・文字数・おおよその関数とイベントの数・コメントの数が出ます。機能数は自動では数えられないので、チェックリストで手作業で数えます。

html
<!doctype html>
<meta charset="utf-8">
<textarea id="src" rows="12" cols="60" placeholder="生成されたコードを貼り付け"></textarea>
<pre id="out"></pre>
<script>
const src = document.getElementById("src");
const out = document.getElementById("out");
function measure() {
  const t = src.value;
  const lines = t.split("\n");
  const filled = lines.filter(l => l.trim() !== "");
  const longest = Math.max(0, ...lines.map(l => l.length));
  const fn = (t.match(/function\s|=>/g) || []).length;
  const ev = (t.match(/addEventListener|onclick=/g) || []).length;
  const cm = (t.match(/\/\/|\/\*|<!--/g) || []).length;
  out.textContent = [
    "空行を除いた行数: " + filled.length,
    "文字数(空白・改行を含む): " + t.length,
    "最長の1行の文字数: " + longest,
    "関数らしき記述: " + fn,
    "イベント登録らしき記述: " + ev,
    "コメントらしき記述: " + cm
  ].join("\n");
}
src.addEventListener("input", measure);
measure();
</script>

コメントを数えるのは、「短く」の指示でコメントが先に削られる場合があるためです。コメントの除去は行数を大きく変えますが、ゲームの中身は変わりません。

4. 1回ごとに記録する項目

  • 条件(A〜E)と回の番号、記録の単位:1〜5
  • 空行を除いた行数、記録の単位:行
  • 文字数、記録の単位:文字
  • 最長の1行の文字数、記録の単位:文字
  • 機能数、記録の単位:8項目中いくつか
  • コード外の説明文の文字数、記録の単位:文字
  • 指定した数値を守ったか、記録の単位:はい/いいえ
  • 最後まで遊べたか、記録の単位:はい/いいえ

「最後まで遊べたか」は、実際にブラウザで開き、数字を入力して正解するまで遊んで判定します。エラーで動かない場合も、その事実を記録します。

結果の読み方

25回分が埋まったら、条件ごとに各項目の中央値を並べます。平均は外れ値に引っ張られるので、5回程度なら中央値が扱いやすい指標です。読み方の目安は次のとおりです。

  • Bで、Aに比べて行数も文字数も機能数も大差ない、読み取れること:「短く」だけではコードにほとんど作用していません。数値を添える必要があります。
  • Bで、説明文だけが短くなった、読み取れること:「短く」が返答の文章に効いています。コードに効かせるには「コードを」と対象を書きます。
  • Cで行数は減ったが、文字数と最長行が増えた、読み取れること:1行に詰め込んで行数の指定をかわしています。読みやすさを保つなら、文字数も併記します。
  • Dで文字数は減ったが、機能数も減った、読み取れること:文字数の指定が、実質的に機能の削減として働いています。
  • Eで機能数は3以下に収まったが、行数は大きく変わらない、読み取れること:機能数の指定は、行数や文字数の削減を保証しません。
  • 指定を守った出力で「遊べない」が増えた、読み取れること:基準を満たすことと、遊べることは別です。制約が厳しすぎる可能性があります。

目安は、5回のうち少なくとも4回で同じ傾向が出るかどうかです。2〜3回しか同じ向きに動かないなら、傾向があるとは言い切れません。その場合は回数を10回に増やしてみます。

起こりやすい誤り

  • 会話を引き継いでしまう:同じ会話で続けると、2回目以降は前の出力を踏まえた応答になります。毎回新しい会話にします。
  • 条件ごとに依頼文の他の部分を変える:足す一文以外は、1文字も変えません。基本の依頼文を保存してコピーします。
  • 数え方が途中で変わる:空行やコメントの扱いを回ごとに変えると、行数が比べられなくなります。計測は同じ手順で行います。
  • 機能数を印象で数える:チェックリストにない機能が出てきた場合は、その場で項目に足さず、「その他」として別に記録します。
  • 動かない出力を除外してしまう:動かない出力は、制約が品質に与えた影響を示す重要な記録です。外さずに残します。
  • Cの行数制限がそもそも小さすぎる:中央値の半分にしても、HTMLとCSSとスクリプトを含めると厳しい場合があります。遊べない割合が極端に高いなら、制限を中央値の7割程度に緩めて再実験します。

次の行動

まず基本の依頼文とAの5回分だけを実行し、行数と文字数の中央値を出してみてください。その数字からCとDの上限を決めれば、残りの20回の条件が決まります。

遊べる出力が得られたら、直下にindex.htmlとして置き、アソバースの投稿画面で「入力→表示の確認→公開」の流れに乗せることで、実際の画面での見え方も確かめられます。どの指示の書き方が、自分の作りたいゲームに合うかを判断する材料になります。