プログラミング

パーティー実装編 戦闘に参加するポケモン 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ポケモン 60
プログラミング
PHP,PHPポケモン,ポケモン
進化アニメーション 後編 PHPポケモン 60

ポケモンの進化演出 前回に続いて、ポケモンの進化演出を実装していきます。バックエンドの処理はざっと説明をしたので、今回はフロントエンド(JavaScript)側の処理を作成していきましょう。   進化画面は新しく設けたので、こちらにもバトル画面で使っているメッセージ用JSを作成していきます。処理自体はほとん...

データベース定義は超重要!システム開発を始める前に知っておきたい構造と構成の考え方
プログラミング
MySQL,データベース,プログラミング学習
データベース定義は超重要!システム開発を始める前に知っておきたい構造と構成の考え方

  システムやアプリ開発をする場合、そのほとんどでデータベースを使用しますね。 それぞれのデータを連携させるためにも、その構造をどうするかは重要で、設計が甘ければシステムそのものの保守性はもちろん、想定していた仕組みを実現するのが難しくなることもあります。   今回は、これからデータベースを...

連続の技習得編 オブジェクトをセッションへ格納 PHPポケモン57
プログラミング
PHP,PHPポケモン,ポケモン
連続の技習得編 オブジェクトをセッションへ格納 PHPポケモン57

セッション経由でのオブジェクト引き継ぎ 技習得の処理が整ってきたので、ここで連続技習得・連続レベルアップ時にも問題なく動作するように作り込んでいきます。ですが、現状のモーダルをレスポンスやメッセージと同様に、そのまま引き継いだとしてもエラーが発生します。 その原因がセッション経由でのオブジェク...

CSSとの意外な関係「よくわかるSEO対策」スタイルシート編
SEO対策
CSS,スタイルシート,レンダリング
CSSとの意外な関係「よくわかるSEO対策」スタイルシート編

   今回の「よくわかるSEO対策」はスタイルシート(CSS)編です。   多くの人が 「SEO対策なのに、CSSの説明をするの?」 と思うかも知れませんが、これには意外な関係性があったのです。   現在CSSを学んでいる人、そしてCSSの書き方ならマスターしているといった人でも、SEOのことまでを考慮した記述ができて...

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

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

「発想と企画を量産する」第3回 朝活のまとめ
イベント
三宮,朝活,神戸
「発想と企画を量産する」第3回 朝活のまとめ

  第3回朝活を実施しました。   この記事では、その中で取り上げられた内容について具体的な考え方や内容をまとめていますので、ぜひ興味を持たれた方は次回朝活へお越しください。   今回の朝活のサブタイトルは「発想と企画を量産する」になります。      「話のネタが無い」は禁物   ブログで...

売れるECサイトになるために必要な3つの戦略
マーケティング
ECショップ,コンサルティング
売れるECサイトになるために必要な3つの戦略

  ECサイトで全く売れない・・・   ネットショップのオープンが手軽で安価になり、クレジット決済も主流の今ECサイトを立ち上げるお店も増えてきました。 しかし期待感とは裏腹に、思ったような売上が出なかったり、お客さんが1人も獲得できていないケースも少なくありません。   今回はそういった「...

config実装編(ドット記法・多次元配列) PHPポケモン 71
プログラミング
PHP,PHPポケモン,ポケモン
config実装編(ドット記法・多次元配列) PHPポケモン 71

configファイルの作成 プログラミングでは設定値というものを使うことが良くあります。量が多い場合はデータベースへ格納して管理する場合も多いですが、わざわざテーブルを用意してまで格納するほどのものでなければ、ファイルに配列として定義してアクセスできる方が便利です。フレームワークではこれらをconfigフ...

カテゴリ

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