こんにちは、カサンドラです。前回に引き続き、今回もツール作成になります。
今回Googleスプレッドで作るのはダメージ計算機です。(もちろん、エクセルでも同様にできます。)
ダメージ計算機は実戦で使うのはもちろん、型を決めるにあたっての努力値、技、性格などの判断にも使います。
今回は実戦で使うより、型検討の段階で試行錯誤する時に使いやすいようなものを作っていきます。
↓前回の記事はこちら
ダメージ計算機を作る
今回も前回のステータス計算機と同様に「仕様検討」「計算式の理解」「実装」「動作確認」という4ステップで進めていこうと思います。
今回の実装の過程でステータス計算機も使うので、実装したい方の中で前回の記事をまだ見ていない場合は前回の記事を御覧ください。前回記事のSTEP3.実装だけ見れば今回の実装はできます。
STEP1. 仕様検討
ダメージ計算にはポケモンのステータスだけでなく、技やフィールド補正など様々な要因が存在するのでステータス計算機よりも複雑になります。
まずはどこまでの機能を実現したいか、仕様を固めていきましょう!
今回は以下のような仕様にしました。
入力1 攻撃側情報
:ポケモン名、努力値(A or C)、個体値、性格補正、能力上昇
入力2 防御側情報
:ポケモン名、努力値(B or D)、個体値、性格補正、能力上昇
入力3 その他情報
:ワザの物理or特殊、ワザ威力、タイプ一致有無、タイプ相性、その他✕倍率、その他÷倍率
出力
:ダメージMIN、ダメージ期待値、ダメージMAX とそれらが体力の何%相当か
(後述しますがダメージは乱数によって幅を持ちます。)
仕様について
わざは、わざ名ではなく威力を入力するようにしました。
威力を覚えている前提になりますが、わざ名を入力するより早いです。
タイプ一致やタイプ相性はよく使うので入力欄を設けました。
一方、エレキなど各種フィールドや急所、特性によるものなどの倍率についてはその他の処理として、全部まとめて✕倍率、÷倍率としました。
これらについては実戦の中でよく使うと思ったものは後から入力欄を作っていこうと思います。
ごちゃごちゃと書きましたが、図式化すると以下のようになります。
STEP2. 計算式の理解
ダメージ計算機を作るにあたっては、計算式を理解する必要があります。
ダメージ計算には様々な要素が加わってきますが、基本的には以下のようになります。
ポケモン攻略データベース(atwiki)より引用:https://w.atwiki.jp/terabi_pokemon/pages/42.html
基本的なダメージ計算式
[{(攻撃側のレベル × 2 ÷ 5 + 2) × (威力 × 攻撃側の攻撃or特攻 ÷ 防御側の防御or特防) ÷ 50 + 2} × 乱数幅(0.85,0.86,…0.99,1.00)] × 一致補正など
※それぞれの括弧ごとに小数点以下を切り捨て
以下、式の内容を簡単に解説します。
攻撃側のレベル × 2 ÷ 5 + 2 の部分 & ÷ 50 + 2 の部分
前者についてはオンライン対戦の場合レベル50固定の関係上、ここは22となります。
後者の値を含め、実装の上では必要ですが、これらの数値を覚える必要はありません。
威力 × 攻撃側の攻撃or特攻 ÷ 防御側の防御or特防
実戦の中ではここが一番大きな影響を及ぼします。
わざ分類が、ぶつりであれば攻撃と防御、とくしゅであれば特攻と特防を参照します。
(ボディプレスやサイコショックなど一部のわざを除く)
乱数幅(0.85,0.86,…0.99,1.00)
ポケモンの運要素の1つ、ダメージ乱数です。
これにより同じ技を同じポケモンに当てても、ダメージが多少前後します。
乱数は0.85~1.00の0.01刻みで16パターンあり、発生確率は同じです。乱数0.85の時にダメージが最も小さく、乱数1.00の時にダメージが最も大きくなります
乱数0.85を引く場合(のダメージ)を最低乱数、乱数1.00を引く場合(のダメージ)を最高乱数などといいます。
人によって最高乱数でも耐える確定耐えを目指す調整や、1/16の確率である最高乱数さえ引かなければ耐えられる最高乱数以外耐えなど、どれだけのリソースを耐久に振るかは分かれます。
STEP3. 実装
実装の流れ
前回作ったステータス計算機を用いて、下図のようにダメージ計算機を作ります。
ここから下はGoogleスプレッドでの実装となります(エクセルでも同様にできます。)
新たに使う計算式については、解説を加えていきます。
入力用・表示用のセルを作る
数値入力、出力用の枠を用意します。
僕は以下のように作成しました。
黄色塗りつぶしは自分で入力するところ、緑塗りつぶしに結果が出力されます。
仕様検討の時は思いつきませんでしたが、防御側の最大HPを表示するとダメージ量を活用しやすいので、追加しました。
(補足)能力上昇、下降について
ポケモンは対戦中に能力の上昇や下降があります。
例えば、わざ『てっぺき』によって防御が2段階上昇したり、特性『いかく』によって攻撃が1段階下降したりします。
これらの上昇下降は最低で6段階下降、最高で6段階上昇まであり、それによって対象ステータスが以下のように増減します。
計算機無しでもある程度の計算ができるようになるので、ぜひとも覚えておきましょう!
上昇段階 | ステータス 倍率 | 下降段階 | ステータス 倍率 | |
0 | ✕1 | |||
+1 | ✕1.5 | ー1 | ÷1.5 | |
+2 | ✕ 2 | -2 | ÷ 2 | |
+3 | ✕2.5 | -3 | ÷2.5 | |
+4 | ✕ 3 | -4 | ÷ 3 | |
+5 | ✕3.5 | -5 | ÷3.5 | |
+6 | ✕ 4 | -6 | ÷ 4 |
この計算機では-6~6を入力するように実装しました。計算処理については後述します。
ステータス計算機を作る(前回分をコピペする)
前回の記事を参考に、ステータス計算機を作ります。
既に作ってある場合はコピペすればほとんど使えます。
青塗りつぶしの部分は入力欄を参照するように数式を変更しましょう。
例えばL5であれば数式欄に「=C5」と入力、N14であれば数式欄に「=F9」と入力します。
(入力内容はレイアウトによって、セルの位置が異なるので参考程度に)
能力上昇、下降の倍率参照表を作る
上で紹介したように、能力上昇段階と倍率は別の数値を取ります。
これをIF文などを使って「-6の時は1/4倍で、-5の時は…」などと分岐させていては、数式が非常に長くなってしまいます。SWITCH文などで多少短くはできますが、それでも大変です。
今回は簡単に参照できるように、以下のような表を作っておきました。
(使い方については次の章で述べますが、VLOOKUP関数で参照します。)
出力1:最大HPを参照する
防御側の最大HPはステータス計算機の結果にあるので、それを参照するだけです。
僕の場合は「=N18」と数式に入力しました。
出力2:ダメージ計算式を作る(最重要!!)
ようやく、今回の肝となる部分に突入します。
最も重要で、最も難しいところだと思うのでじっくり解説していきます。
途中計算用セルを作る
計算式を1行で完結させることもできますが、それだと非常に長くなってしまいデバッグなどが困難になります。
後から確認、修正を行いやすいように途中計算用のセルを設けておきましょう。僕は以下のように用意しました。
順に説明していきます。
レベル関係
”攻撃側のレベル × 2 ÷ 5 + 2”に相当する部分です。通常はレベル50固定ですが、前のバージョンなどではレベル100の対戦などもあったので、後から変えられるように枠を設けました。
枠を設けず数式内で22という数字をそのまま使っても、今の所は問題ありません。
威力とステータス
”威力 × 攻撃側の攻撃or特攻 ÷ 防御側の防御or特防”に相当する部分です。
注意すべきは2つで、わざ分類によって参照元が変わる点、計算の後で小数点以下の切り捨てが必要な点です。
まず先に計算式の例を示します。
計算式例:=SWITCH(C13,”ぶつり”,ROUNDDOWN(D13*O10/P18),”とくしゅ”,ROUNDDOWN(D13*Q10/R18))
1つ目のわざ分類についての分岐はSWITCH文を使います。
※エクセルの場合、SWITCH文はExcel2016以降でのみ対応しています。それ以前のバージョンでは対応していないので、その場合はIF文などで代用ください。
計算式例2:=IF(C13=”ぶつり”,ROUNDDOWN(D13*O10/P18),ROUNDDOWN(D13*Q10/R18)
などでも代用できますが、直感的でわかり易いと感じたSWITCH文を採用しました。
上の文では「C13に”ぶつり”と入力されていたら1つ目のROUNDDOWN、”とくしゅ”と入力されていたら2つ目のROUNDDOWNを採用する」という内容になっています。
2つ目の切り捨てについてはROUNDDOWN関数を使います。
これは( )内の計算結果を小数点以下切り捨てにするものです。
他にもROUND関数で四捨五入にしたり、第2引数に数字を入れると10の位(くらい)などでの切り捨てもできるので、興味のある方は試してみてください。
÷50+2
そのままです。上記同様、ROWNDDOWNを忘れないようにしましょう。
計算式例:=ROUNDDOWN(M34*M35/50)+2
補正前 乱数MIN, AVE, MAX
基本計算式の最後、乱数の影響を加えたものになります。
ROUNDDOWNを忘れずに、ここまでの計算結果に乱数をかけるだけです。
乱数MINの計算式例:=ROUNDDOWN(M36*0.85)
0.85の部分は、乱数AVEについては0.925(0.85と1の間)、乱数MAXについては1にすればOKです。
(乱数MAXについては=M36でも構いません。)
その他 ✕、÷
途中計算の最後です。
乱数計算結果を掛ける割るする前に、まとめておきましょう。
計算式例:=E13*F13*G13/H13
結果を出力する
これで最後です。
上で計算した”補正前 乱数MIN, AVE, MAX”と”その他✕、÷”を計算して出力しましょう
乱数MINのダメージ量 計算式例:=ROUNDDOWN(M37*M40)
乱数AVE, MAXについても、参照先は異なれど同様の式になります。
このダメージ量と最大HPを使えば、以下のようにして割合を求めることもできます。
乱数MINの割合 計算式例:=C22/$C19
上のように$マークを付けておけばAVE, MAXのところへコピペするだけで対応可能です。
(詳しく知りたい方は”エクセル 間接参照”などでググってみてください)
%表示については以下のようなものが数式バー付近にあると思うので、表示の変更を試してみてください。(実装環境によって異なると思いますが。)
STEP4. 動作確認
ツールは作って終わり…ではありません。本当に正しい動作をしているかの動作確認も必要です。
幸い、ダメージ計算ツールはサイト上にもアプリにも多くありますので試しやすいと思います。
下記のように色々と入力を変えて、試してみてください。
チェックポイント(例)
・ぶつりorとくしゅを入力した際、結果が切り替わるか
・努力値、個体値、性格補正などを変えた時に結果も変わるか
・最大HPやダメージ量などに小数点表示が残っていないか
まとめ
今回は対戦前の準備としてGoogleスプレッドシートでダメージ計算機を作りました。
今回のダメージ計算機は最低限の機能を持たせたものなので、今後機能を拡張したりしたいですね!
具体的には、「努力値でよく使う0,252をボタン入力できるようにする」「ぶつりorとくしゅをプルダウンで選択できるようにする」もしくは「わざ名から検索できるようにする」といったことも考えられます。
今回実装いただいた方はせっかくの自作なので、お好みに合わせて色々とカスタマイズしてみてください(^^)
以上です。
コメント