プログラミング

トレーナー戦編 トレーナー情報の作成 PHPポケモン 97

PHP PHPポケモン ポケモン
トレーナー戦編 トレーナー情報の作成 PHPポケモン 97

トレーナー戦

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

  • 複数匹のポケモン
  • 逃げられない
  • 捕まえられない
  • 賞金

 

複数匹のポケモン

ざっくりと必要な項目は、上記の4つです。トレーナーはプレイヤーと同じく、最大6匹のポケモンを所有することができるため、1匹倒しても戦闘終了とはいきません。

 

逃げられない

「逃げる」という判定も不要なため、こちらは「降参」という項目で置き換えます。降参した場合は通信対戦と同じく「負け」という判定を行います。こちらは通常のポケモンバトルではないためPHP独自の仕様で実装となります。

 

捕まえられない

野生ポケモンはボールを投げることで捕まえられますが、相手トレーナーが所有しているポケモンはそうはいきません。なので、ボールが使用されたとしても捕獲判定は行わず、処理自体をストップさせアラートを表示させる必要があります。

 

賞金

トレーナー戦に勝利することで、賞金が貰えます。それに対して、敗北することで所有しているおこづかいが半分失われます。これらはトレーナー情報作成時に賞金を割り当てることで、実装します。

 

トレーナー情報の作成

それではまず、トレーナー情報の作成から初めましょう。プレイヤーと同様にパーティー管理ができるように、クラスとして「Trainer」を用意します。

 

トレーナー(/Classes/Trainer.php
<?php
/**
* トレーナー情報
*/
class Trainer
{
 
    /**
    * 名前
    * @var string
    */
    protected $name = '';
 
    /**
    * パーティー
    * @var array
    */
    protected $party = [];
 
    /**
    * 持ち物
    * [[class => string, count => int|null], ...]
    * @var array
    */
    protected $items = [];
 
}

 

初代では設定されていませんでしたが、第2世代からはそれぞれのトレーナーに名前が割り振られていたので、格納用にnameのプロパティを用意しました。

プレイヤーと同じくパーティー格納用のプロパティ、そして今後アイテムの仕様も考慮した上でアイテムプロパティも同じように準備しました。

 

ポケモンクラスなどは、これを親クラスとしてそれぞれのポケモン情報を作成していましたが、トレーナーにはそこまで膨大な設定値が必要ありません。なので、クラスではなく配列としてファイルを準備しました。

 

トレーナー情報(/Config/trainer.php
<?php
# トレーナー情報
return [
    'cool_trainer' => [
        'name' => 'エリートトレーナー',
        'level' => 1, # 必要なプレイヤーレベル
    ],
];

 

まずはトレーナーの大きな括りとして、configファイルにフィールド情報と同じ要領で値を用意しました。世代によって異なりますが「虫取り少年」や「エリートトレーナー」など複数に解れているため、これらをカテゴリとしてプレイヤーレベルを割り当てていきます。

 

次に、どんなポケモンを所有しているかなど、トレーナー個別の情報をStorageに作成していきます。

 

エリートトレーナー ユウキ(/Storage/Database/Trainer/cool_trainer/yuuki.php
<?php
return [
    'name' => 'ユウキ',
    'money' => 500,
    'lines' => [
        'lose' => 'やるね',
        'win' => 'まだまだだね',
    ],
    'party' => [
        [   # 1匹目(ライチュウ)
            'class' => 'Raichu',
            'level' => 3,
            'move' => [
                'MoveThunder', 'MoveGrowl', 'MoveQuickAttack', 'MoveMegaPunch'
            ],
        ],
        [   # 2匹目(ピジョン)
            'class' => 'Pigeon',
            'level' => 3,
        ],
        [   # 3匹目(リザード)
            'class' => 'Lizardo',
            'level' => 3,
            'move' => [
                'MoveLeer', 'MoveRage', 'MoveSlash', 'MoveFlamethrower'
            ],
            'ev' => [
                'H' => '6',
                'A' => '0',
                'B' => '0',
                'C' => '252',
                'D' => '0',
                'S' => '252',
            ],
        ],
    ],
];

 

PHPの配列で用意、こちらをincludeで読み込むという方式です。

もしexcelなどで管理したい方は、csv形式でデータを準備すると管理がスムーズです。今回は読み込みの手間も考えて配列形式を採用しています。

  

トレーナー演出とデータの読み込み

linesキーに登録されているメッセージは、勝利時・敗北時に表示されるメッセージです。

通常トレーナーではそこまで重要視されない要素ですが、ジムリーダーなどの特別なトレーナー戦を実装するためには必要になるので、こちらも指定できるようにしています。

 

では、作成した設定データをTrainerクラスに読み込むようメソッドを追加していきましょう。

 

トレーナー(/Classes/Trainer.php
<?php
/**
* トレーナー情報
*/
class Trainer
{

    /**
    * 名前
    * @var string
    */
    protected $name = '';
 
    /**
    * パーティー
    * @var array
    */
    protected $party = [];
 
    /**
    * 持ち物
    * [[class => string, count => int|null], ...
    * @var array
    */
    protected $items = [];
 
    /**
    * セリフ
    * @var array
    */
    protected $lines = [
        'win' => '修行が必要だね',
        'lose' => '次は勝つよ',
    ];
 
    /**
    * @param trainer:array
    * @param category:string
    * @return void
    */
    public function __construct(array $trainer, string $category)
    {
        $this->init($trainer, $category);
    }
 
    /**
    * 初期化
    * @param trainer:array
    * @param category:string
    * @return void
    */
    private function init(array $trainer, string $category): void
    {
        // トレーナーカテゴリ
        $this->category = $category;
        // トレーナー名の生成
        $this->name = $trainer['name'];
        // パーティーの生成
        $this->generateParty($trainer['party']);
        // セリフの格納
        if(isset($trainer['lines'])){
            $this->lines = $trainer['lines'];
        }
        // 賞金
        $this->money = $trainer['money'] ?? 100;
    }
 
    /**
    * パーティーの生成
    * @param party:array
    * @return void
    */
    private function generateParty(array $party): void
    {
        $this->party = array_map(function($data){
            // ポケモンのインスタンスを生成
            $pokemon = new $data['class']($data['level'] ?? 10);
            // トレーナー用のポケモンに書き換え
            return $pokemon->initTrainerPokemon($data);
        }, $party);
    }
 
    /**
    * トレーナーカテゴリを取得
    * @return string
    */
    public function getCategory(): string
    {
        return $this->category;
    }
 
    /**
    * トレーナーカテゴリ名を取得
    * @return string
    */
    public function getCategoryName(): string
    {
        return config('trainer.'.$this->category.'.name');
    }
 
    /**
    * 名前の取得
    * @return string
    */
    public function getName(): string
    {
        return $this->name;
    }
 
    /**
    * カテゴリ名付きの名前を取得
    * @return string
    */
    public function getPrefixName(): string
    {
        return config('trainer.'.$this->category.'.name').'の、'.$this->name;
    }
 
    /**
    * パーティーを取得
    * @return array
    */
    public function getParty(): array
    {
        return $this->party;
    }
 
    /**
    * 所有数を取得
    * @return integer
    */
    public function getPartyCount(): int
    {
        return count($this->party);
    }
 
    /**
    * 空き数を取得
    * @return array
    */
    public function getPartyEmptyCount(): int
    {
        return 6 - count($this->party);
    }
 
    /**
    * セリフの取得
    * @param situation:string
    * @return string
    */
    public function getLine($situation): string
    {
        return '「'.($this->lines[$situation] ?? '...').'」';
    }
 
    /**
    * ポケモン情報を取得
    * @param order:integer
    * @return object::Pokemon|null
    */
    public function getPartner(int $order)
    {
        return $this->party[$order] ?? null;
    }
 
}

 

configに作成したのが第2引数の$category、トレーナー情報として用意した配列が第1引数の$trainerになっています。こちらを、initメソッドで当てはめていくという仕様です。

 

パーティーの生成では、レベル指定がなければ10レベルでポケモンを生成しています。

さらに、ポケモンクラスに追加したトレーナー用のメソッドについても見てみましょう。

 

ポケモンクラス(/Classes/Pokemon.php
/**
* トレーナーポケモン用の初期化
* @param data:array
* @return object::this
*/
public function initTrainerPokemon(array $data): object
{
    // 指定した技への書き換え
    if(isset($data['move'])){
        // 技が存在していれば、初期化して再セット
        $this->move = [];
        foreach($data['move'] as $move){
            $this->setMove($move);
        }
    }
    // 個体値の書き換え
    if(isset($data['iv'])){
        // もしポケモン個別で設定があれば、優先
        $this->iv = $data['iv'];
    }else{
        // オール10(標準)
        $this->iv = array_map(function(){
            return 10;
        }, $this->iv);
    }
    // 努力値の書き換え
    if(isset($data['ev'])){
        $this->ev = $data['ev'];
    }
    // 全回復状態にする
    $this->recovery();
    return $this;
}

 

こちらはトレーナーポケモン専用のメソッドです。

技の指定があればそちらを採用、なければレベルに合わせたレベルアップ技をそのまま採用しています。個体値は指定がなければオール10、努力値は指定がなければ0としています。

この辺りは、ジムリーダーなど特別なトレーナーでは個別設定した値が使えるようにしました。

 

ポケモン生成後には、HPの個体値が変更になっていることも考慮して、全回復の処理を挟んでいます。

これで、トレーナー専用のポケモンとトレーナー情報の生成準備が整いました。

  

まとめ

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

今回のPHPポケモンでは「トレーナ戦に向けたトレーナ情報の作成」についてご紹介しました。

次回はバトルシステムへの組み込みをしていきますので、ぜひ参考にしてみてくださいね。

 

注目の記事

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

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

【Laravel7】既存makeテンプレートのカスタマイズ Requestサンプル有り
プログラミング
Laravel,Linux,PHP
【Laravel7】既存makeテンプレートのカスタマイズ Requestサンプル有り

  Laravel7では新しい機能が様々導入されており、Webアプリケーションの開発がよりスムーズなものとなってきています。その中でも、もどかしい場所へ手を届いたと感じさせてくれたのが、既存makeコマンドのstubを簡単にカスタマイズできるようになったことです。   今回は既存make用stubの取得コマンドと、リ...

XserverにSequel ProでSSH接続する方法を4ステップでわかりやすく解説
ネットワーク
phpMyAdmin,Sequel Pro,SSH,Xserver,データベース,公開鍵,秘密鍵
XserverにSequel ProでSSH接続する方法を4ステップでわかりやすく解説

  AWSなどが注目される中、Xserver(エックスサーバー)は操作やセットアップが簡単で、ポートフォリオや業務、個人ブログ(WordPess)で使用している方に需要が高いサービスです。 そしてMacのPCを使っている方はデータベースの管理ツールとして、無料で使えるSequel Proが人気があり、多くのユーザーが使用し...

フリーランスなら心がけておきたい3つのルール【仕事と遊びは両立させろ】
フリーランス
フリーランス,独立
フリーランスなら心がけておきたい3つのルール【仕事と遊びは両立させろ】

  フリーランスになっても不安がいっぱい   会社というものに縛られないというのは楽なイメージがありますが、それ相応の不安がついてまわります。 その結果、会社員へと舞い戻ってしまうと再度そこから抜け出すことは非常に困難です。   今回は、現在活動している人や、これから独立しようとしている...

大半のネットワークビジネスが成立しない理由とは【権利収入の落とし穴】
マーケティング
MLM
大半のネットワークビジネスが成立しない理由とは【権利収入の落とし穴】

  誘われたけど、欠点が上手く説明できない 権利収入って本当にもらえるの?   ネットワークビジネスと聞けば、良い印象を抱かない人がほとんどでしょう。ですが、「何故?」と問われて説明できる人は意外にも少数派です。 そして、SNSを積極的に活用している人ならば、一度は誘いを受けたことがあるの...

PHPポケモン「バトルシステム編〜状態異常1〜」30
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「バトルシステム編〜状態異常1〜」30

状態異常チェック 今回は少し先延ばししていた状態異常判定を一部作成していきましょう。 状態異常では「行動前」と「行動後」に判定するものに分けることができます。 行動前 まひ、ねむり、こおり  行動後 どく、もうどく、やけど   まずは簡単な行動前から実装していきます。行動前に判...

グローバル&ヘルパー関数編 PHPポケモン 61
プログラミング
PHP,PHPポケモン,ポケモン
グローバル&ヘルパー関数編 PHPポケモン 61

進化や技習得、HPバーや経験値バーの演出ができているのに、なぜ状態異常の演出はされていないの?   そう感じている方が少なからずいるはずです。 現段階では、状態異常になっても次の画面に移管しなければ表示されません。これは、PHP側で内部処理は行われているが、メッセージに合わせた動的な変更がされていな...

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

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

カテゴリ

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