マガジン

「評価」を作り込む:点数ではなく言葉で返す

遊びをつくる

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

色鉛筆の線やゲームのスケッチが描かれたノートとカード。
記事のテーマをもとに制作したAI生成イメージ。実際のゲーム画面ではありません。

記憶ゲームを遊び終えた画面に「640点」とだけ出る場面を考えてみます。数字は記録を並べるには便利ですが、「今回の自分のプレイはどうだったのか」には答えてくれません。慎重に聴き直しながら進んだのか、勢いで押し切ったのかは、同じ640点でも違うはずです。 この記事で確かめるのは、点数の裏にある行動の記録から、プレイの様子を言い当てる短い言葉を作れるかどうかです。材料にするのは「こだまの森」の設計です。光る葉の順番を覚えて4つの音色で返す記憶ゲームで、評価の仕組みを組み立てる素材がそろっています。この記事ではそれを手がかりに、条件から言葉を選ぶ小さな評価関数を作ります。

この記事の目次
  1. こだまの森の評価から読み取れること
  2. 手順1〜3:材料・軸・対応表を決める
  3. 手順4:評価関数を書いて動かす
  4. 手順5〜7:言葉の書き方を整え、確かめる
  5. 起こりやすい失敗
  6. 次の行動

こだまの森の評価から読み取れること

まず、確認できている範囲だけを整理します。こだまの森には6・8・10ラウンドの3コースがあります。聴き直しをすると15点減り、間違えると30点減って、3回間違えると終了します。一時停止もできます。最高記録はゲームを開いている間だけ残ります。

ここから「設計から読み取れること」として言えるのは、プレイの中に性格の違う行動が最初から用意されている、という点です。聴き直しは「確かめて進む」行動で、安いコストがつきます。間違いは「外した」行動で、重いコストがつき、3回で終わります。点数はこの2種類の行動を1本の数字にまとめたものです。

つまり、まとめる前の行動の記録(聴き直し何回、間違い何回、何ラウンド目まで届いたか)を使えば、点数にならなかった情報を言葉にできます。画面に言葉の評価がどう出るかは、この記事では断定しません。作品を開いて、終了時の表示を実際に確かめてください。その表示と、これから作る言葉を見比べると、自作の方針が決めやすくなります。

手順1〜3:材料・軸・対応表を決める

手順1:記録する値を5つに絞ります。 自作の記憶ゲームを想定すると、次の5つがあれば足ります。

  • 到達したラウンド(round)
  • 聴き直しの回数(replays)
  • 間違いの回数(mistakes)
  • 最後まで届いたか(cleared)
  • 点数(score)

値を増やすほど言葉の分岐が爆発します。最初は点数以外の4つで言葉を決め、点数は別に表示する、と割り切るのが安全です。

手順2:言葉の軸を決めます。 軸とは「何を褒めるか」の方向です。この題材なら次の3つが自然です。

  • 耳だけで通した(聴き直しが少ない)
  • 確かめながら通した(聴き直しがあり、間違いが少ない)
  • 粘って届いた(間違いがあっても最後まで進んだ)

軸は、順位ではなく性格の違いとして並べます。「聴き直しが多い=下手」と読める言葉にしないことが、この作業の要です。

手順3:条件と言葉の対応表を紙に書きます。 左に条件、右に言葉の方向を書き、上から順に当てはまったものを採用する順序にします。

  • 1、条件:未クリアで1ラウンド目、言葉の方向:最初の一歩を後押しする
  • 2、条件:未クリア、言葉の方向:届いたラウンドを伝え、次の手を一つ示す
  • 3、条件:間違い0・聴き直し0、言葉の方向:耳だけで通したことを言う
  • 4、条件:間違い0・聴き直しあり、言葉の方向:確かめながら進んだことを言う
  • 5、条件:聴き直し0・間違いあり、言葉の方向:迷わず進んだことを言う
  • 6、条件:それ以外、言葉の方向:粘って届いたことを言う

「それ以外」を最後に必ず置くのがポイントです。どの条件にも当たらない記録が出ても、空の画面にならずに済みます。

手順4:評価関数を書いて動かす

手順4:対応表をそのまま関数にします。 次のコードは、HTMLファイル1枚で動く最小構成です。保存してブラウザで開くと、サンプル記録ごとに返る言葉が一覧で出ます。

html
<!doctype html>
<meta charset="utf-8">
<pre id="out"></pre>
<script>
function judge(r) {
  if (!r.cleared) {
    if (r.round <= 1) return "最初の森で足を止めました。まず3音だけ、声に出して数えてみましょう。";
    return r.round + "ラウンドまで進みました。間違いが重なる前に、一度聴き直す手があります。";
  }
  if (r.mistakes === 0 && r.replays === 0) return "一度も聴き直さず、間違いもありませんでした。耳だけで通した道です。";
  if (r.mistakes === 0) return "間違いはゼロです。聴き直し" + r.replays + "回は、確かめながら進んだ証拠です。";
  if (r.replays === 0) return "聴き直しなしで進み切りました。間違い" + r.mistakes + "回は、迷わず進んだ分の代償でした。";
  return "聴き直しと間違いを重ねながら、最後まで届きました。粘り強い道のりです。";
}
const samples = [
  {round:1, cleared:false, mistakes:3, replays:0},
  {round:5, cleared:false, mistakes:3, replays:2},
  {round:6, cleared:true, mistakes:0, replays:0},
  {round:6, cleared:true, mistakes:0, replays:2},
  {round:6, cleared:true, mistakes:1, replays:0},
  {round:6, cleared:true, mistakes:2, replays:3}
];
document.getElementById("out").textContent = samples
  .map(s => JSON.stringify(s) + "\n→ " + judge(s)).join("\n\n");
</script>

関数の中身は、対応表の上から順に if を並べただけです。ゲーム本体に組み込むときは、終了時に judge へ記録を渡し、返ってきた文字列を結果画面に出すだけで済みます。点数の表示は消さず、言葉をその隣か上に置くと、記録を競いたい人と振り返りたい人の両方に応えられます。

手順5〜7:言葉の書き方を整え、確かめる

手順5:言葉に使う型を決めます。 一文が長くなりやすいので、次の3要素のうち2つ以内に絞ります。

  1. 事実を一つ:「聴き直し2回」のように、記録した数字を一つだけ入れます。
  2. 見立てを一つ:「確かめながら進んだ証拠です」のように、その数字が何を意味するかを言います。
  3. 次の一手を一つ:未クリアのときだけ入れます。「一度聴き直す手があります」のように、やれることを一つに絞ります。

数字が二つ三つと並ぶと、結局は点数と同じ読み方になります。

手順6:責めない言い回しに直します。 書いた言葉を一度、失敗した直後の気持ちで読み返します。「間違いが多すぎました」は事実でも、次の挑戦を止めます。「間違い3回で、森の途中で止まりました」のように、起きたことを述べるだけに直せば、同じ情報で印象が変わります。上のコードの「代償でした」も、読む人によっては重いと感じるかもしれません。自作のときは、もう少し柔らかい語に差し替えてください。

手順7:境界の記録で動作を確かめます。 確かめたいのは、条件が切り替わる境目です。次の観点で、サンプルの配列に記録を足していきます。

  • mistakes が 0 と 1 のとき
  • replays が 0 と 1 のとき
  • round が 1 と 2 のとき(未クリアの分岐)
  • cleared が true で、mistakes も replays も大きい極端な値のとき

どの記録でも、空の文字列や undefined が表示されないことをまず確認します。次に、返ってきた言葉が実際のプレイの印象と合うかを、自分で何パターンか遊んで見比べます。可能なら他の人にも同じ記録と言葉を見せて、「この言葉は、このプレイに合っていると感じるか」を聞き、合わないという声が出た条件から直します。ここで得られる答えは、実際にやってみるまで分かりません。

起こりやすい失敗

評価の言葉を作るときに踏みやすい点を挙げます。

  • 条件の順序の誤り:「間違い0」の条件を「聴き直し0・間違い0」より先に置くと、完璧なプレイが「確かめながら進んだ」と評されます。具体的な条件ほど上に置きます。
  • 言葉が点数の言い換えになる:高得点には褒め言葉、低得点には励ましを機械的に当てると、点数が読めれば済む情報しか増えません。点数にない軸(聴き直しの使い方など)を拾ってください。
  • 分岐を増やしすぎる:条件が10を超えると、どの言葉がどの記録に対応するのか自分でも追えなくなります。最初は5〜6通りで始め、遊んで物足りなかった部分だけ足します。
  • 記録を取り損ねる:聴き直しの回数のように、ゲーム本体のどこかで数えていない値は、評価時に使えません。評価の言葉を先に考えると、必要な記録が先に見えてきます。
  • 保存を当てにする:アソバースにアップロードした作品内の localStorage などは一時メモリーの互換処理です。こだまの森の最高記録も、ゲームを開いている間だけ残る設計です。前回との比較を言葉にしたい場合は、クラウドセーブ(作品ごとにJSONで128KiBまで)を使うか、今回の記録だけで言える言葉に絞ります。

次の行動

こだまの森を一度遊び、終了時に画面へ出る情報を確かめてください。聴き直しと間違いの回数を自分で数えておくと、上のコードのサンプルに入れる記録がそのまま作れます。そのうえで、自作ゲームの記録を3〜4個に絞り、対応表を紙に書いてから関数にしてみてください。まずは6通りの言葉で十分です。