プログラミング

PHPポケモン「2進化ポケモン実装編」8

PHP PHPポケモン プログラミング学習 ポケモン
PHPポケモン「2進化ポケモン実装編」8

 

記念すべき?第8回目で遂にタイトル変更です。

(旧)ピカチュウから学ぶオブジェクト指向

(新) PHPポケモン

 

機能増設によりオブジェクト指向云々より、PHP学習がメインになったので泣く泣く変更です。(今の所)順調に続いているのも、多くの方?が見てくれているおかげです。感謝感激雨アレレということで、感謝の気持を込めて最後にはGitHubさんよりサンプルコードを配布しているので、ぜひ最後まで読んでからダウンロードしてやってください。

 

コードの説明については、第1回からできるだけわかりやすく説明をしているので、今回始めての人はぜひご参考ください。

ピカチュウから学ぶオブジェクト指向 〜入門編〜 1 ピカチュウから学ぶオブジェクト指向 〜入門編〜 1

オブジェクト指向とは  オブジェクト指向プログラミング https://ja.wikipedia.org/wiki/オブジェクト指向プログラミング オブジェクト指向プログラミングとは、互いに密接な関連性を持つデータとメソッドをひとつにまとめてオブジェクトとし、それぞれ異なる性質と役割を持たせたオブジェクトの様々な定...

 

今回は「2進化ポケモン実装編」です。今までピカチュウだけに頼っていましたが、新たに3匹増えるということもあって、ディレクトリ構造を大幅に変更しています。読み込み方法も少し変更したので、以下参考にしながら進めて行きましょう。

 

新たなディレクトリ構造

 

読み込み方法
require_once(__DIR__.'【記述ファイルからの相対パス※頭にスラッシュ有り】');

 

一旦上記の構造で進めていきます。公開ディレクトリだのアクセス制限が気になる人はもっとキレイに配置するかフレームワークでも使いましょう。

 

2進化ポケモンの実装

ピカチュウのおかげである程度機能が整ったので、今回は新たにポケモンを増やします。その映えある第1号に選ばれたのが、全国図鑑最上位に君臨するカエル三兄弟ことフシギダネさん一家です。

前回進化のシステムを導入したので、最終進化までセットで加えていきます。ステータスに関しては、ピカチュウ一家と同じく以下のデータを参考にします。 

種族値 → 執筆時段階での最新シリーズ

覚える技 → 初代

 

ポケモンの追加

 それでは、進化前のフシギダネから順に追加していきます。ピカチュウのクラスを参考にしながら、フシギダネのクラスを作成しましょう。

 

フシギダネ(/Classes/Pokemon/Fushigidane.php
<?php

require_once(__DIR__.'/../Pokemon.php');
require_once(__DIR__.'/Fushigisou.php');
 
// フシギダネ
class Fushigidane extends Pokemon
{
 
    /**
    * 正式名称
    * @var string(min:1 max:5)
    */
    protected $name = 'フシギダネ';
 
    /**
    * 初期レベル
    * @var array
    */
    protected $default_level = [
        5
    ];
 
    /**
    * レベルアップで覚える技
    * @var array
    */
    protected $level_move = [
        [1, 'たいあたり'],
        [1, 'なきごえ'],
        [7, 'やどりぎのタネ'],
        [13, 'つるのムチ'],
        [20, 'どくのこな'],
        [27, 'はっぱカッター'],
        [34, 'せいちょう'],
        [41, 'ねむりごな'],
        [48, 'ソーラービーム'],
    ];
 
    /**
    * 種族値
    * @var array
    */
    protected $base_stats = [
        'HP' => 45,
        'こうげき' => 49,
        'ぼうぎょ' => 49,
        'とくこう' => 65,
        'とくぼう' => 65,
        'すばやさ' => 45,
    ];
 
    /**
    * インスタンス作成時に実行される処理
    *
    * @return void
    */
    public function __construct()
    {
        $this->setLevel();
        $this->setDefaultExp();
        $this->setDefaultMove();
        $this->setIv();
        echo '<p>フシギダネをゲットした</p>';
    }
 
    /**
    * 進化 → フシギソウ
    *
    * @return Classes\Pokemon\Fushigisou
    */
    public function evolve()
    {
        return new Fushigisou($this);
    }
 
}

※ポケモンの名前を英語で統一させようと考えていましたが、フシギダネの英語名は「Bulbasaur」で、増えていくと絶対に判別できなくなると判断したので断念しました

 

フシギソウはまだ作成していませんが、作成する前提でプログラムを組んでいきます。

 

親コンストラクタの活用 

フシギダネのクラスを作りましたが、1点気になる箇所がありますね。それはコンストラクタ(__construct)の処理です。

/**
* インスタンス作成時に実行される処理
*
* @return void
*/
public function __construct()
{
    $this->setLevel();
    $this->setDefaultExp();
    $this->setDefaultMove();
    $this->setIv();
    echo '<p>フシギダネをゲットした</p>';
}

 

インスタンス化した際の一連の処理は、基本的に全ポケモン共通です。進化の分岐はありますが、同じ処理はできる限りまとめて置くほうが保守性は高まります。なので、親クラスであるポケモンクラス(Pokemon)のコンストラクタを活用します。

 

ポケモン(/Classes/Pokemon.php
/**
* インスタンス作成時に実行される処理
*
* @return void
*/
public function __construct()
{
    $this->setLevel();
    $this->setDefaultExp();
    $this->setDefaultMove();
    $this->setIv();
    echo '<p>'.$this->name.'をゲットした</p>';
}

 

もし子クラスにコンストラクタがなく、親のコンストラクタが存在している場合は、親のコンストラクタが呼び出されます。もしどちらも記述されている場合は、子が優先されます。

なので、基本的には親のコンストラクタを使用、例外処理が必要になるポケモンに関しては子のコンストラクタを使用しましょう。

コンストラクタ(PHP.net)

子クラスがコンストラクタを有している場合、親クラスのコンストラクタが 暗黙の内にコールされることはありません。

  

進化前の判定

進化についても、基本的な処理は同じです。なので親であるポケモンのコンストラクタで分岐させるのが好ましいですね。そのためには、正しい進化元かどうかを判別するためのプロパティが必要になります。進化ポケモンのクラスにchild_classというプロパティを追加しましょう。以下、フシギソウ(Fushigisou)のクラスです。

 

フシギソウ(/Classes/Pokemon/Fushigisou.php
<?php

require_once(__DIR__.'/../Pokemon.php');
require_once(__DIR__.'/Fushigibana.php');
 
// フシギソウ
class Fushigisou extends Pokemon
{
 
    /**
    * 正式名称
    * @var string(min:1 max:5)
    */
    protected $name = 'フシギソウ';
 
    /**
    * 進化前(クラス名)
    * @var string
    */
    protected $child_class = 'Fushigidane';
 
    /**
    * 初期レベル
    * @var array
    */
    protected $default_level = [
        16
    ];
 
    /**
    * レベルアップで覚える技
    * @var array
    */
    protected $level_move = [
        [1, 'たいあたり'],
        [1, 'なきごえ'],
        [1, 'やどりぎのタネ'],
        [7, 'やどりぎのタネ'],
        [13, 'つるのムチ'],
        [22, 'どくのこな'],
        [30, 'はっぱカッター'],
        [38, 'せいちょう'],
        [46, 'ねむりごな'],
        [54, 'ソーラービーム'],
    ];
 
    /**
    * 種族値
    * @var array
    */
    protected $base_stats = [
        'HP' => 60,
        'こうげき' => 62,
        'ぼうぎょ' => 63,
        'とくこう' => 80,
        'とくぼう' => 80,
        'すばやさ' => 60,
    ];
 
    /**
    * 進化 → フシギソウ
    *
    * @return Classes\Pokemon\Fushigibana
    */
    public function evolve()
    {
        return new Fushigibana($this);
    }
 
}

 

それでは新しく追加したプロパティを見てみましょう。

/**
* 進化前(クラス名)
* @var string
*/
protected $child_class = 'Fushigidane';

 

フシギソウの進化前はフシギダネです。そして判別するためにはクラス名が必要になるので、フシギダネのクラス名である「Fushigidane」をセットしています。前回作成したライチュウには「Pikachu」をセットしておきましょう。

 

次に、ポケモンクラスのコンストラクタ内に進化の判定を追加します。

 

ポケモン(/Classes/Pokemon.php
/**
* インスタンス作成時に実行される処理
*
* @param object|null
* @return void
*/
public function __construct($before=null)
{
    // 進化前のポケモンと一致しているかチェック
    if(is_a($before, $this->child_class ?? null)){
        // 進化した際の処理
        $this->takeOverAbility($before);
        echo '<p>'.$this->name.'に進化した</p>';
    }else{
        // 捕まえた際の処理
        $this->setLevel();
        $this->setDefaultExp();
        $this->setDefaultMove();
        $this->setIv();
        echo '<p>'.$this->name.'をゲットした</p>';
    }
}

 

変更された条件分岐の部分を見てみましょう。

if(is_a($before, $this->child_class ?? null)){

 

is_a(クラスの判定)の第2引数(クラス名)に、先程追加したchild_classのプロパティを指定しています。これで、現在インスタンスを呼び出されてたポケモンが$beforeで受け取ったポケモンと一致しているかを判定しています。

ただし、ピカチュウやフシギダネは進化前を持たないため、プロパティを設定する必要ありません。その判定用としてNull合体演算子を使用して、なければnullをセットする仕様にしています。

【PHP7】はてな2つとは??Null合体演算子を使った存在チェック 【PHP7】はてな2つとは??Null合体演算子を使った存在チェック

  PHP Notice:  Undefined variable: 変数名 in /***/***.php on line 2   PHPで変数や対象のキーが存在しない配列を使おうとすれば、上記のようなエラーが吐き出されますね。PHP5.6までは初期値を設定したり、issetで判定したりしてそれを回避していましたが、2015年末にリリースされたPHP7からは新しくN...

 

これで進化時の判定を追加することができました。残りのフシギバナのクラスを作成して、出力をしてみましょう。

 

フシギバナ(/Classes/Pokemon/Fushigibana.php
<?php

require_once(__DIR__.'/../Pokemon.php');
 
// フシギバナ
class Fushigibana extends Pokemon
{
 
    /**
    * 正式名称
    * @var string(min:1 max:5)
    */
    protected $name = 'フシギバナ';
 
    /**
    * 進化前(クラス名)
    * @var string
    */
    protected $child_class = 'Fushigisou';
 
    /**
    * 初期レベル
    * @var array
    */
    protected $default_level = [
        32
    ];
 
    /**
    * レベルアップで覚える技
    * @var array
    */
    protected $level_move = [
        [1, 'たいあたり'],
        [1, 'なきごえ'],
        [1, 'やどりぎのタネ'],
        [1, 'つるのムチ'],
        [7, 'やどりぎのタネ'],
        [13, 'つるのムチ'],
        [22, 'どくのこな'],
        [30, 'はっぱカッター'],
        [43, 'せいちょう'],
        [55, 'ねむりごな'],
        [65, 'ソーラービーム'],
    ];
 
    /**
    * 種族値
    * @var array
    */
    protected $base_stats = [
        'HP' => 80,
        'こうげき' => 82,
        'ぼうぎょ' => 83,
        'とくこう' => 100,
        'とくぼう' => 100,
        'すばやさ' => 80,
    ];
 
}

 

出力ファイル(/index.php
<?php
require_once(__DIR__.'/Classes/Pokemon/Fushigidane.php');

// HTML出力用関数
function echoKeyToVal($array)
{
    foreach($array as $key => $val){
        echo '<p>'.$key.':'.$val.'</p>';
    }
}
 
// フシギダネをゲット
$pokemon = new Fushigidane;
echoKeyToVal($pokemon->getDetails());
echoKeyToVal($pokemon->getStats());
 
// フシギソウに進化
$pokemon = $pokemon->evolve();
echoKeyToVal($pokemon->getDetails());
echoKeyToVal($pokemon->getStats());
 
// フシギバナに進化
$pokemon = $pokemon->evolve();
echoKeyToVal($pokemon->getDetails());
echoKeyToVal($pokemon->getStats());
?>

※ステータスや詳細の出力を毎回書くのが面倒になったので、出力用の関数を作成して使用しています

 

# 出力結果
 
フシギダネをゲットした
 
正式名称:フシギダネ
ニックネーム:フシギダネ
現在のレベル:5
覚えている技:たいあたり,なきごえ
現在の経験値:125
次のレベルまでに必要な経験値:91
 
HP:20
こうげき:10
ぼうぎょ:11
とくこう:12
とくぼう:12
すばやさ:9
 
フシギソウに進化した
 
正式名称:フシギソウ
ニックネーム:フシギソウ
現在のレベル:5
覚えている技:たいあたり,なきごえ
現在の経験値:125
次のレベルまでに必要な経験値:91
 
HP:21
こうげき:12
ぼうぎょ:12
とくこう:13
とくぼう:13
すばやさ:11
 
フシギバナに進化した
 
正式名称:フシギバナ
ニックネーム:フシギバナ
現在のレベル:5
覚えている技:たいあたり,なきごえ
現在の経験値:125
次のレベルまでに必要な経験値:91
 
HP:23
こうげき:14
ぼうぎょ:14
とくこう:15
とくぼう:15
すばやさ:13

 

これでフシギダネからフシギバナまで、無事進化することができました。

 

サンプルコードの配布

 第8回終了時点のPHPポケモンのコードをGitHubより配布します。好きにダウンロードして使用してください。

 

コードは毎回終了時に配布するわけではありません。ある程度溜まったら、そのタイミングで終了時点のコードを配布予定です。ぜひ学習用としてお役立てください。

 

まとめ

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

今回のPHPポケモンは「2進化ポケモン実装編」についてご紹介しました。

好きなポケモンがいる人は、試しに追加してみてください。言語を問わず、プログラミングの学習は楽しみながらすることが習得の近道ですので、ぜひ参考にしてくださいね。

 

注目の記事

【関数とは】初心者が最短でPHPを使えるようになるための実践的な学び方
プログラミング
function,PHP
【関数とは】初心者が最短でPHPを使えるようになるための実践的な学び方

  PHPを実践で使えるレベルまで押し上げるための初心者向け講座、第3回目は「関数」です。   第1回の変数、第2回の配列、そして今回の関数の3つをマスターできていれば、いざ業務に望んでも、ある程度通用すると思っておいて良いでしょう。  ※オブジェクト指向やクラスの理解、データベースの知識など、...

起業・独立を考えている人に向けた具体的なアドバイス3選
雑記
起業・独立を考えている人に向けた具体的なアドバイス3選

  「どのタイミングで起業すべき?」 「会社を作るためにはどういったことをすればいいの?」   あなたはこんな悩みを抱えていませんか? 今回は、これから独立・起業をしようと考えている方や、そういった野望をいだいている人に向けて、自らの経験を元に具体的なアドバイスを3つピックアップしてご紹...

【Laravel】1対1リレーションをわかりやすく解説(hasOne)
プログラミング
Laravel,PHP
【Laravel】1対1リレーションをわかりやすく解説(hasOne)

  Laravelの1対1リレーションのhasOneについて、公式マニュアルでは専用単語ばかりでどうしてもわかりにくいと感じてしまっている方へ向けて、わかりやすく解説しました。 ※例で紹介しているコードについては、一部英語を日本語表記で使用している部分もありますので、コピペで使用する方は必要に応じて置...

V系バンド必見!?アーティスト衣装販売サービスは成功するか?【ビジネス企画書】
ビジネスモデル
ECショップ,V系,アーティスト,コンサルティング,スタートアップ
V系バンド必見!?アーティスト衣装販売サービスは成功するか?【ビジネス企画書】

  この記事は、私の考えたビジネスモデルを紹介するコーナーです。考えるだけで辞めたものや、コストやリスクを考えて断念したもの、そこまでニーズがないと判断したものなど様々なので、読んだ方は自分なりの見解や根拠を踏まえて判断したり、各自ビジネスの参考資料としてご活用ください。   今回は...

OSI参照モデルとTCP/IP 〜ネットワークモデルとは〜【第3回 ド素人のためのネットワーク講座】
ネットワーク
OSI参照モデル,TCP/IP,ネットワークモデル,プロトコル
OSI参照モデルとTCP/IP 〜ネットワークモデルとは〜【第3回 ド素人のためのネットワーク講座】

  ド素人のためのネットワーク講座! 栄えある第3回は「ネットワークモデル」についてです。   横文字や英字が多くなってきたり、歴史的経緯が関係してきたりとややこしくなってくる部分ですが、ネットワークを理解するためには押さえておきたいポイントです。   プログラミングやシステムエンジニアとし...

くれくれ姿勢が実は起業の近道だった!相手のことを考え過ぎるとハマる落とし穴とは
雑記
フリーランス,独立,起業
くれくれ姿勢が実は起業の近道だった!相手のことを考え過ぎるとハマる落とし穴とは

  仕事ください アドバイスしてください 〇〇について教えてください   こういったくれくれ姿勢の人は多く、投げかけられた側からすると「メリットは?」と感じてしまいます。 ですが実はこのくれくれ姿勢には意外な成功の要因が隠れています。多くの自己啓発記事やツイートをする人はこの本質的なものに触...

get_template_partで引数を渡す方法(WordPress5.5以降)
プログラミング
PHP,WordPress
get_template_partで引数を渡す方法(WordPress5.5以降)

WordPress5.5へのバージョンアップで、大きく機能が追加されました。中には変更に戸惑っている人もいるかも知れませんが、個人的にはエンジニアの要望を大きく取り入れて自由度がアップした印象があります。 今回はその中でも、多くの方が待ち望んでいた「get_template_part」の変更点についてご紹介します。 ge...

進化アニメーション 前編 PHPポケモン 59
プログラミング
PHP,PHPポケモン,ポケモン
進化アニメーション 前編 PHPポケモン 59

進化アニメーションの実装 今回は後回しにしていた進化アニメーションの作り込みをしていきます。今までもレベルに達すれば進化はしていましたが、その演出はありませんでした。また、ポケモンではBボタンを押すことで進化のキャンセルをすることができます。なので、この辺りも実際のゲームを再現していきましょう。...

カテゴリ

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