第五章 システムとバランスNo.041
動的難易度調整
Dynamic Difficulty Adjustment別名 難易度の自動調整、DDA
概要
遊んでいるあいだのプレイヤーの結果(負けた回数、かかった時間、受けたダメージなど)を測り、敵の強さや数、回復の量などを自動で変える仕組み。同じ所で負けが続く人には易しくして行き詰まる長さを縮め、負けない人には調整をかけない。下げた難しさをいつ戻すかを決めておかないと、手加減が続いたり、わざと負けて易しくする遊び方を招いたりする。
使われる場面
- 面が順に並ぶアクションゲーム
- 同じ面で続けて負けた回数を数え、決まった回数に届いたら敵の攻撃力や数を少し下げる。1 回で越える面が続いたら、下げた分を少しずつ戻す。
- 敵が波で押し寄せる戦い
- 前の波で受けたダメージや残った体力を測り、次の波の敵の数を増やすか減らすかを決める。
- 体力が減ったときの回復
- 体力が少ないときほど、倒した敵が回復の品を落としやすくする。敵の動きは変えずに、立て直しやすくする。
- パズルの問題の出し方
- 1 問にかかった時間やヒントを見た回数を測り、次に出す問題の手順の数を増やすか減らすかを決める。
- 負けが続いたときの提案
- 自動で変える代わりに、同じ所で何度も負けたら易しい設定に切り替えるかをプレイヤーに尋ねる。
判断基準
| こういうとき | こうする |
|---|---|
| 同じ所で何度も負けて、先へ進めなくなる人がいる | 同じ面で続けて負けた回数を数え、3〜5 回に届いたら難しさを 1 段下げる。下げるのは元の難しさから決めた幅までにする。 |
| 易しくしてもらっても、次の面でまた行き詰まる | 面を越えるたびに元の難しさに戻している。上達の遅い人は次の面でも追いつかないので、下げた分は 1 回で越える面が続いてから少しずつ戻す。 |
| 一度負けが込んだだけなのに、その後の面がずっと易しい | 下げた難しさを戻していない。1 回で越える面が続いたら 1 段ずつ戻す。 |
| わざと負けると易しくなり、わざと負けたほうが楽に進める | 下げた分を戻す条件と下げる幅の上限を決める。負けた回数だけでなくどこまで進んでから負けたかや与えたダメージも測り、すぐに負けた回は数えない。 |
| 手加減されている気がして、勝ってもうれしくない | 1 回に下げる量を小さくし、下げるまでの連敗の回数を増やす。自動で下げる代わりに、易しい設定に切り替えるかを尋ねる。 |
| 上手な人には簡単すぎて退屈 | 1 回で越える面が続いたら元の難しさより上げる。上げる幅には上限を付け、ふつうの人の難しさまで上がっていないかを確かめる。 |
| 難しさが変わるので、上達しているのかわからない | 変えるのは受けるダメージや回復の量にとどめ、覚えることになる敵の動きや足場の配置は変えない。 |
| ある 1 か所だけで、多くの人が行き詰まる | 調整を入れる前に「難易度曲線」を見直し、その面の上げ幅を手前の面に分ける。 |
遊んでこう感じたら
指示の例
11 面目で何度やっても負け続けて、やめたくなった。動的難易度調整を入れて、同じ面で 3 回続けて負けたら敵の攻撃力を 1 割下げ、下げるのは 3 割までにして
一度負けが込んだら、その後の面がずっと簡単なまま。動的難易度調整で下げた難しさを、1 回で越えた面が 3 面続くごとに 1 段ずつ戻して
わざと負けると敵が弱くなるので、わざと負けたほうが楽に進める。動的難易度調整で下げた難しさは面を越えたら元に戻し、下げるのは 2 段までに抑えて
敵が急に弱くなって、手加減されている気がする。動的難易度調整で自動で下げるのをやめて、同じ所で 5 回負けたら易しい設定に切り替えるかを尋ねて
上手な人には簡単すぎて退屈。動的難易度調整を上げ下げの両向きにして、1 回で越えた面が 3 面続いたら敵の数を 1 体増やし、増やすのは元の数の 2 割までにして
詳細
遊んでいる様子に合わせて難しさを変える
「難易度曲線」は面ごとの難しさを前もって決めた並びである。しかし、プレイヤーの腕前と上達の速さは人によって違う。同じ並びでも、ある人は同じ面で負け続け、別の人には簡単すぎる。そこで、遊んでいるあいだの結果を測って難しさを自動で変える。この仕組みを動的難易度調整と呼ぶ。
作るときは次の 5 つを決める。
- 何を測るか:同じ所で続けて負けた回数、1 つの面にかかった時間、受けたダメージや残った体力など。
- 何を変えるか:敵の攻撃力や体力、敵の数や速さ、回復の品の量、制限時間など。
- いつ変えるか:同じ面で 3 回続けて負けたら、のような条件。
- どれだけ変えるか:1 回に変える量と、元の難しさから変えてよい幅。
- いつ戻すか:面を越えたら戻すか、少しずつ戻すか、戻さないか。
デモのモデル
デモの 2 つの段はどちらも 20 面で、面ごとの元の難しさは同じである。難しさは 1 面目の 1 から 1 面ごとに 0.2 ずつ上がり、11 面目だけは 2.2 上がる。10 面目の 2.8 が 11 面目で 5.0 になり、20 面目は 6.8 である。
上の段は調整しない。下の段は同じ面で決まった回数(連敗の回数)続けて負けたら、難しさを 1 段下げる。既定では 3 連敗ごとに 0.5 下げ、下げるのは元の難しさから 2 までにする。下げた分は既定では少しずつ戻す。1 回で越えた面が連敗の回数と同じ数(既定では 3 面)続いたら、1 段戻す。
白い腕前の線は、プレイヤーのモデルに段ごとに遊ばせて描いている。モデルの規則は「難易度曲線」のデモとほぼ同じで、人ごとに腕前が違う点だけが異なる。値はこのデモで決めたもので、遊んだ人を測ったものではない。
- 越える確率:1 回挑んで面を越える確率は難しさから腕前を引いた差で決まる。差が 0 なら 73%、0.5 なら 50%、1 なら 27%、2 なら 5% である。腕前が難しさを 1 上回っていれば 95% になる。
- 上達:越えても負けても、1 回挑むごとに腕前が上がる。負けたら同じ面に挑み直し、途中でやめない。
- 人ごとの違い:最初の腕前(0.5〜1.5)と 1 回挑むごとに上がる量(0.1〜0.3)は、人ごとに乱数で決める。最初の腕前が高い人ほど上達も速い。最初の腕前が 0.5〜0.83 の人を苦手な人(300 人のうち 92 人)、0.83〜1.17 の人をふつうの人(114 人)、1.17〜1.5 の人を得意な人(94 人)と呼ぶ。
- 乱数:面ごとに別のシード付きの乱数を使い、2 つの段で同じ列を使う。同じ人が同じ面に n 回目に本気で挑むとき、どちらの段でも同じ値を引く。
- わざと負ける:画面の「負ける」を押すと、乱数を引かずに負ける。腕前は上がらない。下の段は本気で負けたときと同じように連敗に数える。
行き詰まる人を減らす
下のグラフは同じモデルで 300 人が遊んだときの、20 面を越えるまでの挑戦の回数の分布である。自動再生で見せているのは、この 300 人のうちの 3 人である。以下の数値は操作パネルが既定のとき(少しずつ戻す、連敗の回数 3 回、下げる量 0.5)のものである。
調整のない上の段は平均 34.2 回だが、分布の右に長い裾が伸びる。50 回を超える人が 27 人いて、いちばん多い人は 65 回である。裾にいるのは苦手な人で、平均は 46.9 回である。11 面目の段差で腕前が追いつかず、苦手な人の 92 人のうち 38 人は 11 面目か 12 面目で 10 回以上続けて負けている。
下の段では平均が 31.1 回になり、いちばん多い人も 47 回に減る。1 人ごとの最長の連敗(1 つの面で続けて負けた回数のうち、いちばん多いもの)は平均 5.2 回から 3.7 回になる。10 回以上続けて負ける人は 41 人から 2 人になる。
調整がかかるのは負けが続いた人だけである。苦手な人の挑戦の回数は平均 46.9 回から 39.2 回に減り、20 面のうち平均 11.8 面を元より低い難しさで越える。得意な人は 24.6 回が 24.4 回とほとんど変わらず、94 人のうち 69 人には一度も調整がかからない。同じ規則でも、腕前の違う人はそれぞれ違う難しさの並びを遊ぶことになる。
自動再生の 1 人目は苦手な人で、上の段では 11 面目で 16 連敗する。開いた直後から 2 つの段の違いが見えるよう、1 人目は 18 回挑んで 10 面目に着いたところから見せている。下の段は 7 面目ですでに 1 回下がっていて、この後 11 面目(2 回)と 12 面目でも下がる。11 面目は 6 連敗で越える。20 面を越えるまでの挑戦は 42 回で、上の段の 54 回より 12 回少ない。2 人目はふつうの人で、上の段は 11 面目で 8 連敗する。下の段は 11 面目で 1 回下がって 4 連敗で越える。12〜14 面目を 1 回ずつで越えたので、15 面目から元の難しさに戻る。3 人目は得意な人で、どの面でも 3 連敗しないので 2 つの段はまったく同じに進む。
いつ戻すか
下げた難しさの戻し方は、操作パネルの「戻し方」で選べる。どれも下げ方は同じで、違うのは戻し方である。
- 越えたら戻す:面を越えたら元の難しさに戻す。
- 少しずつ戻す:1 回で越えた面が連敗の回数と同じ数だけ続いたら、1 段戻す。元の難しさより上げない。
- 戻さない:下げたままにする。
- 上げ下げ:少しずつ戻すと同じ条件で 1 段上げ、元の難しさより 1 高い所まで上げる。
「越えたら戻す」では最長の連敗は平均 3.9 回に減るが、挑戦の回数の平均は 33.8 回で上の段とほとんど変わらない。下がるのは負けが続いた面だけで、苦手な人が元より低い難しさで越える面は平均 4.0 面である。下げてもらって 11 面目を越えても、腕前は元の難しさに追いついていない。11 面目で難しさが下がった苦手な人は 76 人で、12 面目に着いたときの難しさと腕前の差は平均 1.6 ある。76 人のうち 55 人は、元に戻った 12 面目でまた 3 連敗する。苦手な人の挑戦の回数は 46.9 回から 46.1 回にしか減らない。行き詰まるのが特定の 1 面だけならこの戻し方でも足りるが、上達の遅れを補うには下げた分を先の面まで残す。
「戻さない」では平均が 30.4 回、いちばん多い人が 45 回で、4 つの中でいちばん減る。その代わり、一度下がった難しさはその後の面でもずっと低い。ふつうの人は 20 面のうち平均 8.6 面を、得意な人も 2.5 面を元より低い難しさで越える。一度だけ運悪く負けが込んだ人も、残りの面は易しいままになる。「手加減されている気がして、勝ってもうれしくない」という感想が出るなら、下げたままになっていないかを確かめる。
「少しずつ戻す」はその中間である。1 回で越える面が続き、腕前が追いついたとみなせるようになってから戻す。元より低い難しさで越える面はふつうの人で 6.8 面、得意な人で 1.4 面になる。
「上げ下げ」では得意な人の難しさも上がる。得意な人は 20 面のうち平均 15.9 面を元より高い難しさで越え、挑戦の回数は 24.6 回から 27.3 回に増える。着いたときの腕前が難しさを 1 以上上回っていた面は 1 回で越える確率が 95% 以上になり、手応えがない。得意な人のこうした面は 3.2 面から 1.1 面に減る。分布は両側から縮む。回数の少ないほうから 1 割の所は 24 回から 26 回に、多いほうから 1 割の所は 50 回から 42 回に動く。ただし、ふつうの人も 8.5 面で元より高い難しさになる。ふつうの人の挑戦の回数は 31.7 回から 32.4 回に増える。上げるのは、1 回で越える面が長く続いたときだけにする。
連敗の回数と下げる量
連敗の回数を少なくするほど、調整は早くかかる。操作パネルで 2 回にすると、平均は 30.0 回で最長の連敗は 3.1 回になる。その代わり、得意な人の 94 人のうち 64 人に調整がかかる(3 回なら 25 人、5 回なら 4 人)。1 回で越える確率が 73% の面でも、2 回続けて負ける確率は 7% ある。面の数が多ければ、得意な人でもどこかで 2 連敗する。
1 回に下げる量を大きくするほど、1 回の調整で越えやすくなる。連敗の回数を 3 回のまま下げる量を 1.0 にすると最長の連敗は 3.2 回、0.25 にすると 4.2 回である。ただし、下げる量が大きいほど下げる前と後の違いがプレイヤーに見えやすくなる。連敗の回数は 3〜5 回にし、下げる量は小さく始めて遊んで確かめる。
調整の弱点
負けた回数だけを測る調整は、本気で負けたのかわざと負けたのかを区別できない。デモの下の段で「負ける」を 3 回押すと、本気で負けたときと同じように難しさが下がる。既定の設定では、12 回わざと負ければ 2 まで下げられる。
自動再生の 2 人目は 11 面目に着いたときの難しさと腕前の差が 1.9 で、1 回で越える確率は 6% である。ここで 12 回わざと負けてから挑むと、差は −0.1 になって確率は 76% に上がる。「戻さない」なら、この後の 9 面もすべて 2 低いままである。わざと負けた 12 回を含めると挑戦は 34 回で、正直に挑んだときの 29 回より多い。しかし、本気で挑んで負けた回数は 9 回から 2 回に減る。わざと負けるのにかかる時間が本気で挑むより短ければ、わざと負けたほうが楽に進める。同じことをしても「少しずつ戻す」なら本気で負けた回数は 10 回から 4 回に、「越えたら戻す」なら 12 回から 11 回に減るだけである。下げた分を早く戻すほど、わざと負けて得るものは減る。測るものも負けた回数だけにせず、どこまで進んでから負けたかや敵に与えたダメージを合わせて見る。すぐに負けた回は連敗に数えない。
調整に気付いたプレイヤーは、勝っても自分の力で勝ったと思えないことがある。1 回に下げる量を小さくし、連敗の回数を多めにすると調整は目立ちにくくなる。変えるものも、敵が急に遅くなるような目に見えるものより受けるダメージや回復の品の出方のような目立ちにくいものを選ぶ。
難しさが変わると、越えられたのが上達したからなのか易しくなったからなのかをプレイヤーが見分けられない。デモの下の段でも、腕前の線と難しさの線が両方動く。覚えることになるもの(敵の攻撃の順番、足場の配置)は変えず、失敗を許す幅(受けるダメージ、回復の量、制限時間)だけを変える。
黙って変えるか、尋ねるか
調整には黙って変える作りのほかに、変えたことを見せる作りと、変えるかをプレイヤーに尋ねる作りがある。
- 黙って変える:プレイヤーは調整を知らないまま遊ぶ。先へ進めることを優先するゲームに向く。
- 変えたことを見せる:「敵の攻撃を弱くしました」のように知らせる。プレイヤーは何が変わったかを知ったうえで遊べる。
- 尋ねる:同じ所で何度も負けたら、易しい設定に切り替えるかを尋ねる。切り替えるかはプレイヤーが決めるので、自分の力で越えたい人は断れる。
尋ねる作りでも、何回負けたら尋ねるかはデモの連敗の回数と同じように決める。断った人に同じ面で毎回尋ねると手加減を勧められ続けることになるので、尋ねるのは 1 つの面で 1 回にする。
作り方と確かめ方
デモの下の段の「少しずつ戻す」は次のように作っている。
// adj は元の難しさに足す値(下げていれば負)。losing は今の面で続けて負けた回数、firsts は 1 回で越えた面が続いた数
function onLose() {
losing += 1;
if (losing >= STREAK) {
losing = 0;
adj = Math.max(-MAX_DROP, adj - STEP); // 下げるのは元の難しさから MAX_DROP まで
}
}
function onClear(firstTry: boolean) {
losing = 0;
firsts = firstTry ? firsts + 1 : 0;
if (firsts >= STREAK) {
firsts = 0;
adj = Math.min(0, adj + STEP); // 1 段戻す。元の難しさより上げない
}
}
AI に作らせたゲームで調整を入れたら、面ごとに負けた回数とそのときの調整の値を記録させる。記録を並べると、調整がどの面で何回かかっていつ戻ったかがわかる。多くの人で同じ面に調整がかかっているなら、その面は難易度曲線の段差である。
ほかの用語との関係
「難易度曲線」は面ごとの難しさを前もって決めた並びで、動的難易度調整はその並びを遊んでいる人に合わせて動かす。デモの 11 面目のような段差は、調整に頼る前に上げ幅を手前の面に分けてならす。動的難易度調整は、ならした後に残る人ごとの差を埋めるのに使う。
「ラバーバンド」はレースなどで、先を行く相手との差が開くほど後ろの走者を速くする調整である。動的難易度調整はプレイヤー自身の結果を測り、ラバーバンドは相手との順位や距離を測る。
「天井」は乱数で当たりを出すとき、外れが決まった回数続いたら次を必ず当たりにする仕組みである。失敗の連続に手を打つ点が動的難易度調整と似ている。天井は当たりの確率を変えずに外れの連続に上限を付ける。動的難易度調整は難しさを下げて越えやすくするだけである。下げた後も負けることはあり、連敗の長さに上限はない。
「チェックポイント」は負けたときに戻る位置である。チェックポイントは 1 回負けたときに失うものを減らし、動的難易度調整は負ける回数を減らす。行き詰まる所では両方を使う。
負けが続く理由が操作や仕掛けを知らないことなら、難しさを下げても越え方はわからない。その場合は調整より先に、ヒントを出すか「チュートリアル」で仕掛けを安全な場所で試させる。