プログラミング

ピカチュウから学ぶオブジェクト指向 〜ステータス導入編〜 6

PHP PHPポケモン オブジェクト指向 ポケモン
ピカチュウから学ぶオブジェクト指向 〜ステータス導入編〜 6

 

PHPをピカチュウ(ポケモン)から学ぶ大人気コーナー、第6回目は「ステータス機能の導入編」です。

 

前回(第5回)で終了段階でのサンプルコードを公開しているので、もし本記事から始める人はぜひそちらを参考にしてください。 

ピカチュウから学ぶオブジェクト指向 〜レベルアップ編〜 5 ピカチュウから学ぶオブジェクト指向 〜レベルアップ編〜 5

  第3回でレベルシステムを導入し、第4回では経験値システムの導入をしたので、今回はそれを合わせたレベルアップのシステムを導入します。 第1回から作成しているコードを使用しているので、もし最初から学習したい人は第1回の入門編をご覧ください。 [shortcode_url_og url="https://s-yqual.com/blog/10...

 

※お詫び

 

調べたところによると、ポケモンの経験値はexpと表現するのが一般的なようです。前回までメソッドやプロパティ等で使用していたex_pointやExPointという表記は全てexp、Expに変更しています

 

今後は以下ページを参考にしながら進めていきたいと思います。サーセン。

 

ポケモン関連の英語

 

 

ステータスの計算

 

各ゲームによってステータス(実数値)の計算式は様々です。ポケモンにおいてはその計算式がポケモンwikiに掲載されていたので、そちらを参考に実装していきましょう。 

ポケモンWiki ステータス

 

 

計算式

 

第二世代までの計算式と第三世代移行の計算式が異なっていますが、今回は第三世代移行の計算式を使用します。ただし「せいかく補正」は除きます 

最大HP

(種族値×2+個体値+努力値÷4)×レベル÷100+レベル+10

こうげき・ぼうぎょ・とくこう・とくぼう・すばやさ

(種族値×2+個体値+努力値÷4)×レベル÷100+5

※各小数点以下は切り捨て

 

ステータスに関係する要素として「種族値」「個体値」「努力値」「レベル」という4要素が関係してきます。それでは、1つずつ見ていきましょう。

 

 

種族値(Base Stats)

 

種族値とはその名の通り、各ポケモンの種族ごとに設定された数値である。

 

だそうです。簡単に言えば、ポケモンごとに割り振られている隠しステータスの1つです。

ピカチュウの場合は

HP:35

こうげき:55

ぼうぎょ:40

とくこう:50

とくぼう:50

すばやさ:90

 という値が割り振られています。※執筆現在最新バージョンの種族値を使用しています

この値は先に説明したとおり、ポケモンごとに割り振られているため、ピカチュウのクラスに対して設定しておきます。

 

ピカチュウのクラス(/Class/Pikachu.php
/**
* 種族値
* @var array
*/
protected $base_stats = [
    'HP' => 35,
    'こうげき' => 55,
    'ぼうぎょ' => 40,
    'とくこう' => 50,
    'とくぼう' => 50,
    'すばやさ' => 90,
];

※毎度ながらわかりやすさ重視でキーに日本語を使用しています。ご了承ください。

 

種族によって値が決まっているため、原則変更することはできません

 

 

個体値(Individual Value

 

個体値とはポケモン11匹ごとに存在する、隠しステータスのことを指します。

 

だそうです。簡単に言えば「ピカチュウによっても強いやつと弱いやつがいるよ!」ってことです。

個体値は、最小が0最大が31になります。それが6項目全てに対して別々に割当られているため、オール31(6Vと言われる)が最も強い個体ということになります。

 

個体値は全ポケモンが共通して持っている値なので、ポケモンのクラスに対してプロパティを準備します。

 

ポケモンのクラス(/Class/Pokemon.php
/**
* 個体値
* @var array(value min:0 max:31)
*/
protected $iv = [
    'HP' => null,
    'こうげき' => null,
    'ぼうぎょ' => null,
    'とくこう' => null,
    'とくぼう' => null,
    'すばやさ' => null,
];

 

後ほど計算で使用するため、ステータスのキーは合わせておきましょう。初期値としてnullを設定していますが、0などを格納してもらっても構いません。

 

次に、個体値を割り当てる処理をSet格納トレイトに追加します。

 

Set格納トレイト(/Trait/SetTrait.php
/**
* 個体値をセットする
* @return void
*/
protected function setIv()
{
    /**
    * 個体値のランダム生成(コールバック用)
    * @return integer
    */
    function randIv(){
        // 0〜31の間でランダムの数値を割り振る
        return mt_rand(0, 31);
    }
    $this->iv = array_map('randIv', $this->iv);
}

 

先程準備をした個体値のプロパティ($this->iv)の配列の各項目に対して、0から31の値をランダムに割り当てるという処理を行うため、今回はarray_mapを使用しています。

 

同じ処理を行いたいコールバック関数を第1引数で指定して、第2引数に処理を行う配列を指定します。第2引数に渡した配列の値に対してコールバック関数の返り値がセットされたものが、array_mapの返り値となります。第3引数以降を設定した場合は、第2引数のキーは引き継がれません。

 

個体値割り振りの処理は、まずコールバック関数としてrandIv(自作関数)を指定しています。

/**
* 個体値のランダム生成(コールバック用)
* @return integer
*/
function randIv(){
    // 0〜31の間でランダムの数値を割り振る
    return mt_rand(0, 31);
}

 

randIvの中身は至って単純です。mt_randという関数を使って最小値(0)から最大値(31)の中からランダムに数字を1つ返却しています。 

 

randIvの返り値は、array_mapの第2引数で指定された$this->ivの値に対して順番に格納されます。結果、HPからすばやさまでの6項目に各ランダムの個体値を割り振られてるということになります。

 

余談…

 

array_mapのようにコールバック関数を使うものは、文字やコードによる説明だけでは動がわかりにくいため、ぜひ一度使ってみてください。受け取った引数などをその都度var_dumpvar_exportを使って出力してみると、より理解しやすくなるでしょう。

 

mt_randという関数でランダムに数字を割り当てていると表現しましたが、実際は「擬似乱数」です。こちらも気になった方は、ぜひ詳しく調べてみてください。

 

個体値を割り振るメソッドが完成したので、インスタンスを作成した時点で割り当てられるようにピカチュウクラスのコンストラクタ(__construct)へ追加しましょう。

 

ピカチュウのクラス(/Class/Pikachu.php
/**
* インスタンス作成時に実行される処理
*/
public function __construct()
{
    $this->setLevel();
    $this->setDefaultExp();
    $this->setDefaultMove();
    $this->setIv();
    echo '<p>ピカチュウをゲットした</p>';
}

 

これで、インスタンスを作成した時点で個体値が割り振られるようになりました。

 個体値は1度決定すれば変更することができません。なので、基本的にはsetIvのメソッドはこのタイミングでしか使用しないものです。さらに、個体値は隠しステータスのため、publicgetメソッドは現状不要です。どういった値が割り振られているか確認したい人は、こっそりと準備しておきましょう。

 

 

努力値(Effort Value)

 

努力値(どりょくち)とは、ポケモンの強さにかかわる数値のひとつ。 ステータス画面では確認できない隠しパラメータの一つである。 なお、努力値という言葉は俗称であり、ゲーム内では基礎ポイントと呼ばれている。

 

だそうです。簡単に言えば、戦ったり育てることで溜まっていくステータスのことです。

努力値は原則としてバトルをすることで溜まっていく値になります。レベルがアップすれば増えるというものではありません。そのため、今回は計算用に初期値の0を割り振ったプロパティを準備するだけになります。

努力値も全ポケモンに共通した項目のため、ポケモンのクラスに対してプロパティを追加します。

 

ポケモンのクラス(/Class/Pokemon.php
/**
* 努力値
* @var array
*/
protected $ev = [
    'HP' => 0,
    'こうげき' => 0,
    'ぼうぎょ' => 0,
    'とくこう' => 0,
    'とくぼう' => 0,
    'すばやさ' => 0,
];

 

これで努力値の設定は完了です。

 

 

計算機の実装

 

それではステータスの取得用メソッドを作成していきます。取得用と言っても、格納された値を返却するわけではありません。なぜなら、レベルや努力値(今回は固定値)など変動する値が計算式に使用されているため、その度に変更をして格納するよりは、取得する際に計算結果を返すほうが都合が良いのです。

 

では、ステータスの計算式を参考にしながらGet格納トレイトへ追加しましょう。

 

Get格納用トレイト(/Trait/GetTrait.php
/**
* ステータスの取得
*
* @var void
*/
public function getStats()
{
    foreach($this->base_stats as $key => $val){
        /**
        * ステータスの計算式(小数点以下は切り捨て)
        * HP:(種族値×2+個体値+努力値÷4)×レベル÷100+レベル+10
        * HP以外:(種族値×2+個体値+努力値÷4)×レベル÷100+5
        */
        if($key === 'HP'){
            $correction = $this->level + 10;
        }else{
            $correction = 5;
        }
        $stats[$key] = (int)(($val * 2 + $this->iv[$key] + $this->ev[$key] / 4) * $this->level / 100 + $correction);
    }
    return $stats;
}

 

ステータス(実数値)は公開情報のため、publicのメソッドを準備します。

計算処理が複雑なだけで、処理自体は簡潔です。1つずつ見ていきましょう。

foreach($this->base_stats as $key => $val){

 

種族値(base_stats)を基準に、foreachを使って1項目ずつ計算していきます。種族値・個体値・努力値には全て同じキーが割り振られているため、どれを基準にしてもらっても構いません。

 

次に、HPとその他での分岐を作成します。

if($key === 'HP'){
    $correction = $this->level + 10;
}else{
    $correction = 5;
}

 

HPの算出方法は他の5項目と異なります。最終的に加算する値が、HPの場合は「レベル+10」ですが、その他は「5」となっています。式全体を分岐で準備しても構いませんが、加算は計算順序にも影響しないので、この補正箇所の結果だけを変数($correction)に格納しています。

 

補正値が決まれば、実数値の計算式に各値を当てはめていきます。

$stats[$key] = (int)(($val * 2 + $this->iv[$key] + $this->ev[$key] / 4) * $this->level / 100 + $correction);

※式の最初に宣言している(int)は小数点を切り捨てるために使用しています。計算結果に対して切り捨てをしているので、上記の計算結果をカッコで囲ってからintを宣言しています。

 

最終的にステータスを配列として返却するので、その格納用に空配列を準備します。

計算式は、先程のHP補正の変数を利用して以下の通りです。

(種族値×2+個体値+努力値÷4)×レベル÷100+ $correction

 

個体値、努力値にはforeachで取得したkeyを使って取得しています。計算結果は項目($key)を割り当てて配列に格納していきます。

最後は、作成したステータスの配列($stats)をreturnを使って返却すれば、実数値を取得することができます。

 

出力用ファイル(/index.php
<?php

require_once('Class/Pikachu.php');
 
$pikachu = new Pikachu;
echo '<p>現在のレベル:'.$pikachu->getLevel().'</p>';
$details = $pikachu->getDetails();
$stats = $pikachu->getStats();

?>
<hr>
<?php foreach($details as $key => $val): ?>
<p><?=$key?>:<?=$val?></p>
<?php endforeach; ?>
<hr>
<?php foreach($stats as $key => $val): ?>
<p><?=$key?>:<?=$val?></p>
<?php endforeach; ?>

※出力結果を見やすくするためhrを追加しました

 

# 出力結果
 
ピカチュウをゲットした
現在のレベル:8
---
正式名称:ピカチュウ
ニックネーム:ピカチュウ
現在のレベル:8
覚えている技:でんきショック,なきごえ
現在の経験値:512
次のレベルまでに必要な経験値:217
---
HP:24
こうげき:15
ぼうぎょ:11
とくこう:14
とくぼう:14
すばやさ:21

 

実数値を取得することができました。数値が合っているかどうかは、ポケモンのステータス計算機を使って確認してみてください。

 

ポケモンステータス計算機

 ※計算には個体値が必要な場合は、var_dumpやvar_exportを使って確認してみてください

 

  

まとめ

 

いかがだったでしょうか。

今回はステータス(実数値)の計算機能の導入方法をご紹介しました。

計算方法や配列に対して実施する処理に関しては、他にも便利な関数あるかも知れません。もし今回ご紹介した方法以外にも同じ結果が得られるものがあれば、ぜひ今回紹介したコードを参考にしながら試してみてくださいね。

 

注目の記事

20代の独立が成功のカギ【学生→フリーランス・起業は危険です】
フリーランス
フリーランス,独立,起業
20代の独立が成功のカギ【学生→フリーランス・起業は危険です】

  終身雇用のほとんどが崩壊している今、学生の頃から独立や起業を考えている人は多いですが、安易な決断は危険です。 独立するには早すぎるのも良いとは言えず、また遅すぎることもそれなりにリスクです。 SNSやメディアでも学生起業などが騒がれていますが、それに影響されてしまうのはかなり危険なことです...

経験値取得アニメーション編(動画有り) PHPポケモン 47
プログラミング
PHP,PHPポケモン,ポケモン
経験値取得アニメーション編(動画有り) PHPポケモン 47

経験値取得アニメーションの実装 最近は技の実装が続いていたので、気分転換にフロント側の演出づくりをしていきます。その中でも今回実装するのは「経験値取得アニメーション」です。 経験値バーはポケモンの第2世代から追加実装された演出です。初代では次のレベルにアップするまでの数値を、わざわざポケモンの...

かなしばり編 PHPポケモン 95
プログラミング
PHP,PHPポケモン,ポケモン
かなしばり編 PHPポケモン 95

かなしばりとは 最近は技のアップデートをおろそかにしていたので、久々の追加実装です。へんしんという再現が面倒な技は乗り越えましたが、他の技も仕様がややこしいため、覚えるポケモンが用意できたタイミングに基本的に増やしていきたいのですが、バトルシステムを作り上げていく関係上、どうしても見逃せない部...

トレーナー戦編 バトルシステムへの追加 PHPポケモン 98
プログラミング
PHP,PHPポケモン,ポケモン
トレーナー戦編 バトルシステムへの追加 PHPポケモン 98

トレーナー戦闘の追加 前回トレーナー情報を作成したので、今回はその情報をバトルシステムへ組み込んでいきます。 現在、野生ポケモンとの戦闘では「battle」という値actionの値で受け取っています。同じサービス内で分岐を作ると複雑になってしまうので、battle_trainerという新しい分岐を使ってサービス分けをし...

へんしん編 PHPポケモン 74
プログラミング
PHP,PHPポケモン,ポケモン
へんしん編 PHPポケモン 74

へんしんとは 今回はサムネイルに合わせて、特別技の1つ「へんしん」を実装します。  へんしん https://wiki.ポケモン.com/wiki/へんしん   へんしんを使うことで、相手ポケモンをコピーすることができますが、その全てをコピーするわけではありません。コピーできる項目とそうでない項目は以下の通りで...

目先の利益に気をつけろ!貧乏ビジネスという落とし穴
フリーランス
目先の利益に気をつけろ!貧乏ビジネスという落とし穴

  目先の利益を求めてしまい、来たるべきビジネスチャンスに対応できないというケースは貧乏ビジネスに陥る大きな要因になります。また、相手が下す評価に左右されてしまうことも、自らの評価を下げてしまったり、見積もりを作る上でも大きく影響を及ぼしてしまいます。   今回は「目先の利益に気をつけろ!貧...

TwitterでYouTubeのリンク付きサムネイルを表示させる方法【超実践的Webプログラミング活用法】
プログラミング
HTML,JavaScript,PHP,Twitter,YouTube
TwitterでYouTubeのリンク付きサムネイルを表示させる方法【超実践的Webプログラミング活用法】

  Twitter(ツイッター)をブログや商品、イベントの宣伝目的で使用している人は多いです。そして、そのためのマーケティング方法や戦略は数多く練られています。 今回は、その中でもYouTubeの告知をするために特化させた内容をまとめました。   一般的な方法と、プログラミングの知識(HTMLやJavascript等)があ...

未経験からWeb系エンジニアとしてフリーランスになる現実的な方法教えます【軌道に乗れば起業も可能】
フリーランス
エンジニア,フリーランス,プログラミング学習,独立,起業
未経験からWeb系エンジニアとしてフリーランスになる現実的な方法教えます【軌道に乗れば起業も可能】

  セカンドキャリアとしてプログラミングやデザインを学習したい   そう考えてスクールを受講したり、独学で始める人が増えていますが、そのほとんどが実らずに挫折してしまいます。 ですが、学習方法と経験の積み方や職の選び方さえ間違えなければ、技術を身につけてフリーランスとして活動することも難しく...

カテゴリ

SEO対策 イベント デザイン ネットワーク ビジネスモデル フリーランス プログラミング マーケティング ライティング 動画編集 雑記

タグ

5G Adobe AfterEffects AI ajax amazon Animate api artisan atom Automator AWS Bluetooth CSS CVR description EC-CUBE4 ECショップ ESLint Facebook feedly foreach function Google Google AdSense Honeycode htaccess HTML IEEE 802.11ax Illustrator Instagram IoT JavaScript jQuery jQuery UI keyword LAN Laravel Linux MacBook MAMP meta MLM MySQL NoCode note OS OSI参照モデル Paypal Photoshop PHP phpMyAdmin PHPポケモン PremierePro rss SEO SEO対策 Sequel Pro Skype SNS SSH Symfony TCP/IP title Toastr Trait Twig Twitter UCC V系 WAN WebSub Wi-Fi wiki Windows WordPress XAMPP xml Xserver YouTube YouTuber Zoom アーティスト アウトプット アクセス層 アニメーション アフィリエイト イーブイ インターネット インプット エンジニア オブジェクト指向 お金配り クリック単価 クリック数 コミュニケーション能力 コロナ コンサルティング サムネイル システムエンジニア スタートアップ スタイルシート スパム データベース ディープフェイク デザイナー デザイン テレワーク ナンパ ニュース ネットワークモデル ノマドワーク バナー ピカチュウ ビジネス フィード フリーランス ブロガー ブログ プログラマー プログラミング プログラミング学習 プログラミング教育 プロトコル ホームページ制作 ポケモン マークアップ マーケティング メール リモートワーク レンダリング 三井住友 三宮 仕事依頼 児童デイ 児童デイサービス 児童発達支援 公開鍵 初心者 助成金 勉強法 営業 広告 広告収入 必勝マニュアル 放課後等デイサービス 朝活 楽天 深層学習 無線LAN 独立 神戸 福祉 秘密鍵 翻訳 自己啓発 英語 見積書 計算機 読書 起業 迷惑メール 配列 銀の弾丸 集客 雑学力