プログラミング

パーティー実装編 戦闘に参加するポケモン 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ポケモンは、パーティーから戦闘に参加させるポケモンを選出する方法をご紹介しました。

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

 

注目の記事

ゲームバランス調整編 DateTimeクラスの活用 PHPポケモン 101
プログラミング
PHP,PHPポケモン,ポケモン
ゲームバランス調整編 DateTimeクラスの活用 PHPポケモン 101

ゲームバランスの調整 まだまだ開発途中のPHPポケモンはゲームバランスの調整がほとんどされていません。現段階では機能も揃っていない関係上、完全なゲームバランスを求めて行くことにはあまり意味がありませんが、今後調整するための役割として機能自体は作成しておこうというのが今回の目的です。   トレーナ...

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

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

データ軽量化編 β版へ向けて  PHPポケモン 90
プログラミング
PHP,PHPポケモン,ポケモン
データ軽量化編 β版へ向けて PHPポケモン 90

β版の実装に向けて 大型アップデートにより、ある程度機能改善や実装箇所も増えてきましたが、それと同時に次の段階への移行が本格的に見えてきました。それがβ版です。   PHPポケモンは2020年12月現在α版となっており、完全な試作段階のWEBアプリケーションです。セーブ機能はなく、セッションの有効期...

PHPポケモン「タイプ実装編」15
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「タイプ実装編」15

ポケモンのタイプについて  2020年剣盾シリーズでのポケモンでは、全18タイプが実装されています。初代では15タイプ(あく、はがね、フェアリーを除く)からスタートして、たった3つのタイプしか増えていない、と感じる方もいるかも知れませんが、この追加に関してもバトルの歴史を大きく動かしてきたのです...

HPバーアニメーション前編 サーバー側の対応 PHPポケモン 43
プログラミング
PHP,PHPポケモン,ポケモン
HPバーアニメーション前編 サーバー側の対応 PHPポケモン 43

動きのあるHPバーづくり それではデモ公開に先立ち、HPバーの作り込みをしていきたいと思います。 現在のPHPポケモンは、ダメージ計算などが終わった結果をすべて返却しているため、技選択をして次の画面に移行すると、HPが減った状態でスタートしていました。これでは、どの技でどれぐらいのダメージを与え、状態変...

なぜプロは有線のマウスやキーボードを選ぶのか?【有線VS無線】
雑記
Bluetooth
なぜプロは有線のマウスやキーボードを選ぶのか?【有線VS無線】

  無線が普及する現代、何故有線のマウスやキーボードは売れているのか   いろんなものが製品の進化と共に無線化している一方、有線の需要も高く、とくにプロなど上層で活躍する人は有線を選択するケースが少なくありません。 今回は、そんな有線と無線の違いや、それぞれのメリットについて解説していき...

なぜ(・・? あなたはMacを使うのか?
雑記
AWS,Linux,MacBook,OS,Windows
なぜ(・・? あなたはMacを使うのか?

  あなたが使っているPCはなんですか?   たまに聞かれることがあります。 そこで「Macを使っています」と答えると「何故?」という次の問いが返ってくることがあります。   あなたがもしMacを使っているのであれば、このときになんと答えますか?   今回のテーマは、「何故Macを使っているの?」と...

定数と静的変数 ピカチュウとイーブイで学ぶオブジェクト指向
プログラミング
PHP,PHPポケモン,イーブイ,オブジェクト指向,ピカチュウ,ポケモン
定数と静的変数 ピカチュウとイーブイで学ぶオブジェクト指向

PHPポケモンも順調に開発が進んでいると思いきや、ふとした気づきが自分の理解力を思い知らせることとなった今日このごろです。 プログラミングは奥が深く、しっかりと段階を追って理解を進めていけば、「これ・・・便利やんけ!」ってなることがかなり多いということがわかります。   それでは、かの有名な黄色い...

カテゴリ

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