ちょっとした違いで不具合発生!?

聖女の守りのコードを考えてみました。
20180526聖女の守り

聖女の守りの効果 = HPが最大値の半分以上あるとき、「致死ダメージを受けた時 HP1 で生き残る」

if( Damage >= HP ) { //致死ダメージのとき
if( HP >= MaxHP / 2 ) { //HPがMaxHPの半分以上あれば(のつもり)
HP = 1; //聖女有効
}
else{
HP = 0; //聖女無効
}
}

(a) MaxHPが500、HPが250のとき、250 >= 250 成立(聖女有効)
(b) MaxHPが501、HPが250のとき、250 >= 250.5 不成立(聖女無効)
(c) MaxHPが501、HPが249のとき、249 >= 250 不成立(聖女無効)

良さそうですね。(b) のときはHPがMaxHPの半分より小さいので聖女無効。

いやちょっと待って、実はこれはC言語で、HPとMaxHPは整数(int)型なんだ。
「/」は小数点以下切り捨ての割り算だよ。

なんだって!?それじゃあ・・・
(b) のとき、501 / 2 は 250 となり、(a) と同じになって聖女有効になってしまう。

不具合発生!じゃあ、if( HP >= MaxHP / 2 + 1 ) って書いたら?

(a) MaxHPが500、HPが250のとき、250 >= 251 不成立(聖女無効)

ダメじゃん!泥沼化!

これは、if( HP >= (MaxHP +1 ) / 2 ) って書けば良いと思われます。
でも、+1って美しくないなぁ・・・

整数型の場合に割り算して比較というところが怪しいので、割り算しないでやってみましょう。

if( Damage >= HP ) { //致死ダメージのとき
if( HP * 2 >= MaxHP ) { //HPの2倍がMaxHP以上なら
HP = 1; //聖女有効
}
else{
HP = 0; //聖女無効
}
}

(a) MaxHPが500、HPが250のとき、500 >= 500 成立(聖女有効)
(b) MaxHPが501、HPが250のとき、500 >= 501 不成立(聖女無効)
(c) MaxHPが501、HPが249のとき、498 >= 501 不成立(聖女無効)

うん、合ってるっぽい。

プロならば境界部分は必ずテストするので、ドラクエ10の聖女の守りを作るときもテストしたと思われます。

なんでこんなことを考えたかって、僧侶のHP(MaxHP)が偶数の場合と奇数の場合で、天使の守り発動後の聖女の守りが有効か無効か異なる件を考えていました。寝ながら考えましたよ。

HPが偶数か奇数か意識してプレイするって何か変だな、という「感覚」。じゃあ聖女の守りの仕様がおかしい?いやおかしくないよね。合ってる。

おかしいとすれば天使の守りの方だろうな、と思います。MaxHPが奇数のときに、復活後のHPが半分に満たないというのが、怪しい。「HP半分で復活する」が意図した仕様であるなら、実際半分に満たない場合があるのは不具合じゃん?というツッコミができるかも知れません。

時計、強さ予報

Twitter

人気ブログランキング

カレンダー

プルダウン 降順 昇順 年別

09月 | 2018年10月 | 11月
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -


検索フォーム

カテゴリ別アーカイブ

人気記事

ブログランキング

にほんブログ村 ゲームブログ ドラクエ10へ

画像等の著作権

(C)2017 ARMOR PROJECT/BIRD STUDIO/SQUARE ENIX All Rights Reserved.(C)SUGIYAMA KOBO(P)SUGIYAMA KOBO