ishida

2014.02.27

ポケモンをOOPしていく(その1)

ご挨拶

「yaccとlex」のネタで記事を書いてみたものの、このサイトの劣化コピーでしかなくなったために自主的にボツって書き直すことにしたポケモントレーナーの石田です。ご無沙汰しております。石田の記事のスタンスは「Web系らしく新し目の技術に軽く触れて速報的に伝える記事が多い中、誰得な内容をグダグダ書く」です。今回も誰得に極振りしてみました。3DSのソフトで最新はX・Yなあのソフト「ポケモン」の能力値を計算するプログラムを通してOOPしてみよう!というのが今回のテーマです。しかし、単にステータス計算するだけのツールをプログラムしただけだと、いまいちネタにならないので「クドい程にOOPしてみる」ことにしてみます。ただし、ここで説明する仕様や用語は公式で発表されているものではないので「そう言われているとか、こんな感じっぽいとか、噂の類とか、都市伝説の類とか」というレベルで受け止めてください。

ターゲット

一応、時節柄「新卒エンジニア向けの学習用記事に最適」に見えますが、実際は「誰得」を貫いているので以下の条件のANDの結果が対象読者として想定されています。「誰得」を通り越して「俺得」ですらない気もしますが(自分用ならコマンドライン用のPerlスクリプトが有る)、そこには目を瞑ります。

  • PHP5.4以降でOOPに関する文法を理解している
  • にも関わらずOOPの初心者である
  • にも関らずクラス図は読める
  • ポケモンをやっていて「厳選」や「調整振り」と言われてピンとくる
  • ポケモンを愛している
  • マイオナ厨ではない

ロードマップ

長くなりそうなので、連載記事スタイルにしてみました。以下がロードマップです

前提となる知識

ポケモンの能力値には以下の要素があります。

  • HP(略称:H)
  • 物理攻撃力(略称:A)
  • 物理防御力(略称:B)
  • 特殊攻撃力(略称:C)
  • 特殊防御力(略称:D)
  • スピード(略称:S)

この要素はそれぞれ以下の計算式で算出されると言われています(あくまで都市伝説の類です)

種族値、固体値、努力値、性格補正という謎の単語が現れましたね? これらを通称で三値と呼びます。HからSまでの各項目に対して種族値、固体値、努力値という3つの値をそれぞれ持っています。それぞれについて、簡単に説明していきます。

種族値って?

その種族が持っている個性です。例えば、以下のようなものです。

  • ピカチュウは速くて打たれ弱い(サトシのピカチュウはしぶといけどアレはアニメの脚本上の都合です)
  • シャンデラは特攻が高くて、そんなに速くない

固体値って?

その固体が持っている個性とか才能みたいなものです。同じピカチュウでも「Aのピカチュウは速いけど、Bのピカチュウは遅い 」みたいなのが発生するのは、これによるところです。(性格補正も有るけど一旦、ここでは置いておきます)。ここの値は32が最大で、1が最小です。32が最大なのですが、サトシのピカチュウは演出の都合上全項目の固体値が100くらい有ると思います。

努力値って?

何をどれだけ学習したのかということを表現する項目です。同じ種族で、全く同じ固体値を持ち、同じ性格の二つの固体があったとしても育て方によって能力が異ってくることがあるのはこれのせいです。これは例えば速いポケモンを倒したらスピードに努力値が振られて、攻撃力の高いポケモンを倒したら攻撃に努力値(入る値は速いポケモンを倒したら一度に1、凄く速いポケモンを倒したら一度に2入る)が振られるというモノです。一項目あたり最大で252、全項目の合計で510まで振ることが出来ます。サトシは延々とピカチュウを鍛え続けていますが、ピカチュウもその都度強くなっていくので、アニメの都合上、サトシのピカチュウには努力値に上限がないのだと思います。

性格補正って?

ポケモンの性格によって補正がかかる項目が有るということですね。例えば、おくびょうなポケモンは「物理攻撃」が下がって「素早さ」が上がるというものです。この時、上がる補正のことを上昇補正、下がる補正のことを下降補正と呼びます。上昇補正は1.1倍、下降補正は0.9倍です。

努力値振り

上記を踏まえた上で、もう一度計算式を見てみましょう。

つまり、強いポケモンを得るためには、まず以下のことをしなければなりません

  • ポケモンの特性に合わせて性格を選ぶ
  • ポケモンの特性に合わせて固体を選ぶ

これを厳選と呼びます。例えば、高速物理竜であるガブリアスは物理攻撃の上昇補正を得る性格、または速さの上昇補正を得る性格で、物理攻撃と速さの固体値が最大になるように厳選するということです。そして、強いポケモンを育てるためには、これが「ポケモンをやる人のことをトレーナーと呼ぶ理由」となるのですが、意味の有る努力値の振り方をするということになります。そして、基本的には「特性に合わせた性格を選び、特性に合わせた固体を選ぶ」という厳選は相手は確実に済ませているのでトレーナーの個性が現れるのが努力値の部分になるということです。努力値の振り方については大きく分けて二つあります。

  • 努力値を二項目に極振りする厨振り
  • 仮想敵に合わせて振る調整振り

通常、厨振りは仮想敵(現環境で、このポケモンが相手をするとしたらコレ!というタイプのポケモンを想定します。この部分は実際にレート戦の状況を確認して、匿名掲示板での情報戦を制してコントロールしたりします)を想定する時の計算では使いますが(相手が極端に振っている前提で調整した方が確実であるため。この項目について、これ以上の性能が出ることは無いという数値を得られる)一般的なトレーナーがポケモンを育成する時には使いません(故に中学生がやりそうな振り方なので厨振りです)。前置きが長くなりましたが、どのようなポケモンがどれだけの固体値を持っている時、どのように努力値を振れば、どの相手を出し抜けるか? という調整振りの計算をするための仕組を作っていこうと思います。調整振りにはパーティ内での役割についても考えて振ったりもしますが、話がややこしくなるので一旦置いておきます。プログラミング目当てではなくトレーナーを志して、ここにランディングしてしまった人は、ここではこれ以上は説明しませんので後で調べてみてください。

まとめ

さて、ステータス計算に関する変数の種類と計算式が揃いましたので。データ構造とアルゴリズムを考えられる準備が整いました。次回は

ですね。ソースはGitHubのリポジトリに書いていきます。既に大分ソースが入っていますが、次回は、このソースを使ってクラス構造を考えるところからやっていこうと思います。

https://github.com/t-ishida/pokemon-calculator

最後に

アライドアーキテクツでは、前提条件の説明だけで1エントリを使ってしまうエンジニアとポケモン好きなエンジニアを募集しています。