プログラミング

ピカチュウから学ぶオブジェクト指向 〜ステータス導入編〜 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を使って確認してみてください

 

  

まとめ

 

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

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

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

 

注目の記事

PHPポケモン(α)攻略wiki「最初のポケモン」
雑記
PHPポケモン,wiki,ポケモン
PHPポケモン(α)攻略wiki「最初のポケモン」

リリースから一ヶ月、遂にPHPポケモン(α)の攻略Wiki(仮)が公開です!   というのは大嘘で、内部の大幅変更の関係上、今回はPHPポケモンをプレイするにあたってのオススメなどをまとめて見た次第です。 ちなみに、バトルシステム自体は本家に沿って作成しているので、種族値や技性能に精通している人はブラウザ...

HPバーアニメーション 後編 フロント側の対応 PHPポケモン 44
プログラミング
PHP,PHPポケモン,ポケモン
HPバーアニメーション 後編 フロント側の対応 PHPポケモン 44

HPバーアニメーション それでは前回に続き、HPバーのアニメーションづくりをしていきましょう。前回、メッセージに合わせてレスポンスを返却するというサーバー側の仕組みを作成しました。なので、今回はそれをフロント側で受け取り、タイミングよくアニメーションで再現します。   フロント側(js)の処理 前回...

オウムがえし編 PHPポケモン 68
プログラミング
PHP,PHPポケモン,ポケモン
オウムがえし編 PHPポケモン 68

オウムがえしとは 今回は久々に新しい技を実装します。それが「オウムがえし」です。 オウムがえし(ポケモンwiki) https://wiki.ポケモン.com/wiki/オウムがえし   初代で登場した技であり、序盤に登場するポッポやオニスズメがレベルアップで覚える技の1つです。最新世代ではオウムがえしという技は実...

PHPポケモン「コントローラー編」〜POSTとSESSIONの活用〜 10
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「コントローラー編」〜POSTとSESSIONの活用〜 10

  今回のPHPポケモンでは、今まで作った機能用のコントローラーになるインターフェースを作成します。ポケモンやメソッドを選択できるようにして、よりゲーム性の高いアプリケーションを実装しましょう。   第1回から学習したい方はコチラ     コントローラーの実装   それでは実装したアクション...

手っ取り早く情報強者になる簡単な方法
雑記
アウトプット,インプット,ニュース
手っ取り早く情報強者になる簡単な方法

  ニュースや情報番組、討論番組をみると、出演者の方々の情報量の多さに圧倒されることがあります。 また、ユニークな考え方に共感を得る人も多いでしょう。   どうやって、情報を仕入れているのか? なぜそんなことまで知っているのか?   メディアで取り上げられているような人や、活躍している人の多く...

ビジュアル作り込み編(序) PHPポケモン66
プログラミング
PHP,PHPポケモン,ポケモン
ビジュアル作り込み編(序) PHPポケモン66

ビジュアルの作り込み 最近は内部の作り込みが多かったので、今回のPHPポケモンでは見た目を少しだけ作り込んでいきます。とはいっても、機能自体がそこまで揃っていないため、あくまで仮の見た目となります。 ある程度見た目が整っていると、プレイする側のモチベーションや楽しみも増えると思ったので、こちらは並...

バトルステータス可視化編 PHPポケモン 70
プログラミング
PHP,PHPポケモン,ポケモン
バトルステータス可視化編 PHPポケモン 70

バトルステータスの可視化 現在のポケモンでは、バトルステータスの現状を可視化できるようになっており、どれぐらいのランク補正がかかっているか、フィールドがどういう状態になっているかがわかるようになっています。 初代、第2世代等では確認できなかった内容ではありますが、システムとしては便利な要素でも...

【税金は貰うもの】知って得する!お金を稼ぐための実践的な3要素
マーケティング
【税金は貰うもの】知って得する!お金を稼ぐための実践的な3要素

  「お金を稼ぐための基本的な3要素」に続く、「実践的な3要素」です。 前回は、単価、頻度、客数の関係を理解すれば、お金を稼ぐ仕組みがどのように成立しているのか、そしてどういったアプローチをすればお金を稼げるのかがわかりました。   今回は、直接お金に関係する実践的な3要素です。どう...

カテゴリ

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 独立 神戸 福祉 秘密鍵 翻訳 自己啓発 英語 見積書 計算機 読書 起業 迷惑メール 配列 銀の弾丸 集客 雑学力