プログラミング

そらをとぶ&あなをほる編 PHPポケモン46

PHP PHPポケモン ポケモン
そらをとぶ&あなをほる編 PHPポケモン46

チャージ中の回避技

以前は「ロケットずつき」や「ソーラービーム」をサンプルとしてチャージ技を実装しましたが、今回は少し特別な効果をもったチャージ技を実装します。それが「そらをとぶ」と「あなをほる」です。これらは初代ポケモンでも重宝される技であり、チャージ中に相手からの攻撃を回避することができます。

前回のチャージ技の実装については以下の記事をご参考ください。

PHPポケモン「わざ編〜チャージ技の実装〜」34 PHPポケモン「わざ編〜チャージ技の実装〜」34

チャージ技とは ポケモンの技は数多く存在していて、その中でも特別な処理が必要なものがいくつかあります。その1つが「チャージ技」です。 ※チャージ技とはポケモン上で用いられている用語ではありません   現在実装している初代御三家+ピカチュウの初代レベルアップ技の中では以下の2つがあります。 ロ...

 

そらをとぶ

そらをとぶ(ポケモンwiki

 

まずは「そらをとぶ」から実装します。技クラスは以下の通りです。

 

そらをとぶ(/Classes/Move/Fly.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Move.php');
 
// そらをとぶ
class Fly extends Move
{
 
    /**
    * 正式名称
    * @var string
    */
    protected $name = 'そらをとぶ';
 
    /**
    * 説明文
    * @var string
    */
    protected $description = '1ターン目で空に舞い上がり、2ターン目に攻撃する。空を飛んでいる間はほとんどの技を受けない。';
 
    /**
    * タイプ
    * @var string
    */
    protected $type = 'Flying';
 
    /**
    * 分類
    * @var string(physical:物理|special:特殊|status:変化)
    */
    protected $species = 'physical';
 
    /**
    * 威力
    * @var integer
    */
    protected $power = 90;
 
    /**
    * 命中率
    * @var integer
    */
    protected $accuracy = 95;
 
    /**
    * 使用回数
    * @var integer
    */
    protected $pp = 15;
 
    /**
    * 優先度
    * @var integer
    */
    protected $priority = 0;
 
    /**
    * チャージ技
    * @var boolean
    */
    protected $charge_flg = true;
 
    /**
    * チャージ中に回避できない技
    * @var array
    */
    protected $cant_escape_move = ['Thunder', 'Gust'];
 
    /**
    * チャージ
    *
    * @param object $atk
    * @return boolean (true:準備ターン, false:攻撃ターン)
    */
    public function charge($atk)
    {
        /**
        * @param Pokemon $atk 攻撃ポケモン
        */
        // チャージ前後の分岐
        if($atk->checkChargeMove(get_class())){
            // チャージ完了
            $atk->releaseSc('ScCharge');
            return false;
        }else{
            // チャージ開始
            // 自身をチャージ状態にする
            $msg = $atk->setSc('ScCharge', 1, get_class());
            $atk->setMessage($msg);
            return true;
        }
    }
 
}

 

以前作成したチャージ技と同様に実装していきます。追加要素として、チャージ中に回避できない技をまとめておくプロパティcant_escape_move)を配列形式でセットしています。こちらは後ほど説明します。

 

あなをほる

あなをほる(ポケモンwiki

 

「そらをとぶ」と同じ要領で「あなをほる」の技も作成していきましょう。

 

あなをほる(/Classes/Move/Dig.php)
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Move.php');
 
// あなをほる
class Dig extends Move
{
 
    /**
    * 正式名称
    * @var string
    */
    protected $name = 'あなをほる';
 
    /**
    * 説明文
    * @var string
    */
    protected $description = '1ターン目で地中に潜り、2ターン目に攻撃する。地中に潜っている間はほとんどの技を受けない。';
 
    /**
    * タイプ
    * @var string
    */
    protected $type = 'Ground';
 
    /**
    * 分類
    * @var string(physical:物理|special:特殊|status:変化)
    */
    protected $species = 'physical';
 
    /**
    * 威力
    * @var integer
    */
    protected $power = 80;
 
    /**
    * 命中率
    * @var integer
    */
    protected $accuracy = 100;
 
    /**
    * 使用回数
    * @var integer
    */
    protected $pp = 10;
 
    /**
    * 優先度
    * @var integer
    */
    protected $priority = 0;
 
    /**
    * チャージ技
    * @var boolean
    */
    protected $charge_flg = true;
 
    /**
    * チャージ中に回避できない技
    * @var array
    */
    protected $cant_escape_move = ['Earthquake'];
 
    /**
    * チャージ
    *
    * @param object $atk
    * @return boolean (true:準備ターン, false:攻撃ターン)
    */
    public function charge($atk)
    {
        /**
        * @param Pokemon $atk 攻撃ポケモン
        */
        // チャージ前後の分岐
        if($atk->checkChargeMove(get_class())){
            // チャージ完了
            $atk->releaseSc('ScCharge');
            return false;
        }else{
            // チャージ開始
            // 自身をチャージ状態にする
            $msg = $atk->setSc('ScCharge', 1, get_class());
            $atk->setMessage($msg);
            return true;
        }
 
    }
 
}

 

あなをほるにも、チャージ中に攻撃を回避できない例外技があるため、プロパティを用意してまとめておきます。

 

例外技

では、2つの技クラスに新しく用意したプロパティ(cant_escape_move)ともう1点例外処理について説明します。

 

回避できない技

今回実装する「そらをとぶ」と「あなをほる」ですが、チャージ中すべての技を回避できるわけではありません。それぞれに例外となる技が存在しており、相手がその技を使用してくればチャージ状態で合ったとしてもダメージを受けてしまいます。

 

チャージ中に回避できない技

そらをとぶ状態

かみなり、かぜおこし

あなをほる状態

じしん

 ※初代技のみ

 

初代技の中でもそれぞれに回避不可能な技があります。なので、これらを判定するためにクラス名をcant_escape_moveプロパティに格納しました。

 

威力倍化技

点目の例外が、「威力が変動する技」についてです。例えば「かみなり」であれば、相手が「そらをとぶ」のチャージ中に使用することで技威力が倍の220になります。ですが、これは「そらをとぶ」ではなく「かみなり」の技に記述を追加する必要がありますので、新しくメソッドを作成して威力取得処理を修正しましょう。

 

かみなり(/Classes/Move/Thunder.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Move.php');
 
// かみなり
class Thunder extends Move
{
 
    /**
    * 正式名称
    * @var string
    */
    protected $name = 'かみなり';
 
    /**
    * 説明文
    * @var string
    */
    protected $description = '30%の確立で相手をまひ状態にする。';
 
    /**
    * タイプ
    * @var string
    */
    protected $type = 'Electric';
 
    /**
    * 分類
    * @var string(physical:物理|special:特殊|status:変化)
    */
    protected $species = 'special';
 
    /**
    * 威力
    * @var integer
    */
    protected $power = 110;
 
    /**
    * 命中率
    * @var integer
    */
    protected $accuracy = 70;
 
    /**
    * 使用回数
    * @var integer
    */
    protected $pp = 10;
 
    /**
    * 優先度
    * @var integer
    */
    protected $priority = 0;
 
    /**
    * 威力補正値の取得
    *
    * @param mixed
    * @return integer
    */
    public function powerCorrection(...$args)
    {
        /**
        * @param Pokemon:object $atk 攻撃ポケモン
        * @param Pokemon:object $def 防御ポケモン
        */
        list($atk, $def) = $args;
        // もし相手がそらをとぶチャージ中なら威力2倍
        if($def->getChargeMove() === 'Fly'){
            return 2;
        }
        // 通常補正値
        return 1;
    }
 
    /**
    * 追加効果
    *
    * @param array $args
    * @return void
    */
    public function effects(...$args)
    {
        /**
        * @param Pokemon $atk 攻撃ポケモン
        * @param Pokemon $def 防御ポケモン
        */
        list($atk, $def) = $args;
        // 相手が状態異常にかかっていない
        // 30%の確率
        if($def->getSa() || 30 < random_int(0, 100)){
            return;
        }
        // 相手をまひ状態にする
        $msg = $def->setSa('SaParalysis');
        // メッセージをセット
        $this->setMessage($msg);
    }
 
}

 

powerCorrectionというメソッドを作成して、相手の状態に合わせて威力補正値を取得しています。他の技は通常このメソッドは不要ですが、変化がない(1倍)を返却しなければいけないので、親クラスにデフォルト値を返却するためのメソッドを作成しておきましょう。

 

技クラス(/Classes/Move.php
<?php
$root_path = __DIR__.'/..';
require_once($root_path.'/App/Traits/InstanceTrait.php');
require_once($root_path.'/App/Traits/ResponseTrait.php');
 
// 技
abstract class Move
{
    use InstanceTrait;
    use ResponseTrait;
 
--省略
 
    /**
    * チャージ中に回避できない技
    * @var array
    */
    protected $cant_escape_move = [];
 
--省略
 
    /**
    * 威力補正値の取得
    *
    * @param mixed
    * @return integer
    */
    public function powerCorrection(...$args)
    {
        return 1;
    }
 
--省略
 
    /**
    * チャージ中に回避できない技を取得(チャージ技の場合)
    * @return array
    */
    public function getCantEscapeMove()
    {
        return $this->cant_escape_move;
    }
 
}

 ※回避不可の技を取得するためのメソッドと空プロパティも合わせて親クラスへ用意しています

 

では補正値計算を含めた威力の算出を、ダメージ計算前に追加しましょう。

 

攻撃用トレイト(/App/Traits/Service/Battle/ServiceBattleAttackTrait.php
/**
* 攻撃判定成功時の処理
*
* @param object $atk_pokemon
* @param object $def_pokemon
* @param object $move
* @return void
*/
private function attackSuccess($atk_pokemon, $def_pokemon, $move)
{
    if($move->getFixedDamageFlg()){
        /**
        * 固定ダメージ技
        */
        $damage = (int)$move->getFixedDamage($atk_pokemon, $def_pokemon);
    }else{
        /**
        * 通常技
        */
        // ローカル変数として補正値を用意
        $m = 1;
        // 必要ステータスの取得
        $stats = $this->getStats($move->getSpecies(), $atk_pokemon, $def_pokemon);
        // ダメージ計算(物理,特殊技)
        if($move->getSpecies() !== 'status'){
            // 急所判定
            $critical = $this->checkCritical($move->getCritical());
            if($critical){
                // 補正値を乗算
                $m *= $critical;
                $this->setMessage('急所に当たった!');
            }
            // 乱数補正値の計算
            $m *= $this->calRandNum();
            // タイプ一致補正の計算
            $this->calMatchType($move->getType(), $atk_pokemon->getTypes());
            // 技威力の取得(威力補正込み)
            $power = $move->getPower() * $move->powerCorrection($atk_pokemon, $def_pokemon);
            if(get_class($move) === 'Thunder'){
                var_export($power);
            }
            // ダメージ計算
            $damage = (int)$this->calDamage(
                $atk_pokemon->getLevel(),   # 攻撃ポケモンのレベル
                $stats['a'],                # 攻撃ポケモンの攻撃値
                $stats['d'],                # 防御ポケモンの防御値
                $power,                     # 技の威力
                $this->m * $m,              # 補正値(プロパティ*ローカル)
            );

 

ダメージ計算前に$powerという変数に、威力と補正値を乗算した値を格納して、それをダメージ計算の引数として渡しています。これで威力補正値込みでのダメージ計算を行うことができます。

 

回避判定

では、作成した回避判定を実装しましょう。こちらは攻撃用トレイトのcheckHitメソッド内に分岐を追加します。

 

攻撃用トレイト(/App/Traits/Service/Battle/ServiceBattleAttackTrait.php
/**
* 命中判定
*
* @param object $atk
* @param object $def
* @param object $move
* @return boolean
*/
private function checkHit($atk, $def, $move)
{
    // ふきとばし・ほえるのチェック
    if(in_array(get_class($move), ['Whirlwind', 'Roar'], true)){
        if($atk->getLevel() < $def->getLevel()){
            $this->setMessage($def->getPrefixName().'は平気な顔をしている');
            return false;
        }
    }
    // 相手のチャージ状態による判定チェック
    $charge_move_class = $def->getChargeMove();
    if(in_array($charge_move_class, ['Fly', 'Dig'], true)){
        $charge_move = new $charge_move_class;
        // 攻撃技が回避できない技リストになければ失敗
        if(!in_array(get_class($move), $charge_move->getCantEscapeMove(), true)){
            $this->setMessage($move->getFailedMessage($atk->getPrefixName()));
            return false;
        }
    }

 

もし防御ポケモンのチャージ状態が「そらをとぶ」か「あなをほる」であれば、回避不可技に現在使用している技が存在しているかどうかを確認しています。もしあれば、そのまま通常通り命中判定を行いますが、なければ攻撃が外れることになるためfalseを返却します。

 

それでは実際に確認してみましょう。

 

 

 

 

 

 

 

「なきごえ」は命中率100%の技ですが、あなをほる状態なので無事回避することができました。

 

次に「そらをとぶ」と「かみなり」の検証を行います。技を「かみなり」1択にしたライチュウを野生ポケモンとして固定します。

 

 

 

 

  

「そらをとぶ」状態にも関わらず、「かみなり」が当たりました。威力はvar_exportで出力してチェックしたところ、そらをとぶの前は110、そらをとぶ中には220という数値が出力されていたので、威力補正についても問題なく反映されています。

※まひになっている状態でまひにかかった旨のメッセージが出ているのは、HPと違ってステータス変化に対して動的な処理を行なっていないからです

  

まとめ

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

今回のPHPポケモンでは「そらをとぶ」と「あなをほる」の実装方法をご紹介しました。

現在プレイページを公開中ですので、気になる人はぜひ遊んでみてくださいね。

 

注目の記事

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

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

レポート(試験)編 PHPポケモン 94
プログラミング
PHP,PHPポケモン,ポケモン
レポート(試験)編 PHPポケモン 94

今回の内容は、あくまで試験的なものとなります。実際にそのままの仕組みで導入するかは未定です。 ※セーブ機能の実装自体は予定しております   また、今回はセーブするための仕組みの部分にのみにフォーカスを当てています。非公開ディレクトリやパーミッション等による最低限の対応は施していますが、試験的にア...

ノーコード開発で将来プログラミングは不要?我々は何を学ぶべきなのか
プログラミング
amazon,AWS,Honeycode,NoCode,プログラミング学習
ノーコード開発で将来プログラミングは不要?我々は何を学ぶべきなのか

  近年、プログラミングの需要は増え勢いを増していますが、それ以上にノーコードというソースコードを打たなくでもアプリ開発ができるというソフトウェアやプラットフォームが普及してきました。 これにより一部の期待感とは別に、プログラマーという職業は今後不要になるのではないかと危機感を抱く人が出て...

PHPポケモン「コントローラー編」〜POSTとSESSIONの活用〜 10
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「コントローラー編」〜POSTとSESSIONの活用〜 10

  今回のPHPポケモンでは、今まで作った機能用のコントローラーになるインターフェースを作成します。ポケモンやメソッドを選択できるようにして、よりゲーム性の高いアプリケーションを実装しましょう。   第1回から学習したい方はコチラ     コントローラーの実装   それでは実装したアクション...

バズる!ビジネスの見つけ方 〜何で起業するか悩んでいませんか?〜
マーケティング
ビジネス,起業
バズる!ビジネスの見つけ方 〜何で起業するか悩んでいませんか?〜

  独立や起業を志している9割以上の人が「何をビジネスにするか?」を悩んでいます しかし、それは負のサイクルです。 起業するためにビジネスを考えるという行為自体が”矛盾している”ということに気づかなければ、このサイクルからは抜け出すことができません。 その結果、行動できずに終わってしまう人は多...

ブログ収益化の道!挫折ポイントの回避方法を徹底解説【アドセンス合格は通過点、意外な収益ポイントとは】
ライティング
Google AdSense,ブログ
ブログ収益化の道!挫折ポイントの回避方法を徹底解説【アドセンス合格は通過点、意外な収益ポイントとは】

  ノマドワークや副業としてブログ単体で稼げるようになりたいと考えている人は多いですが、その大半は挫折してしまいます。 アドセンスの合格までに辿りつけなかったり、合格したは良いものの思うように伸びずに諦めてしまうというのがほとんどです。 実は、そのアドセンスに対する考え方自体が間違いであり...

【脱初心者向けプログラミング学習】処理を追え!「今、変数には何が入ってる?」
プログラミング
HTML,PHP,プログラミング学習
【脱初心者向けプログラミング学習】処理を追え!「今、変数には何が入ってる?」

  初心者から中々抜け出せない 1から処理をかけない   そんな悩みを抱えたプログラミング学習者に向けて、「脱初心者のためのプログラミング学習」についてPHPを例にまとめました。 やり方自体は同じですので、他の言語をメインとしている人は自分の環境に置き換えながら学習して、初心者から抜け出しましょ...

EC-CUBE4内にWordPressを設置(共存)する方法
SEO対策,プログラミング
EC-CUBE4,PHP,Symfony,Twig,WordPress
EC-CUBE4内にWordPressを設置(共存)する方法

今回使用したバージョン EC-CUBE4.0.5 WordPress5.6 ※EC-CUBE4、WordPressのカスタマイズは自己責任でお願いします。また、現在稼働中のサイトで試す際には、必ずバックアップを取ってから行なうようにしてください。   EC-CUBE4とは ネットショップを作るとなれば、様々なサービスが出回っ...

カテゴリ

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