ポケモン剣盾のダメージ計算ツールを作りたいお話 その2

Python
スポンサーリンク

 

2020/02/28 追記

====================

完成しました!

====================

 

前回記事がなぜか意外と多くの人に閲覧してもらっているようで、非常にありがたい反面

これでもう逃げれねえな

という背水の陣的な状況に(勝手に)おちいってしまったと感じました。

反響があるのはありがたいので、少しずつ進めていこうと思います。

 

PokeDefCalc

ポケモン剣盾用の耐久努力値調整ツールを作成しました! ぜひ使ってみてください!

スポンサーリンク

プログラミング言語

前回、C#かPythonか、と言っていましたが、

将来的にWEBアプリケーション化したいということを考慮して、Pythonで書くことにしました。

というか、久しぶりにC#いじったら、型宣言ガチガチすぎて自分の頭ではうまくいかなさそうだったので・・・

昔はC#よく使ってたんですけどね・・・Pythonに慣れたら全然書けなくなったわ

あと、Pythonはライブラリが豊富で導入もpipで簡単、というメリットもありますしね。

 

今回の目標

取り合えず、ダメージ計算の手前まで。

具体的にはポケモンのステータス計算までを作成したい。

前回、ポケモンデータシートまでは作成したので、ステータス計算までなら簡単に実装できそうですし。

まずは着手しやすいところからやっていきましょう。

 

設計

ダメ計ツールの全体設計をざくっとまとめました。

中学生でももっとまともな構成図作るぞって突っ込まれそうですがおっしゃるとおりです。

言いたいことは、

  • それぞれの役割を持たせたライブラリ(的なもの)を作る
  • ライブラリ同士は干渉しない(例えば、ダメージ計算ライブラリでステータス計算ライブラリの関数は使用しない)
  • 全てのライブラリにアクセスできる管理プログラムにてダメ計を行う

って感じです。

よくあるソフトウェア開発手法ですね。

こういうのなんていう開発手法だっけか・・・・カプセルなんちゃらではなくて・・・

 

ステータス計算ライブラリを作ってみる

要件

要件定義。

とはいえ今回は単純。

ポケモンの種族値、個体値、努力値、レベル、性格補正を入力するとステータスが算出される

ということだけ。

引数は全てint(もしくはfloat)

まあ型はPython側が勝手に判断してくれるので楽です。

「え、ポケモンの名前入れたら勝手に種族値とか計算してくれるようにしないの?」

と突っ込まれそうですが、その処理は別のライブラリに任せようと思っているので、

今回は数値を入力すると数値が出てくる、というだけで良いです。

 

計算式

最大HP
(種族値×2+個体値+努力値÷4)×レベル÷100+レベル+10
こうげき・ぼうぎょ・とくこう・とくぼう・すばやさ
{(種族値×2+個体値+努力値÷4)×レベル÷100+5}×せいかく補正
備考
小数点以下は計算のたびに切り捨て
ヌケニンのHPは例外処理されて1にしかならない

https://wiki.xn--rckteqa2e.com/wiki/%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9

ポケモンwikiから引用。

単純な計算式なので、プログラミング勉強にも使えそう。

 

プログラミング

さくっと作ってみました。

# coding:utf-8

import math

### HP計算式(種族値、個体値、努力値、レベル)
def calcHitPoint(_base, _indv, _eff, _level):
  result = _base * 2 + _indv
  effpoint = math.floor(_eff / 4) # 切り捨て処理
  result = math.floor((result + effpoint) * _level / 100) + _level + 10
  return result

### Hp以外のステータス計算式(種族値、個体値、努力値、レベル、性格補正値)
def calcStatus(_base, _indv, _eff, _level, _nature):
  result = _base * 2 + _indv
  effpoint = math.floor(_eff / 4) # 切り捨て処理
  result = math.floor((result + effpoint) * _level / 100) + 5
  result = math.floor(result * _nature) #性格補正処理
  return result

小数点切り捨てとかを実装するためにmathライブラリをimport。

HPを計算する式とそれ以外の計算式が違うので、関数は2つ用意。

関数を分けすぎるのも嫌ですが、無理して合算させるのも個人的に可読性が低くなる可能性があるのでこれぐらいがちょうどいいかな?と思います。

あと、変数名とかは全部てきとー。

何ならa, b, cとかにしようと思ったけど未来の自分に怒られそうな気がしたので、必要最低限分かるよう単語をチョイス。

なお英語偏差値は30。TOIEC点数は295点

鉛筆転がしたほうが高い点数取れるじゃねえか・・・

 

関数名って、何か返す場合はget~ってやることが多いんだけど、個人的にgetとかsetってプロパティをいじるときに使う関数だと思っているので今回はこんな感じの関数名に。

あとはキャメルでもスネークでもどんな書き方でも良いと思います。

個人的にはキャメル型が好き。

関数や変数の命名規則も特に決めてないので、多分完成したときの可読性は著しく悪いと予想されます。

グローバルな命名規則なんかも把握していないし。趣味プログラマだから仕方ない()

引数に使う変数は最初にアンダーバーをつけるようにだけ気を付けています。

 

テスト

main関数を書いて、テストしてみます。

今回入力する数値はこちら

  • ポケモンはタチフサグマ(種族値:93-90-101-60-81-95)
  • 個体値は6V
  • 努力値はH252 B252 S4
  • レベル50
  • 性格はわんぱく

こう見るとタチフサグマの種族値優秀ですね・・・

ミミッキュ抜けないのが残念過ぎますけど。

# coding:utf-8

import math

### HP計算式(種族値、個体値、努力値、レベル)
def calcHitPoint(_base, _indv, _eff, _level):
  result = _base * 2 + _indv
  effpoint = math.floor(_eff / 4) # 切り捨て処理
  result = math.floor((result + effpoint) * _level / 100) + _level + 10
  return result

### Hp以外のステータス計算式(種族値、個体値、努力値、レベル、性格補正値)
def calcStatus(_base, _indv, _eff, _level, _nature):
  result = _base * 2 + _indv
  effpoint = math.floor(_eff / 4) # 切り捨て処理
  result = math.floor((result + effpoint) * _level / 100) + 5
  result = math.floor(result * _nature) #性格補正処理
  return result
  

def main():
  base = [93, 90, 101, 60, 81, 95] # タチフサグマ
  effort = [252,0,252,0,0,4] # H252 B252 S4
  indv = [31, 31, 31, 31, 31, 31]
  level = 50
  nature = [1,1.1, 0.9, 1, 1] # わんぱく
  
  hp = calcHitPoint(base[0], indv[0], effort[0], level)
  atk = calcStatus(base[1], indv[1], effort[1], level, nature[0])
  dfn = calcStatus(base[2], indv[2], effort[2], level, nature[1])
  spatk = calcStatus(base[3], indv[3], effort[3], level, nature[2])
  spdfn = calcStatus(base[4], indv[4], effort[4], level, nature[3])
  spd = calcStatus(base[5], indv[5], effort[5], level, nature[4])
  
  print('タチフサグマ', hp, atk, dfn, spatk, spdfn, spd)
  

if __name__ == "__main__":
  main()

出力結果

タチフサグマ 200 110 168 72 101 116

お、なんかうまくいってそう。

一応、ポケモン徹底攻略様のステータス表と見比べても問題なさそうです。

 

所感

プログラミングの初歩的な知識だけで実装できるので、プログラミングの勉強にもってこいだと思いました。いやまじで。

「今からプログラミングを勉強したい!でも何を作ろうか決まってないし・・・」

みたいな人はダメージ計算ツール、めっちゃ取り組みやすい課題やもしれません。

ステータス計算だけなら10行程度で(多分効率化すればもっと少なくできる)書けてしまうので、勉強がてら色々な言語で作ってみるとか、最小文字数で作ってみるとか面白いかも。

 

次の展望

ダメ計本体を作りたいぜーーー

 

計算式

 

(^q^)!!!!????!?!!!?wwww!!!???!?!?!?!!!ww!??!!wwwwwwww

 

時間かかりそー

 

コメント

タイトルとURLをコピーしました