プログラミング

トレーナー戦編 トレーナー情報の作成 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ポケモン「バトルシステム実装編〜タイプ相性の判定〜」デモ&配布有り 19
プログラミング
jQuery,PHP,PHPポケモン,ポケモン
PHPポケモン「バトルシステム実装編〜タイプ相性の判定〜」デモ&配布有り 19

  システムを組むなら、仕様書や設計書はしっかり作りましょう。   ということで、またまたフォルダ移動やページ分けなどを見えないところでやりました。正直説明すると全く進まなくなりそうなので、改修部分は必要最低限にします。 結論、説明しません。(コード配布するので許してください)   そして今...

ネットワークとは【 第1回 ド素人のためのネットワーク講座】
ネットワーク
Wi-Fi,インターネット
ネットワークとは【 第1回 ド素人のためのネットワーク講座】

  身近なもの、普段から触れているものであっても、詳しく知らないものや、正しい理解が出来ていないものは多いですね。 その中の一つに「ネットワーク」というものがあります。   この講座は、一般的に言われる「コンピューター・ネットワーク」についてを説明していきます。 これからシステム関係の...

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

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

SEOで強いURLとは?安易に決めると危険だった!「よく分かるSEO対策」パーマリンク編
SEO対策
WordPress,ブログ
SEOで強いURLとは?安易に決めると危険だった!「よく分かるSEO対策」パーマリンク編

  パーマリンクの設定ってSEO対策に関係あるの?   意外と気になっているポイントではないでしょうか。実は、URLとSEO対策には全くの無関係ではなく、安易に決めてしまうとせっかく積み上げた資産的価値を台無しにしてしまうかも知れない危険なポイントでもあるのです。   今回は、ブログの収益化を目指...

パーティー実装編 トレーナーの作成 PHPポケモン 63
プログラミング
PHP,PHPポケモン,ポケモン
パーティー実装編 トレーナーの作成 PHPポケモン 63

パーティーとは ポケモンでは、ゲーム・アニメ共に最大6匹のパートナーポケモンと旅をすることができます。7匹以上は持ち歩くことができず、ボックスに転送されてしまうという仕組みです。そして、その6匹のパートナーポケモンの構成をパーティーと呼んでいます。 現在のPHPポケモンでは1匹のポケモンしか管理で...

進化アニメーション 前編 PHPポケモン 59
プログラミング
PHP,PHPポケモン,ポケモン
進化アニメーション 前編 PHPポケモン 59

進化アニメーションの実装 今回は後回しにしていた進化アニメーションの作り込みをしていきます。今までもレベルに達すれば進化はしていましたが、その演出はありませんでした。また、ポケモンではBボタンを押すことで進化のキャンセルをすることができます。なので、この辺りも実際のゲームを再現していきましょう。...

プレイヤーのグローバル化編 PHPポケモン 78
プログラミング
PHP,PHPポケモン,ポケモン
プレイヤーのグローバル化編 PHPポケモン 78

2日ほどwiki作成にいそいそと励んでいましたが、開発をお休みしていたわけではありません。追加機能を実装するに辺り、色々と改善点が挙がってきたので、このタイミングでしっかりと見直しをしました。   本格的なシステム開発では、最初に仕様書や設計書が作成され、それに沿って作成していくことになります...

フリーランスの仕事の取り方教えます!この3つを押さえておけばOKです【企業も応用可】
フリーランス
フリーランス,独立,起業
フリーランスの仕事の取り方教えます!この3つを押さえておけばOKです【企業も応用可】

  仕事ってどうやってとればいいの?   独立したい、起業したいと考えている人の多くが、仕事はどうやってとればいいのかと悩んで足踏みしています。 実は、基本的な3つのポイントさえ知っていれば、継続して仕事を受注することは簡単です。 今回は自分が実際にやっていることを例に「フリーランスなら...

カテゴリ

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