本文へスキップ
alzy.kr
開発日誌

既定の難易度を、勝率のほうに決めさせた

タムナの一人用ボット戦の既定の難易度は中でした。その中が妥当かどうかを裏づける根拠を、私は持っていませんでした。既定値というのは何もしなければ据え置かれる値で、据え置かれているという事実は、それが正しいことの証拠になりません。この日、本番のデータを一度きちんと数えてみて、その既定値を触ることにしました。変えたのは中のボットの強さではありません。「何も選ばなかった人に、どの難易度を渡すか」だけです。数字を見てから決めたこと、あえて触らなかったこと、そして触らなかったせいで残る副作用を、順に書いておきます。

記録日: 2026-08-01

既定値は、何も選ばなかった人が出会う相手だ

タムナで難易度が決まる入口は二つあります。部屋を立ててボットの席ごとに選ぶ画面と、何も設定せずにすぐ始めるクイックスタートです。前者でも席を触らなければ値は入らないので、結局どちらの入口にも「選ばれなかったとき用の値」が要ります。それが既定値です。

既定値は設定項目のひとつに見えますが、私はこれを、いちばん多くの対局を静かに決めている値だと見ています。設定を開いて自分で選ぶ人は、その時点でもう自分の好みを知っている。既定値が当たるのは、まだ何も知らない人か、選ぶ手間をかけたくない人です。つまり既定値とは、こちらが黙って割り当てている相手のことで、そこに間違いがあっても相手側からは「そういうゲームなのだ」としか見えません。だから既定値の妥当性は、私が確かめないかぎり誰も確かめない、と考えました。

ここで問題になるのは、その妥当性を私自身の手応えでは測れないという点です。作った人間はボットが何を見て何を見ないかを知っていて、その知識は対局のあいだ消えません。私が中のボットを相手にどう感じるかは、初めて遊ぶ人がどう感じるかの証拠になりません。既定値だけは、感覚ではないもので決める必要がありました。

手応えではなく、勝率を見た

本番のデータを監査して、人間が一人・ボットが三人という構成の対局だけを取り出しました。そこでの人間側の勝率は54%でした。四人が実力で釣り合っていれば、一人あたりの勝率は25%に落ち着くはずです。54%はその倍を超えています。三人の相手を同時に押しのけて、二回に一回以上勝っている状態です。

この数字から読み取れることは、はっきりしていました。既定の中のボットは、遊び込んだ人の相手として明確に弱い。既定値が中に据えられていたことと、中がその位置にふさわしいことは、別の話だったわけです。25%と54%のあいだの差は、印象で埋められる幅ではありません。

同時に、この数字が万能ではないことも書いておきます。54%は平均で、平均は個人差を消します。始めたばかりで一度も勝てていない人も、中を軽く超えていく人も、同じ一つの数に溶けています。だからこの数字が命じているのは「既定値を一段上げろ」ではなく「全員に同じ既定値を渡すのをやめろ」のほうだと読みました。既定値を固定した一つの値ではなく、その人のこれまでの結果から選ぶ値にする——採った方針はこれです。境界は、自分では控えめだと思う位置に置きました。一人で戦ったボット戦での勝ちが二つです。そこまでは中、そこから先は強を既定にしました。

難易度の定数には触らなかった

いちばん手数の少ない直し方は、中のボットの判断を賢くすることでした。私はその道を選ばず、ボットの思考を決めている定数には一行も触っていません。中を鋭くすれば数字はどこかへ動くだろうと私は思っていますが、どれだけ動くのかは試していないので分かりません。触らなかった理由は、その効き目の大小とは別のところにあります。

理由は、その定数が難易度の意味そのものだからです。中を強くすると、自分で中を選んだ人の相手まで一緒に変わります。その人は「中がいい」と言ったのであって、「中の名前がついた、少し強い何か」を頼んだわけではありません。弱・中・強という三つの名前は、遊ぶ側にとっては約束です。名前を据え置いたまま中身をずらすと、三段階の間隔も、その人が前の対局で覚えた感覚も、静かに壊れます。

そこで、難易度そのものではなく、割り当ての規則だけを変えました。中は中のままで、強は強のまま。変わったのは「何も選ばなかったこの人には、どちらを渡すか」だけです。この切り分けには実務上の利点もあります。もし今回の判断が外れていたら、戻すのは割り当ての側だけで済み、すでに難易度を自分で選んで遊んできた人の対局は最初から一切影響を受けていません。既定値をいじる変更は、既定値の外へこぼれないようにしておくのが安全だと考えています。

選ばれた値は上書きしない

適応が働くのは、二つの入口のどちらでも「選ばれなかったとき」に限りました。誰かが席の難易度を明示的に選んでいれば、その値がそのまま使われます。ここには弱も含みます。勝ちが積み上がっている人が弱を選んでも、勝手に持ち上げたりはしません。

この一点は、機能そのものより優先させました。勝ち数は腕前の代わりに使える程度の数字であって、その人が今日この対局に何を求めているかまでは何も語りません。友人に画面を見せながら軽く回したいのかもしれないし、盤の見え方を確かめたいだけかもしれない。私にはそれが分からないので、分からないことを勝ち数で推測して、はっきり表明された選択を上書きする理由がありません。自動で決めていいのは、誰も何も言わなかった場所だけです。

言い方を変えると、この機能の権限は「空欄を埋めること」までで、「記入済みの欄を直すこと」ではありません。私の経験では、賢くしようとするしくみが信用を失うのは、たいてい後者に手を出したときでした。既定値の改善は、明示的な選択を必ず勝たせるという条件つきでのみ意味があると考えました。

保存しないと決めたものと、残る副作用

実装では、その人がこれまでに一人で戦ったボット戦の勝ち数を、対局の記録からその場で数えています。専用の列を足すことも、そのための移行を走らせることもしていません。適応の材料はすべて、すでに残っている対局の記録から導けるからです。導けるものを別の場所に写して持つと、真実が二つになります。書き換えを忘れた瞬間から、ボットの強さの根拠だけが古い値のまま静かに生き続けることになる。毎回数え直す手間を払うほうを選びました。

数える対象は、序盤で抜けた対局を外しました。始めてすぐ終わった対局を勝ち数に入れると、遊び込んだかどうかとは関係のないものが混ざります。ここで守りたかったのは正確さそのものより、この数を「腕前の代わり」として使う資格のほうです。基準にならない勝ちを足していけば、どんな境界を引いても意味がなくなります。

割り切れていない点も残っています。この設計だと、境界を越えた次の対局から相手が入れ替わります。設定を一度も触っていない人にとっては、自分は何もしていないのに相手だけが変わったように見えるはずです。実際にそれをどう感じたかは、私の側からは分かりません。勝率という平均の外側にいる一人ひとりのことは、数字が教えてくれない部分です。それでも、割り当ての規則が黙って動く以上、その規則を公開しておくのは作った側の務めだと考えています。この記事はその公開でもあります。

タムナ(TAMNA)