開放より2段絞ったところ

徒然なるままに…主にカメラの事を書いていくことになるかと。

Shedinja開発記 Part1

こんにちは、壁紙です。

 

最近友人に頼まれてポケモンの能力値を計算するソフトウェアの制作をしています。

自分としても大学は情報系の学部を志望していますし、プログラミングの練習としてもいい機会だと思い、二つ返事でOKしたのですが…。

 

そんな壁紙を待ち受ける運命とは…?

 まあこんな仰々しい始まり方をしたわけなんですが、初めて「クライアント」ができたわけで、私としても肩に力が入る思いであります。お金をもらっているかどうかは別として、やっぱり作るからには多くの人に使ってもらいたいし、最高のものを作りたいという気持ちがあります。

実はこのプロジェクトを始めてすでに二週間くらい経っていて、ソフトの大枠はだいたいできていたりします… こちらで配信中、2019年6月現在まだβ提供です

 

まあ備忘録もかねて、そしていかにしてド素人プログラマがひとつのソフトウェアを開発していったかというのを一応記録しておこうというわけでこの記事をシリーズで書いていきたいと思います。チェンジログみたいな感じになるのかな?

 

初回ということで今回は依頼の内容と初期設計の段階を記録しておきます。

要求

当初の要求は以下の二つでした。

  • 努力値を各スキルの値から逆算できる機能
  • 各スキルの値を計算する機能

後者は結構いろいろなところで使用可能な機能で、ネット上にも計算サイトがあることが確認できました。ところが前者に限っては「どこのサイトでもできる」というわけではなく、一部のサイトで使えるかな?というくらい。(依頼主も私もこの機能があるウェブサイトがあることは知りませんでしたが後日別の知人が教えてくれました)

実はこの努力値ともう一つの値である個体値というのがゲーム内ではマスクデータであるようで、効率的にゲームを進めるためには厳格に管理する必要があるそうです。ちなみに私はポケモンプレイヤーではないのでその辺は実はよくわかりません。。。

それで、個体値は名前の通り個体ごとに決まっている値(constant)なんですが、努力値はプレイヤーが割り振りを決定することができ、その幅は0~255の値(variable)です。個体値は一回求めてしまえば記録しておけば二回も三回も計算する必要はないのですが、努力値はプレイヤーの割り振りで決まるのでその都度計算が必要です。

初期設計

とりあえずプレベータ版ということで、要求の範囲だけの機能を実装することにしました。各値の計算値は以下の通り。

 HP = \frac{   2 \times 種族値 + 個体値 + \frac{努力値}{4}   }{   100   } \times レベル + レベル + 10

 各スキル = \frac{2 \times 種族値 + 個体値 + \frac{努力値}{4}}{100} \times レベル \times 性格補正

この式を変形して、 努力値= ...という形に改めればいいように思えますが…

ポイントはポケモンの数値はすべてint型、すなわち整数であること。なので分数処理が発生するところでは閾値が生まれます。これをうまく処理する自信はないので、私が使ったアルゴリズムは単純明快。

f:id:kabegamikamio:20190627003058p:plain

HPの努力値計算アルゴリズム

ぶっちゃけこれくらいの計算なら表計算でもできなくはないのですが、まあプログラム書いた方が手間もかからないしキレイなんで。

ちなみに私が要求を勘違いしていたせいで、攻撃値とかから努力値を逆算するアルゴリズムは初期βには搭載していません。現在コーディング中のβ1.1.0から対応させるつもりです…

スキル計算の方は原始的なものですが、各変数を配列で宣言して反復処理をしたりと、コーディングの負担を減らす工夫をしてみました。おかげでTextBoxの数の割には早く作業が終わりました。

f:id:kabegamikamio:20190627003600p:plain

メインフォームのソースはだいたい450行くらい。私が書いたコードでは1, 2を争う長さです

性格補正は「1倍」「0.9倍」「1.1倍」しかないそうなので、不正な値の入力を防ぐ観点からもComboBoxにしました。俗にいうドロップダウンメニューってやつですね。あと入力の手間を省くために性格を選択すると補正値が自動入力される機能も付けました(これが意外と評判がよかったです)

f:id:kabegamikamio:20190627004259p:plain

性格を選択すると…

f:id:kabegamikamio:20190627004335p:plain

値が入りましたね!

いざビルド!

さあある程度デバッグもできましたし、ビルドしてみましょう。

f:id:kabegamikamio:20190627003616p:plain

β1.0.1の画面。β1.0.0で見つかったバグを修正したものなのでUIは同じ。

うん、まずまずといった感じ。

試しにいくつかの参考値を依頼主からもらってテストしましたが、問題なさそう。次はUIの整理をして…って感じかなぁ。

自分で使ってみて感じたのは、種族値の入力が面倒であること。種族値ポケモンごとに決まっているので、データベースを構築しておけばそっから名前検索だけで値の自動入力ができるようになるはず。

 

 

 

データベース…手作業で入力…(頭痛

 

 

 

次回はDBを構築する回です。ご期待あれ。