プログラミング

パーティー実装編 戦闘に参加するポケモン PHPポケモン64

PHP PHPポケモン ポケモン
パーティー実装編 戦闘に参加するポケモン PHPポケモン64

先頭のポケモンを選出

前回パーティーのプロパティを準備して、複数(6匹)のポケモンを持ち歩けるようにすることを想定しました。

今回は、そこからバトル画面への連動をさせる部分までを作り込んでいきましょう。

 

複数のポケモンを所有している場合、戦闘が始まって繰り出されるのは「ひんし状態を除く一番上のポケモン」です。現在は1匹しか所有できないため、ひんし状態になっていればバトルに参加すること自体ができませんが、これを複数匹想定の構成へ変更します。

 

ホームコントローラー用トレイト(/App/Traits/Controller/HomeControllerTrait.php
<?php
 
/**
 * ホームコントローラー用トレイト
 */
trait HomeControllerTrait
{
 
    /**
    * 引き継ぎ処理
    * @return void
    */
    protected function takeOver()
    {
        // パーティーにセット
        $this->party = $this->unserializeObject($_SESSION['__data']['party']);
    }
 
    /**
    * 戦闘に参加するポケモン番号を取得
    *
    * @return integer
    */
    protected function getFightPokemonOrder()
    {
        $orders = array_filter($this->party, function($partner){
            return $partner->getRemainingHp() > 0;
        });
        if(empty($orders)){
            return null;
        }else{
            return array_key_first($orders);
        }
    }
 
}

 

getFigthPokemonOrderというメソッドを新しく追加しました。array_filterを使って、パーティーのHPが0超過(瀕死ではない)ポケモンだけを抽出し、その先頭のキーを返却しています。

array_filterでは抽出した値のキーがそのままです。なので、最初のキーを返却することで、パーティープロパティに格納されている、戦闘に参加できるポケモン番号が取得できます。

 

ポケモン番号の格納

戦闘に参加できる先頭のポケモンを判定することができるようになったので、このメソッドをコントローラーに追記しましょう。

 

ホームコントローラー(/App/Controllers/Home/HomeController.php
<?php
$root_path = __DIR__.'/../../..';
require_once($root_path.'/App/Controllers/Controller.php');
// サービス
require_once($root_path.'/App/Services/Home/RecoveryService.php');
// トレイト
require_once($root_path.'/App/Traits/Controller/HomeControllerTrait.php');
 
// ホーム用コントローラー
class HomeController extends Controller
{
 
    use HomeControllerTrait;
 
    /**
    * @return void
    */
    public function __construct()
    {
        // 親コンストラクタの呼び出し
        parent::__construct();
        // 引き継ぎ
        $this->takeOver();
        // 分岐処理
        $this->branch();
        // 親デストラクタの呼び出し
        parent::__destruct();
    }
 
    /**
    * アクションに合わせた分岐
    * @return void
    */
    private function branch()
    {
        try {
            switch ($_POST['action'] ?? '') {
                /******************************************
                * リセット
                */
                case 'reset':
                $_SESSION['__route'] = 'initial';
                header("Location: ./", true, 307);
                // exit;
                break;
                /******************************************
                * ポケモンセンター
                */
                case 'recovery':
                $service = new RecoveryService($this->party);
                $service->execute();
                break;
                /******************************************
                * バトル
                */
                case 'battle':
                $order = $this->getFightPokemonOrder();
                if(is_null($order)){
                    setMessage('バトルに参加できるポケモンがいません');
                    break;
                }
                $_SESSION['__data']['order'] = $order;
                $_SESSION['__route'] = 'battle';
                $_SESSION['__token'] = $_POST['__token'];
                header("Location: ./", true, 307);
                break;
                /******************************************
                * アクション未選択 or 実装されていないアクション
                */
                default:
                break;
            }
        } catch (\Exception $ex) {
            // 初期画面へ移管
            $_SESSION['__route'] = 'initial';
            header("Location: ./", true, 307);
            exit;
        }
    }
 
}

 

array_filterで抽出した結果が空であれば、nullを返却するようにしているので、is_nullで判定して一致すれば「バトル不可」としています。もし、値が取得できていればそれをorderセッションに格納して次の画面へ移管させます。

 

次にバトルコントローラー側の引き継ぎ処理についてみてみましょう。

 

バトルコントローラー用トレイト(/App/Traits/Controller/BattleControllerTrait.php
/**
* 引き継ぎ処理
* @return void
*/
protected function takeOver()
{
    // にげるの実行回数を引き継ぎ
    if(isset($_SESSION['__data']['run'])){
        $this->run = $_SESSION['__data']['run'];
    }
    // フィールド状態を引き継ぎ
    if(isset($_SESSION['__data']['field'])){
        $this->field = $_SESSION['__data']['field'];
    }
    // ポケモン番号の引き継ぎ
    $this->order = $_SESSION['__data']['order'];
    // パーティーの引き継ぎ
    $this->party = $this->unserializeObject($_SESSION['__data']['party']);
    // 敵ポケモンの引き継ぎ
    if(isset($_SESSION['__data']['enemy'])){
        $this->enemy = $this->unserializeObject($_SESSION['__data']['enemy']);
        // 前ターンの状態をプロパティに格納
        $this->before['enemy'] = clone $this->enemy;
    }
    // 戦闘中のポケモンをプロパティにセット
    $this->pokemon = $this->party[$this->order];
    // 前ターンの状態をプロパティに格納
    $this->before['friend'] = clone $this->pokemon;
}

 

新しくorderというプロパティを設けて、ポケモン番号を保管する仕様に変更しました。ただ、配列内のポケモンを毎回取り出すとなれば手間なので、オーダーに合わせたポケモンをポケモンプロパティに格納するようにして、今までの既存の処理はそのままにしています。

こうすることで、パーティー内のポケモンとポケモンプロパティの値に差異が生まれません。

 

実際のバトル画面を見てみましょう。

 

問題なくパーティーからポケモンを抽出して、今までと同じ状態を作り上げることができました。

交代機能はまだ未実装ですが、ポケモン一覧が見られるようにしています。

 

ポケモンセンターの拡張

パーティーという扱いでポケモンを格納する方法に変更したため、全ポケモンに回復処理がなされるように、ポケモンセンターを拡張しましょう。

 

回復用サービス(/App/Services/Home/RecoveryService.php
<?php
$root_path = __DIR__.'/../../..';
// 親クラス
require_once($root_path.'/App/Services/Service.php');
 
/**
 * 全回復(ポケモンセンター)
 */
class RecoveryService extends Service
{
 
    /**
    * @var object Pokemon
    */
    private $party;
 
    /**
    * @return void
    */
    public function __construct($party)
    {
        $this->party = $party;
    }
 
    /**
    * @return void
    */
    public function execute()
    {
        foreach($this->party as $partner){
            $this->recovery($partner);
        }
        setMessage([
            ['お預かりしたポケモンたちは、皆元気になりましたよ'],
            ['またのご利用お待ちしております']
        ]);
    }
 
    /**
    * 全回復
    *
    * @return void
    */
    private function recovery($partner)
    {
        // HP回復
        $partner->calRemainingHp('reset');
        // 状態異常解除
        $partner->releaseSa();
        // PP回復
        $partner->calRemainingPp('reset');
    }
 
}

 

処理自体は単純で、foreachを使って1匹ずつに同じ処理を与えています。array_mapなどを使って全ポケモンに同じ処理を施してもらっても構いません。

これで、パーティーを作成した際に複数のポケモンを所有、回復処理ができるようになりました。

 

まとめ

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

今回のPHPポケモンは、パーティーから戦闘に参加させるポケモンを選出する方法をご紹介しました。

現在プログラミング学習に取り組んでいたり、興味を持っている方は、是非参考にしてみてくださいね。

 

注目の記事

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

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

【JavaScript】ESLint下でToastr(グローバル変数)を使用する方法
プログラミング
ESLint,JavaScript,jQuery,Toastr
【JavaScript】ESLint下でToastr(グローバル変数)を使用する方法

  ESLintはシステム全体で見れば便利なツールと言えますが、ライブラリなどを読み込む際に通常紹介されているような方法では使えなかったり、慣れていない人からするとどうしても躓くポイントが多くなるのも事実です。 ですが使いこなせるようになれば、開発がスムーズになることはもちろん、保守性やコードの...

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

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

PHPポケモン「バトルシステム編〜状態変化〜」32
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「バトルシステム編〜状態変化〜」32

状態変化とは  状態異常の実装が完了したので、いよいよ状態変化の実装に移ります。PHPポケモンで実装する状態変化とは以下の4つです。 こんらん ひるみ バインド やどりぎのタネ   上記4つを実装していきます。状態異常と異なり、技によっては追加になる可能性があります。 ※いかり状態など  ...

迷惑メールはなぜ届く?amazonや楽天を騙る悪質メールへの対処法とは
ネットワーク
amazon,スパム,メール,楽天
迷惑メールはなぜ届く?amazonや楽天を騙る悪質メールへの対処法とは

「いきなり迷惑メールが届くようになった」 「Amazonや楽天を装ったメールはどうやって見分ければいいの?」   知らない人からいきなり連絡が届いたり、登録もしていないようなサービスからメールが届けば、それは詐欺メールかも知れません。 スマホやパソコンが一般的に普及して、ネットでの買い物やサービスを利用...

【Laravel】論理削除対応型existsバリデーションの実装方法
プログラミング
Laravel,PHP
【Laravel】論理削除対応型existsバリデーションの実装方法

  Laravelでは多くのバリデーションが提供されていますが、論理削除を使用している場合はそのままでは使えないものが複数あります。 今回は紐付けをする際に存在チェックで使用するexistsのソフトデリート対応のバリデーションを実装する方法をご紹介します。     カスタムバリデーションの追加   存...

PHPポケモン「オートロード編(修正版)」17 おまけ:日本語化
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「オートロード編(修正版)」17 おまけ:日本語化

  前回実装したオートローダーの使い方が盛大に間違っていたので、今回その間違いの説明をしながら、正しい実装方法をご紹介します。 申し訳ありません。(誠意)    オートロードについて(再)  必要なタイミングで必要なファイルをrequireまたはincludeするあれです。   前回spl_autoload_reg...

PHPポケモン「バトルシステム編〜HP計算〜」26
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「バトルシステム編〜HP計算〜」26

HP計算 これまでに実装したダメージ計算ですが、計算はできていてもお互いに相手ポケモンのHPを削ることはできませんでした。なので、今回は実際のバトルのように、HPに対してダメージを与えるという仕組みを作成していきます。   残りHP ここで必要になるのが「残りHP」という概念です。今までステータス上のHP...

カテゴリ

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