第6章 ゲーム内容の作り込み/10 本目 / 全 10/約25分

難易度を選べるようにする

こより

想定する三人を先に決めて、数字は測って選ぶ。最後の一線は、数字の外で引いていいよ!

案内役 こより
この術でできるようになること

上手さのちがう人が、それぞれ長く遊べる

画像は押すと原寸で開きます。

なぜ要るか

3-4で、相手にわざと間違える確率を仕込みました。MISTAKE_RATE です。0.15なら「10回のうち1〜2回は、最善ではない手をあえて選ぶ」という意味の数字です。強すぎる相手はつまらないから、真ん中を狙って0.15にした、あれです。

でも0.15が心地いいのは平均の人です。初めての人には強すぎ、6-6を読んで研究した人には弱すぎます。1つの数字で全員を楽しませることはできません。 なら、選ばせます。

隠しパラメータだった MISTAKE_RATE を、世界観の言葉で表に出します。名前は手心(てごころ)。こよりがどれだけ手加減してくれるか、です。

タイトル画面の下部。手心の見出しの下に、手習い・稽古・真剣の3つのボタンが並んでいる

使う道具: なし

AIプロンプト

この術の作業をAIへ任せるときは、これをそのまま貼ってください。

1) index.html の相手の強さを選べるようにして。タイトル画面に、手心として、手習い・稽古・真剣の3つのボタンを置く。中身はわざと間違える確率で 0.45 / 0.15 / 0。選んだ値は localStorage に保存して次回も使う。初期値は稽古。あわせて勝ち数を記録して、3勝で切紙、10勝で目録、25勝で免許皆伝の免状を出して。段が上がった時だけお祝いの一言を出す。それ以外は変えないで。

2) 間違える確率を 0.15 / 0.3 / 0.45 / 0.6 に変えて、3枚を別々の的へ散らす
打ち方との対戦をそれぞれ2万回。散らす側の勝率と引き分け率を表で出して。

手心の3つの名前と、散らす打ち方の部分は、自分のゲームで想定する3人と、その人たちの進め方に置き換えてください。

難易度は3つで足ります

<div class="tesin" id="tesinBox">
  <span class="label">手心</span>
  <button data-tesin="0.45">手習い</button>
  <button data-tesin="0.15">稽古</button>
  <button data-tesin="0">真剣</button>
</div>

data-tesin="0.45" は、そのボタンが持つ値をHTMLに書き添えておく書き方です。押されたときにこの数字を読み取って相手の強さに使うので、ボタンごとに別の処理を書く必要がありません。

手心 間違える確率 想定する相手
手習い 0.45 初めての人。勝つ体験を先にしてもらう
稽古 0.15 ふつうに遊ぶ人。3-4で決めた真ん中
真剣 0 研究した人。相手は常に最善手

5段階にしなかった理由も書いておきます。難易度の間の差を説明しにくくなるからです。「手習いと稽古は何が違うの」に一言で答えられる数だけ用意します。3つなら「勝たせてくれる・いい勝負・本気」で言い切れます。

数字は勘で決めません

0.45と0の根拠は、6-6のシミュレーションです。

真剣(0)の相手は、6-6で固定プラン全部に8割勝った「場を見て毎手番判断」そのものです。間違いを入れないと、暗記の置き方では勝てません。研究した人への壁として、測った実力がそのまま使えます。

手習いは、基準を先に決めてから測りました。「素直に3枚を別々の的へ散らす置き方で、2回に1回くらい勝てる」。初めての人の置き方に一番近いのが、この散らし方だからです。間違える確率を変えながら各2万戦回した結果がこれです。

表の勝ち越し率は、引き分けを除いた中で勝った割合です(6-6と同じ見方です)。

間違える確率 散らす置き方の勝ち越し率
0.15(稽古) 32.0%
0.3 38.4%
0.45 44.3%
0.6 49.9%

発見がありました。考える相手は、半分近く間違えてもまだ勝ち越します。 きっちり五分にするには0.6が要ります。でも0.6は採りませんでした。2回に1回でたらめを置く相手は、もう勝負をしているように見えないからです。

採用した0.45は「2回に1回近く勝てて、相手がまだ相手らしい」上限です。数字は測って選ぶ。ただし最後の一線は、数字の外の判断で引く。 6-6でやったことと同じ形です。

難易度調整とは、想定する相手ごとに勝率を測って数字を置くことです。 6-6の道具がそのまま使えます。勘で置いた数字は、勘でしか直せません。

選んだ手心は保存します

function tesin() {
  var v = localStorage.getItem(TESIN_KEY);
  return v === null ? 0.15 : parseFloat(v);
}

getItem は、保存が何も無いときに null を返します。だから null のときだけ初期値の0.15を使い、それ以外は保存された値を parseFloat で数へ戻して返しています。保存された値は文字として入っているので、この変換が要ります。

一度「真剣」を選んだ人は、次に開いても真剣のままです。6-4でやった保存の考え方の続きで、残すのは選んだ事実だけ。初期値は稽古(0.15)にしてあります。最初の1回から「どれにする?」と聞かない、というのも判断です。まず標準で遊んでもらい、合わなければ変えてもらいます。

勝ち越しには免状を出します

難易度を付けると、真剣で勝てるようになった人に何も起きないのが次の不満になります。そこで、勝ち数へごほうびを付けます。武道の伝授段階から借りました。

var MENJO = [
  { wins: 25, name: '免許皆伝' },
  { wins: 10, name: '目録' },
  { wins: 3, name: '切紙' },
];

3勝で切紙、10勝で目録、25勝で免許皆伝。決着のたびに勝ち数を記録して、段が上がった時だけ祝います。

function recordResult(won) {
  var r = rank();
  var before = menjoOf(r.wins);
  r.plays++;
  if (won) r.wins++;
  localStorage.setItem(RANK_KEY, JSON.stringify(r));
  return { rank: r, agatta: menjoOf(r.wins) !== before ? menjoOf(r.wins) : '' };
}

順に読むとこうです。rank() で保存してある成績を読み出し、before に「いまの免状」を取っておきます。そのあと遊んだ回数と勝ち数を足して保存し、免状を計算し直します。before と違っていれば段が上がったということなので、その名前を返します。

返り値に「上がったかどうか」を入れているのが小さな工夫です。 呼び出し側は毎回免状を再計算せず、上がった時だけこよりに祝わせます。

ここでも世界観が仕事をしています。切紙・目録・免許皆伝は実在の言葉なので、説明が要りません。一人前へ近づいていく、というこの講座の筋とも重なります。

やってみる

  1. 想定する相手を3人書く

    「初めての人」「ふつうに遊ぶ人」「研究した人」。自分のゲームでの3人を具体的に書きます。数字より先に人です。

  2. AIに頼む

    claude -p "index.html の相手の強さを選べるようにして。タイトル画面に、手心として、手習い・稽古・真剣の3つのボタンを置く。中身はわざと間違える確率で 0.45 / 0.15 / 0。選んだ値は localStorage に保存して次回も使う。初期値は稽古。あわせて勝ち数を記録して、3勝で切紙、10勝で目録、25勝で免許皆伝の免状を出して。段が上がった時だけお祝いの一言を出す。それ以外は変えないで。"
    
  3. 数字を測って直す

    6-6のシミュレーションで、手習いの確率を変えながら「初めての人に近い置き方」の勝率を出させます。

    間違える確率を 0.15 / 0.3 / 0.45 / 0.6 に変えて、3枚を別々の的へ散らす
    打ち方との対戦をそれぞれ2万回。散らす側の勝率と引き分け率を表で出して。
    

    基準(どのくらい勝たせたいか)は、表を見る前に決めてください。 見てから決めると、どの数字でも正解に見えます。

  4. 確かめる

    • 手習いで数回遊んで、素直な置き方でも勝てる回があるか
    • 真剣で、暗記の置き方が通じないか
    • 3勝目で切紙が出るか。再読み込みしても残っているか
  5. 保存する

    git add .
    git commit -m "手心と免状をつけた。数字は実測から"
    

つまずきどころ

真剣が理不尽に感じる

最善手でも、伏せて同時に出すゲームなので運は残ります。理不尽なのではなく、読み合いだけが残った状態です。それでも勝率が一方的なら、6-6に戻って測り直してください。

難易度で報酬を変えたくなる

「真剣なら2勝ぶん」のような重み付けは、まだやらないでください。どの手心で遊ぶかと、続けた証は、別の軸にしてあります。混ぜると「報酬のために嫌いな難易度で遊ぶ」が起きます。

免状がすぐ出切ってしまう

上限(免許皆伝25勝)に早く着くのは、悪いことではありません。段の間隔を伸ばすより、着いた人がまだ遊ぶ理由(真剣で勝てるか)が残っているかを見てください。

選択肢を増やしたくなる

「鬼」「地獄」を足す前に、想定する相手が本当に4人以上いるかを確かめてください。人がいない難易度は、ただのメニューの行です。

Windows の場合

差はありません。

次の一歩

これで第6章はおしまいです。ルールをデータにし、増やし、画面を整え、保存し、記録し、測って直し、作り直しの判断をし、初見を案内し、入り口を付け、強さを選べるようにしました。

ゲームとしての「三つの的」は、ここでいったん完成です。 次の章では、この作り方そのものをAIへ任せる技術に進みます!

ここまでの三つの的

この講座は、見本ゲーム「三つの的」を術ごとにすこしずつ育てながら進みます。下にあるのはこの術を終えた時点の実物です。そのまま遊べます。

別の画面でこのゲームを開く

術の一覧へ戻る

メルマガ(無料)忖度なしのAI事情を、メールでお届けします。ご登録の方に、プレゼントをお渡ししています