プログラミング

パーティー実装編 戦闘に参加するポケモン 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ポケモン 97
プログラミング
PHP,PHPポケモン,ポケモン
トレーナー戦編 トレーナー情報の作成 PHPポケモン 97

トレーナー戦 いよいよPHPポケモンでもトレーナー戦の実装に取り掛かっていきます。バトルシステム自体は野生ポケモンと同じですが、トレーナーバトルでは以下の項目が追加、または制限を設けることになります。 複数匹のポケモン 逃げられない 捕まえられない 賞金   複数匹のポケモン ざっくり...

構成見直し編(クラス名) PHPポケモン49
プログラミング
PHP,PHPポケモン,ポケモン
構成見直し編(クラス名) PHPポケモン49

構成の見直し 今回は全体構成の見直しをします。ディレクトリについては変更ありませんが、ファイル名とクラス名について大幅な修正をかけていきます。   クラス名の重複回避 まず、クラス名の重複についてです。状態異常・状態変化の子クラスでは重複回避のために接頭語を着けて管理していましたが、他にも重複...

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

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

HTMLの基本設計「よくわかるSEO対策」構造化(マークアップ)編
SEO対策
HTML,SEO,マークアップ
HTMLの基本設計「よくわかるSEO対策」構造化(マークアップ)編

  HTML5がリリースされて随分経ちました。 それにより多くのタグが増え、それにより今までデザインを目的と使用されていたものが「構造化」という本来の役割を持たされるようになりました。    構造化は、目に見えにくい部分です   それぞれの役割を理解していなければ、せっかくきれいなサ...

初心者必見!仕事がデキる人のIllustrator活用術3選
デザイン
Adobe,Illustrator,サムネイル
初心者必見!仕事がデキる人のIllustrator活用術3選

  仕事の速い人の大半は、「効率の良い方法」や「便利な使い方」を知っていて使いこなしています。これは、デザインの現場でも同じです。 今回はその中でもIllustratorで知っておくと便利な機能を3つご紹介します。この3つを押さえておくだけで、作業効率は格段にアップするので、これからソフトの使い方を覚...

非公開ディレクトリ画像表示編 PHPポケモン 91
プログラミング
PHP,PHPポケモン,ポケモン
非公開ディレクトリ画像表示編 PHPポケモン 91

非公開ディレクトリの画像を表示する 今回は、β版に向けての取り組みの1つとして、表示させる画像のアクセス先を非公開ディレクトリに変更します。 現在は公開ディレクトリ(Public)内のAssetsフォルダ内に配置していますが、これをルート直下においているStorageに移動させるのが目的となります。   gifのbas...

フリーランスのための値段交渉術!案件はこうやって見極めろ
フリーランス
フリーランスのための値段交渉術!案件はこうやって見極めろ

  「これもっと安くならない?」 「他の人はこれぐらいの金額でやってくれるよ」   こういった値切り交渉を受けたことがある人もいるのではないでしょうか?技術を提供するフリーランスであれば、金額を落とすということは自分の価値を下げているということを理解しておかなければなりません。 値段交渉...

ポケモン預かりシステム編 システムの実装 PHPポケモン 87
プログラミング
PHP,PHPポケモン,ポケモン
ポケモン預かりシステム編 システムの実装 PHPポケモン 87

ポケモン預かりシステムの実装 システムの仕様とクラスも整ってきたので、いざ実装をしていきましょう。 前回までに作成した項目で、いくつか変更になったものがあるので、まずはじめに挙げておきます。   シャットダウン機能 ボックスの選択を解除するというものでしたが、こちらを不採用にしました。ボックスは...

カテゴリ

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