これまでの流れとして、本ブログのメインの目的「Pythonプログラミングの上達」のために比較的単純なゲームを再現するということを考え、ドラクエ1のりゅうおう戦を再現してきました。
最初はただ「ゆうしゃのこうげき!」と表示させるところから始まりましたが、Pythonプログラミングに慣れてくるに連れて、ランダムで攻撃の値を変更したりループを取り入れることで、再現性の高いりゅうおう戦を再現できるようになりました。
これまでのシミュレーションの問題点として、HPが48以下になったときにすぐにベホイミをかけて回復というルーチーンだけを考えていました。HP48以下で回復というのは、相手のりゅうおうの攻撃の最大値が48ですので、HPが49以上あるときはゆうしゃがやられることがないからです。
しかしこれだけだと、最後にあと1撃だけりゅうおうを攻撃できるかできないかという微妙な戦闘のときに、HPが47のときにベホイミで回復するかしないかという選択は非常に判断のしづらい場面になります。とくに7時間以上もぶっ続けでドラクエ1をプレイし、クリアまでのタイムを競うRTAという競技では、最後のりゅうおう戦で最良の判断ができるかどうかは、世界記録がでるかでないかのとてつもなく重要な分かれ道になるわけです。
この判断はトップレベルのRTA走者は何度も練習し、感覚的に「攻撃」を選ぶか「ベホイミ」を選ぶかはだいたいわかっています。しかしそれは完全ではありません。おそらくRTAトップ走者でも、ありとあらゆるデータを取り、統計的処理から得られた合理的な判断を下している方はほとんどいないでしょう。現実的には悩む前に操作して進めないとタイムが伸びないからです。
そこでプログラミングの最適化の出番です。戦い方のルーチーンを決めたら、次は戦い方の最適化です。プログラミングの強みはある条件の確率や期待値を求めるだけではありません。条件自体を変えることでいかなる場合でも最良の選択を選ぶように最適化することができます。
ドラクエ1のりゅうおうとの戦闘は「こうげき」か「ベホイミ」しか基本的に選ばないので、非常に単純なコマンド選択です。
しかしどのタイミングでどちらが最高の判断かは非常に難しい問題です。なぜなら最高の判断をするためには次の3つ(大きく分けて)の要素をすべて考慮する必要があるからです。
- 自分のHP
- 自分のMP
- りゅうおうのHP
--------------------------
さて、ここまで非常に長くなってしまいました。
今回はりゅうおう第一形態を倒したときに、ゆうしゃのHPに応じた勝率を求めました。
基本データは以下のとおりです
"""
基礎データ
ゆうしゃ
HP60~115
MP100
こうげきとベホイミのみ
こうげき 6~12のランダム
ベホイミ 85~100のランダム
りゅうおう
HP130
こうげき 24~48
ほのお 42~48
確率半分とする
ルーチーン
HP49以上ならこうげき
HP48以下になったらMPが尽きるまでベホイミで回復
1条件で10万回の戦闘から勝率を求める
"""
プログラムコードは以前の記事を参照ください
基本的に 変数[MyHP]を変えるだけです
結果は以下のようになりました。
グラフを見るとわかりますが、HPが115から97の間は線形的に勝率が減少しますが、減少量は比較的大きくありません。
しかしHPが97のときに勝率が27.3%ですが、HP90になると勝率が16.2%と、HP7違うだけで10%以上も勝率が変わってしまうという結果が得られました。
最初はなだらかな曲線になるのかと思っていましたが、ゆうしゃのHPを変えるだけで複雑なグラフになってしまいました。これはやはり1つの式でまとめるというよりは、統計的に判断するしかなさそうですね。
考察としては、ゆうしゃの最大HPが115、かつ確率の低くなるHP90という値が重要になります。このHPの差は25です。これは竜王のこうげき”ランダムで24~48”という値がキーになってるのではないかと思います。HP91~HP97というのは、りゅうおうの最後の1撃を耐えるか耐えられないか非常に微妙な値ということです。
いやぁ、面白いですね。このデータを出すために50万回以上もシミュレーションで戦ってくれたゆうしゃとりゅうおうに感謝いたしますw
<<< FC版ドラクエ1 りゅうおうとの戦いシミュレーション【Python】 その2
0 件のコメント:
コメントを投稿