読者です 読者をやめる 読者になる 読者になる

ふたくちおとこ

クチート大好きな私が、主にポケモンやボドゲに関して書くブログ

努力値の組み合わせを1行コードで生成する

みなさまこんにちは。さっちんです。

最近ハイラルを散策するのに夢中になりすぎて、ポケモンから離れてしまいました。 しかし、2月末にはクチートのメガストーンをちゃんと手に入れ、 さらにシーズン3になったので、ポケモン熱が再び増してきました。

そこで久々にクチートを育成しようと色々調べていたら、こんな記事が。

http://okido117117.hatenadiary.com/entry/2017/03/22/085740okido117117.hatenadiary.com

ふむふむ。と読ませて頂くなかで、こんな言葉を思い出しました。

努力値効率」

例えば「いじっぱり」のAS252振りと「ようき」のAS252振りでは実数値が変わるんだよなぁと、今更ながら考えてしまいました。 しかし、努力値効率についてあまり考えたことがない私にはハードルが高く、 この振り方がベストであると確信が持てませんでした。

そこで、ふと

「確信が持てないなら、努力値の組み合わせ全部でステータスを計算してみればいいじゃないか。」

と思いつきました。

そこで今回は、努力値の組み合わせを生成してみたいと思います。

努力値の仕様

ご存知の方が多いと思いますが、ポケモンのステータスは、 種族値個体値努力値によって決まります。(ポケモン3値とも呼ばれます)。 この中の努力値(Effort Value, 略してev)は以下のような仕様になっています。

  • 仕様
    • HP、攻撃、防御、特殊攻撃、特殊防御、素早さの6種類のステータスに自由に割り振れる
    • 4を振るとステータスが1上がり、以後8振るたびにステータスが1上がる
      • よく、ev = 4 + 8nとなるように振るのが良いと表現される
    • 1つのステータスに割り振れる最大値は252
      • 先程の数式で表現すると、252 = 4 + 8 * 31
    • 全体の最大値は510
      • 先程の数式で表現すると、510 = 4 + 8 * 63 + 2
      • このように必ず2が余るため、最大値は508といっても差し支えない
  • よい例
    • HP=252、攻撃=252、防御=0、特殊攻撃=0、特殊防御=0、素早さ=6
  • 無駄がある例
    • HP=85、攻撃=85、防御=85、特殊攻撃=85、特殊防御=85、素早さ=85

だいたいこんな感じです。

努力値の組み合わせ

上述した数式のnの値を変化させると、あるステータスに振ることができる値が求まります。

n = 0 のとき、 ev = 4 + 8 * 0 = 4
n = 1 のとき、 ev = 4 + 8 * 1 = 12
n = 2 のとき、 ev = 4 + 8 * 2 = 20
…

n = 31 のとき、 ev = 4 + 8 * 31 = 252

全く振らない0を合わせると、あるステータスに振ることができる努力値は以下の33個になります。

0,4,12,20,28,36,44,52,60,68,76,84,92,100,
108,116,124,132,140,148,156,164,172,180,188,
196,204,212,220,228,236,244,252

つまり以下のような組み合わせを生成できるといいのです。

HP 攻撃 防御 特殊攻撃 特殊防御 素早さ 合計
0 0 0 4 252 252 508
0 0 0 12 244 252 508
84 84 84 84 84 92 508
84 84 84 84 92 84 508
252 244 12 0 0 0 508
252 252 4 0 0 0 508

ということで、Kotlinでやってみました。

val ev = mutableListOf<Array<Int>>().also{ result -> (4..252 step 8).toMutableList().apply { add(0) }.let{list -> list.forEach { h -> list.forEach { a -> list.forEach { b -> list.forEach { c -> list.forEach { d -> list.forEach { list.mapTo(result) { arrayOf(h, a, b, c, d, it) } } } } } } } } }

3月1日にリリースされたKotlin 1.1.0に含まれる、alsoを利用しているところがポイントです!

まとめ

今回は、努力値の組み合わせをたったの一行で表現する手法についてまとめました。 全く需要はないと思いますが、著作権はありませんのでご自由にご利用下さい。

p.s. 次回はクチートのステータスを計算するぞー。