プログラミング

トレーナー戦編 トレーナー情報の作成 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ポケモンでは「トレーナ戦に向けたトレーナ情報の作成」についてご紹介しました。

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

 

注目の記事

食に関する考察 自炊と節約は成立するのか?
雑記
食に関する考察 自炊と節約は成立するのか?

スキル関係の記事が多めの当ブログですが、今回は「食」をテーマに触れていきます。突き詰めていけば食も立派なスキルであり、奥が深いものです。更に、生活の基盤となるため多くの人がこの問題に直面することであり、健康とも直結するため仕事などにおけるパフォーマンスにも大きく関係します。   これから一人暮ら...

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

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

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

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

動画編集に役立つ基本的な考え方【Adobe AfterEffects】
動画編集
Adobe,AfterEffects,PremierePro,YouTube
動画編集に役立つ基本的な考え方【Adobe AfterEffects】

  YouTubeの人気に合わせて、動画編集の需要も高まってきましたが、その大変さから挫折してしまう人も続出しています。 動画編集は奥が深く、技術的な部分に関してはプロのクリエイターであっても自分がよく使うような一部しか把握していないのが普通であり、調べても該当する情報が出てきにくいということもあ...

PHPポケモン「引数メソッド実行編」デモ有り(御三家の追加)11
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「引数メソッド実行編」デモ有り(御三家の追加)11

  前回のPHPポケモンではメソッドを外部から実行できるようにコントローラー(インターフェース)を作成しました。なので、今回は引数が必要となるメソッドの実装に挑戦してみましょう。 最後にはデモページを準備しているので、気になった人はぜひ遊んでみてください。   第1回はコチラ     ...

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

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

人に相談しても期待はするな【行動もどきって?成功する人と失敗する人の違いとは】
雑記
自己啓発
人に相談しても期待はするな【行動もどきって?成功する人と失敗する人の違いとは】

  「とにかく行動しろ」 「いろんな人に会え」 「どんどん外注しろ」   どれも覚えておきたい教訓ではありますが、その本質が見抜けなければ逆効果になります。 行動であっても、それが行動もどきになっている人は多く、人に会って人生が変わるということも受け身であれば全く意味がありません。外注に...

オブジェクト指向有効活用編 PHPポケモン 93
プログラミング
PHP,PHPポケモン,ポケモン
オブジェクト指向有効活用編 PHPポケモン 93

オブジェクト指向の有効活用 β版に向けた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 fortify function Google Google AdSense Honeycode htaccess HTML IEEE 802.11ax Illustrator Instagram IoT JavaScript jetstream jQuery jQuery UI keyword LAN Laravel Linux MacBook MAMP meta MLM MySQL NoCode note OS OSI参照モデル Paypal Photoshop PHP phpMyAdmin PHPポケモン PremierePro rss 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 独立 神戸 福祉 秘密鍵 翻訳 自己啓発 英語 見積書 計算機 認証 読書 起業 迷惑メール 配列 銀の弾丸 集客 雑学力