運が腕前を1万倍上回っていた
『みんなでわたる。』は7月に公開したゲームです。ゲートを選んで仲間を増やし、最後にボスへ突撃する。それだけの短いゲームなので、公開してからはほとんど触っていませんでした。先日ひさしぶりに何度か遊んで、勝ったり負けたりする理由が自分でも説明できないことに気づきました。
気のせいかもしれない。そう思って、具体的な数値を測ってみることにしました。
「常に正解を選ぶ」プレイを何千回もやらせる
ゲートの二択は、その場で人数が多くなる方を選べば正解です。人間が迷うところですが、プログラムなら間違えません。そこで、ゲートの生成ロジックだけを切り出して、ステージごとに数千回、常に正解を選び続けるプレイをシミュレータにて回してみました。
結果がこれです。
| ステージ | 最小 | 中央値 | 最大 |
|---|---|---|---|
| 5 | 64人 | 3,404人 | 51,264人 |
| 8 | 19人 | 2,048人 | 197,904人 |
ステージ8の行を二度見しました。まったく同じ「常に正解を選ぶ」プレイで、19人のときと197,904人のときがある。1万倍です。
つまり、結果を決めていたのはゲートの引きでした。上手く選んでも、下手に選んでも同じ。プレイヤーの判断が入る余地は、この振れ幅の中に埋もれていたわけです。自分で遊んでいて勝敗の理由が説明できなかったのは、当然でした。
×2が出るかどうかが全てだった
原因はすぐ分かりました。ゲートには「+5」のような加算と「×2」のような倍率があって、倍率が出るかどうかが完全に運だったのです。
ゲートは1ステージに12回あります。×2を4回引けた回と1回しか引けなかった回では、倍率だけで8倍の差。最終的な人数で測っても6.4倍でした。しかも人数は次のステージへ持ち越されるので、差はそこから雪だるま式にふくらみます。
ついでに、もっと恥ずかしい数字も出てきました。ステージ1では92%のゲートが「どちらを選んでも増える」組み合わせだったのです。二択ですらない。最初の1〜2ステージは、実質ただ眺めているだけのゲームでした。
逆に後半は、両方マイナスの二択がステージ10で27%、13で35%まで増えていました。到達できる人数をボスのHPで割ると、ステージ5では17.7倍あった余裕が、8で5.1倍、10で2.8倍、13で1.4倍まで痩せます。勝率にすると99%、89%、71%、57%。人数を次へ持ち越しながら通しで遊ばせると、常に正解を選び続けても中央値はステージ10で止まりました。序盤は退屈で、後半は理不尽。我ながらひどい。
運を「値」だけに閉じ込める
ここで手が止まりました。ランダム性を減らせば安定はしますが、同時に毎回同じ展開になってつまらなくなります。どこまでを運に任せるべきなのか。
しばらく考えて、区別するべきなのは「機会」と「値」だと思い当たりました。
倍率ゲートが出るかどうか(機会)が運だと、プレイヤーは何もできません。でも、倍率がいくつか、どちらの側に出るか(値)が運なのは、判断の材料になるだけで理不尽ではない。
そこで、ゲートの「型」を8個で1周する固定の順番にしました。伸び幅を比べる回、マイナスを避ける回、倍率の回、割合の回。どのプレイでも同じ機会が同じ順番で来ます。運が残るのは、その中の数字と左右だけ。
計測し直したら、ステージ8の結果はこうなりました。
| 最小 | 最大 | 開き | |
|---|---|---|---|
| 直す前 | 19人 | 197,904人 | 約1万倍 |
| 直した後 | 1,148人 | 1,518人 | 1.3倍 |
ここまで落ちるとは思っていませんでした。
今度は選ぶ意味が消えた
安心したのも束の間で、次の問題が出ました。人数が多くなると、倍率ゲートの「×2」が常に正解になってしまうのです。1万人いるときの「+30」は誤差でしかありません。型は巡ってくるけれど、答えは毎回同じ。
直し方は、倍率どうしを戦わせることでした。「×2(安全)」と「×3(ただし次のゲートは必ず両方1/2)」の二択にする。差し引きは×3→×1.5。惰性で毎回リスクを取っても得はしません。
ただ、ここは狙いどおりになっていませんでした。1手先まで見るシミュレータの最適プレイは、賭け側を一度も選びません。2.0対1.5で安全側が3割よく、人数が少ないほど倍率が上がる補正(×4対×5)が掛かる場面ではその差が6割まで開きます。互角にしたつもりで、互角になっていない。
それでも、腕前は結果に出るようになりました。伸び幅を比べる回とマイナスを避ける回が効いているぶんです。正解を選べる確率を変えてシミュレータを回すと、到達ステージの中央値は常に正解ならS11、85%ならS5、65%ならS4。差がつきます。
ボス戦が1.5秒で終わっていた
ここからは、直したあとに自分で遊んで気づいたことです。
まず、クリアの効果音が聞こえない。おかしいなと思って局面ごとの時間を測ったら、ボス戦が1.5秒で終わっていました。BGMがボス曲に切り替わった直後にクリアのジングルが鳴るので、重なって聞こえなくなっていたのです。音の不具合だと思って音を調べていたら、原因はテンポでした。
直そうとして、最初は発射の間隔を計算で伸ばしました。これが失敗で、大群のときに間隔が下限に張り付いて、今度は15秒近くかかるようになりました。正しくは、間隔ではなく1発で送り出す人数をボスのHPから割り出すことでした。60発で倒せる量にすれば、規模が違っても6秒で収まります。
あと、倒した瞬間にリザルト画面へ飛んでいたので、群れが前へ駆け抜ける1.4秒を足しました。倒した手応えは、数字ではなく時間で作るものらしいです。
自分でつくった罠
白状すると、この作業中に自分で仕込んでしまったバグもあります。
「+50%」という新しいゲートを足したのに、描画のコードを直し忘れて「−50」と赤色で表示していました。増えるゲートなのに、見た目は減るゲート。自分で遊んでいて「マイナスを踏んだのに減らない」と首をかしげ、しばらくロジックの方を疑っていました。数字を出す処理は完璧に動いていて、間違っていたのは色と文字だけでした。
もうひとつ。画像を軽くするためにpngをwebpへ一括変換したとき、img/${key}.png のように変数を含む書き方の参照だけ置換から漏れて、別のゲームの味方が全部壊れ画像になっていました。src="img/foo.png" のような静的な書き方は目でも機械でも見つかるのに、組み立て式は見落とします。
正直、この2つはどちらも「測る」以前の話です。数字を疑う前に、画面を見ればよかった。
後日談: 天井のほうが取り残されていた
ゲートを直した2日後に、もうひとつ直しました。群衆の上限が1000万人だったのですが、これは「×2を毎回取れる」旧設計の名残です。1ステージ8倍で伸びるなら、7〜8面で天井に当たる。型を固定して伸びを1ステージ3.3倍まで落としたのだから、上限はもう余っているはずでした。
3,000回通してみたら、17.5%が1000万人に張り付いていました。中央値も824万人。伸ばした先を天井が削っていたわけです。1億に上げると、そこへ届くのは3,000回のうち34回(1.1%)になり、中央値は3,494万人まで伸びました。到達ステージの中央値も、S10からS11へ動いています。ついでに称号を1段足しました。1000万人で「つきまでつづく」。
計測する道具を作っても、当てていない箇所は結局ぬけます。伸び率ばかり見ていて、その伸びを受け止める側の数字を見ていませんでした。
測ってよかったこと
今回いちばん効いたのは、公開済みのゲームをもう一度計測し直したことでした。作っているあいだは何度も遊ぶので気づかない。しばらく離れてから遊ぶと、勝敗の理由が説明できないことに気づけます。
そして「なんとなく運ゲーだな」で終わらせずに数字にしたから、直す場所が分かりました。1万倍という数字が出てこなければ、たぶん難易度を調整して終わっていたと思います。原因は難易度ではなく、運の置き場所でした。
この作り直しは公開済みです。遊んでみて「引きが悪かった」と感じたら、それはたぶん私の設計がまだ甘いということなので、また計測し直そうと思います。