【ウディタ講座】命中率の話~気持ちのいい確率とは~

ゲームには「プレイヤーだったときは当たり前すぎて意識しなかったけれど、クリエイター側になったとたん気になってくること」というのが沢山あります。そのひとつが、攻撃したときの命中率です。

命中率をめぐる先行作の工夫や、ちょっとした調整案から遡ってのそもそも論をざっと見ていきましょう。

確率は信用できない。「命中率」ならなおさらだ。

命中率80%の攻撃は当たらない! でも敵からの5%は当たる!
スパロボやFEユーザーのあるあるですね。

バグっているわけではないのです。しかしマーフィーの法則など心理的な作用もあって、実際の確率と体感できる確率は往々にして食い違ってしまいます。

ぶっちゃけてしまえば「80%って、90%ぐらいは当たって欲しい」わけです。

コンシューマーゲームはこんなことをやっている

以上のお話がここらへんでまとまっています。

GBA3作(『封印の剣』、『烈火の剣』、『聖魔の光石』)、『蒼炎の軌跡』、『新・暗黒竜と光の剣』~『覚醒』では、命中表示の数字は%ではない。つまり表示される数値と実際の確率に違いがあり、表示は70でも実際の確率は82%そこそこだよといった具合になっている。

プレイヤーが納得しやすいように、確率をちょっと修正しているということです。つまり、本当に「80%が90%ぐらいは当たるようにしてくれている」ゲームも実際に存在してるわけですね。この方が感覚的には80%は80%っぽいし、5%は5%っぽいのです。

もしも確率が重要なシステムを作るなら、ウディタでもこんなことをした方が快適かもしれませんね。

 

こうした確率の調整は、ユーザーベース(udb)を使ってシンプルに実現できます。

これは上記のニコ百記事にある対応をudbの表にしたものです。

データ数は101個立てています。これがダイスの0~100に対応します。

そして項目(右側)の部分に修正後の%を入れてください。

対応は上のニコ百で言えば、「ダイス0のとき、実効命中率0%」、「ダイス80のとき、実効命中率92%」です。

ウディタには小数がありませんので、ざっくりとした値になりますね。

このudbを一度作ってしまえば、あとはデータベース読み込みの処理を1行挟むだけですね。

■変数操作: CSelf10[ダイス] = 0 ~ 100
■DB読込(ユーザ): CSelf11[実効命中率] = ユーザDB[ 実効命中率 : CSelf10[ダイス] : 差し替え実効命中率% ] (18 : – : 0)

これで「90%ぐらいは当たる80%」が実現します。

感覚的に正しい乱数はおかしな乱数

たとえば、サイコロを6回ふったら、4回ぐらいは違う目が出る気がします。

1が5回続いたりする方がおかしな感じですよね。でも実際は1~6のどの目の出る確率は、何度サイコロを振っても同じ1/6。3回サイコロを振って、「1,2,3」となる確率も「1,1,1」となる確率も同じなのです。

でもやっぱり、均等に結果がバラける方が自然な乱数っぽく感じてしまいます。

人間にとってしっくり来る乱数は、実は正しくない乱数ということですね。

まあ、それでもゲームならば、プレイヤーさんに有利な乱数の偏りをちょっとぐらい入れたっていいのかもしれません。

■変数操作: CSelf10[ダイス] = 0 ~ 100
■条件分岐(変数): 【1】 CSelf10[ダイス] が CSelf11[前回のダイス] と同じ
-◇分岐: 【1】 [ CSelf10[ダイス] が CSelf11[前回のダイス] と同じ ]の場合↓
|■変数操作: CSelf12[再確認ダイス] = 0 ~ 1
|■条件分岐(変数): 【1】 CSelf12[再確認ダイス] が 0 と同じ
|-◇分岐: 【1】 [ CSelf12[再確認ダイス] が 0 と同じ ]の場合↓
| |■変数操作: CSelf10[ダイス] = 0 ~ 100
| |■
|◇分岐終了◇
|■
◇分岐終了◇
■変数操作: CSelf11[前回のダイス] = CSelf10[ダイス] + 0

極端で簡単すぎる例ですが、「同じ結果が連続しにくい」乱数を無理やり作ってみました。

前回と同じ結果が出た場合だけ、「これで決定しちゃう?」かどうかを成否50%で決めなおしています。NO判定が出たら無かったことにして再びダイスロールするわけですね。

まあ一例までに。

命中率自体が不要では?

そもそも「攻撃が当たるかはずれるか」に確率は関係なくたって、いいのかもしれません。

今のようにスマホやパソコンでのゲームが当たり前になる前は、RPGとはTRPGのことでした。テーブルトークロールプレイングゲームですね。実際にみんなで同じ場所に集まって、紙とペンとサイコロでゲームをやっていたのです。

命中率とは、きっとサイコロを振っていたころの名残なのですね。

電子化した現代のゲームでは、ややこしいことは機械に任せてしまえます。

最近のソシャゲ、たとえば『Fate/Grand Order』や、ずばりFEのソシャゲ『ファイアーエムブレムヒーローズ』でも攻撃は基本的に必中で、外れるのは特殊なスキル効果が発動したときだけです。それで問題がないくらい、いろいろなことが今のゲームでは実現できているんですね。

運が絡むこともゲーム性のひとつですから、どこで確率を使い、どこで確率を使わないかの判断は
とても難しく、奥深い命題なのかもしれません。

自作システムを作る場合には頭の隅に置いておくといいのかも。

コメントはお気軽にどうぞ!