プログラミング

反動技編(はかいこうせん・とびひざげり)PHPポケモン40

PHP PHPポケモン ポケモン
反動技編(はかいこうせん・とびひざげり)PHPポケモン40

反動技とは

ポケモンでは反動技というものがあります。反動によっても様々で、現在の仕組みのままでも実装可能なものや、新たに処理が必要なものまであります。なので、一律で反動技という同じ処理は出来ません 

反動技(ポケモンwiki

反動技(はんどうわざ)は、威力が大きい代わりに、自分が何らかのリスク(反動)を負うわざの俗称。 

  • 反動の種類
    1. 与えたダメージに対応した反動ダメージを受ける
    2. 与えたダメージによらずにダメージを受ける
    3. 技が外れるとダメージを受ける
    4. ひんしになる
    5. 動けなくなる
    6. 能力が低下する

 

1番と2番と6番は、技のeffectメソッドにて実装することができます。1番であれば「とっしん」や「すてみタックル」、2番であれば「わるあがき」が該当します。6番の能力低下技は第1世代の技の中にはありませんが、自分に対象の能力低下を行うだけなので、処理はさほど変わらず実装が簡単です。

4番の「ひんしになる」技は「じばく」や「だいばくはつ」が該当します。こちらは第1世代の技に該当するため作成しますが、今回はスルーします。

 

では、残りの3番「技が外れるとダメージを受ける」と、5番の「動けなくなる」を作成していきましょう。

 

はかいこうせん

まずは第1世代での高火力技の1つである「はかいこうせん」を作成します。こちらは、使用すると次のターン行動ができないという反動があります。技が外れると反動は発生しないため、こちらはeffectメソッドと状態変化を利用して反動の判定を導入しましょう。

 

反動による行動不能

技を使用後、使用ポケモンに「反動がある」という状態を残し、次のターンに伝える必要があります。なので、状態変化に格納するために新しく反動クラス(ScRecoil)を作成しましょう。

 

反動:状態変化(/Classes/StateChange/ScRecoil.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/StateChange.php');
 
// 反動
class ScRecoil extends StateChange
{
 
    /**
    * 正式名称
    * @var string
    */
    protected $name = '反動';
 
    /**
    * 行動失敗
    * @var string
    */
    protected $failed_msg = '::pokemonは、反動で動けない';
}

 

行動失敗時(反動で動けない)際のメッセージのみ設定しています。次に、技(はかいこうせん)のeffectメソッドを使って反動をセットします。

 

はかいこうせん(/Classes/Move/SuperBeam.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Move.php');
 
// はかいこうせん
class HyperBeam extends Move
{
 
    /**
    * 正式名称
    * @var string
    */
    protected $name = 'はかいこうせん';
 
    /**
    * 説明文
    * @var string
    */
    protected $description = '使ったポケモンは次のターン、反動で動けない。';
 
    /**
    * タイプ
    * @var string
    */
    protected $type = 'Normal';
 
    /**
    * 分類
    * @var string(physical:物理|special:特殊|status:変化)
    */
    protected $species = 'special';
 
    /**
    * 威力
    * @var integer
    */
    protected $power = 150;
 
    /**
    * 命中率
    * @var integer
    */
    protected $accuracy = 90;
 
    /**
    * 使用回数
    * @var integer
    */
    protected $pp = 5;
 
    /**
    * 優先度
    * @var integer
    */
    protected $priority = 0;
 
    /**
    * 追加効果
    *
    * @param array $args
    * @return void
    */
    public function effects(...$args)
    {
        /**
        * @param Pokemon $atk 攻撃ポケモン
        * @param Pokemon $def 防御ポケモン
        */
        list($atk, $def) = $args;
        // はんどうをセット
        $atk->setSc('ScRecoil');
    }
 
}

※setScのホワイトリストにScRecoilを追加しておきましょう

 

これで、はかいこうせんがヒットすれば反動状態をセットすることができます。

 

次に、行動前の状態変化チェックで反動の判定を追加しましょう。

 

チェック用トレイト(/App/Traits/Service/Battle/ServiceBattleCheckTrait.php
/**
* アタック前の状態変化チェック
* 1. ひるみ
* 2. 反動
* 3. こんらん
* @param object Pokemon
* @return boolean
*/
protected function checkBeforeSc($pokemon)
{
    $sc = $pokemon->getSc();
    if(empty($sc)){
        // 状態変化にかかっていない
        return true;
    }
    /**
    * ひるみ
    */
    if(isset($sc['ScFlinch'])){
        // 行動失敗(ひるみ解除はcheckAfterScで行う※先手はひるみの影響を受けないため)
        return false;
    }
    /**
    * 反動
    */
    if(isset($sc['ScRecoil'])){
        $recoil = new ScRecoil;
        // 反動メッセージを格納
        $this->setMessage($recoil->getFailedMessage($pokemon->getPrefixName()));
        // 反動解除
        $pokemon->releaseSc('ScRecoil');
        return false;
    }
    /**
    * こんらん
    */

 

反動はひるみ状態にされて行動不能になると解除されません。また、こんらんチェックの前に反動チェックが入るため、ひるみの後、こんらんの前に反動チェックを入れておきます。

 

チェック内容は至って簡単です。反動(ScRecoil)がセットされているかどうかを確認して、あれば行動不能メッセージを格納して反動解除、なければ次のチェックに移行するだけです。

 

これで反動による行動不能処理は完成です。

 

行動不能時のループ処理

反動があれば、次のターンの行動選択ができません。なので、チャージターンと同様に次のターンの行動をループさせましょう。

 

まず、簡単に対象の状態変化が確認できるようにポケモンクラス用のチェックトレイトを新しく用意しましょう。

 

チェックトレイト:ポケモン用(/Traits/Class/Pokemon/ClassPokemonCheckTrait.php
<?php
trait ClassPokemonCheckTrait
{
 
    /**
    * 状態変化の確認用メソッド
    * @param string $key
    * @return void
    */
    public function checkSc($key)
    {
        if(isset($this->sc[$key])){
            return true;
        }else{
            return false;
        }
    }
 
    /**
    * 現在のレベルで覚えられる技があるか確認する処理
    *
    * @return integer
    */
    protected function checkMove()
    {
        // レベルアップして覚えられる技があれば習得する
        $level_move_keys = array_keys(array_column($this->level_move, 0), $this->level);
        foreach($level_move_keys as $key){
            $move_class = $this->level_move[$key][1];
            // 覚えようとしている技(クラス)が存在かつ重複していないか
            if(class_exists($move_class) && !in_array($move_class, $this->move, true)){
                // 技クラスをセット
                $this->setMove($move_class);
                // インスタンス化
                $move = new $move_class();
                $this->setMessage($move->getName().'を覚えた!', 'success');
            }
        }
    }
 
}

※ポケモンクラスに記述していた技チェックメソッド(checkMove)も移動しました

 

これで、checkScというメソッドを使えば、指定した状態変化にかかっているかどうかが簡単に確認できますね。

それでは、こちらを使ってループ処理を作成しましょう。

 

バトルコントローラー(/App/Controllers/Battle/BattleController.php
/**
* @return void
*/
public function __construct()
{
    // 親コンストラクタの呼び出し
    parent::__construct();
    // 引き継ぎ
    $this->takeOver();
    // 分岐処理
    $this->branch();
    // 次のターンへの分岐(ループ処理)
    while($this->nextTurn());
    // 親デストラクタの呼び出し
    parent::__destruct();
}
 
-- 省略
 
/**
* 次のターンへの判定処理
*
* @return boolean
*/
private function nextTurn()
{
    // ひんしポケモンがでた場合の処理
    if($this->fainting['enemy'] || $this->fainting['friend']){
        $this->judgment();
        return false;
    }
    // チャージ中または反動有りなら再度アクション実行
    if($this->chargeNow() || $this->pokemon->checkSc('ScRecoil')){
        $this->branch();
        return true;
    }else{
        $this->setMessage('行動を選択してください');
        return false;
    }
}

 

まずはコンストラクタ内で呼び出しているnextTurnメソッド部分を修正しました。

// 次のターンへの分岐(ループ処理)
while($this->nextTurn());

 

処理なしのwhileの判定にnextTurnメソッドを使用しています。もしnextTurntrueを返せば再度nextTurnを実行します。falseを返した時点で処理が終了です。

今までnextTurnメソッドでは返り値無しとしていましたが、もし処理が残っていればtrue、なければfalseを返すように変更しました。

/**
* 次のターンへの判定処理
*
* @return boolean
*/
private function nextTurn()
{
    // ひんしポケモンがでた場合の処理
    if($this->fainting['enemy'] || $this->fainting['friend']){
        $this->judgment();
        return false;
    }
    // チャージ中または反動有りなら再度アクション実行
    if($this->chargeNow() || $this->pokemon->checkSc('ScRecoil')){
        $this->branch();
        return true;
    }else{
        $this->setMessage('行動を選択してください');
        return false;
    }
}

 

チャージチェックと同じタイミングで反動チェックを行なっています。もしどちらかがtrueであれば、再度branchが実行されます。これで行動不能時はループ処理が実行されて次のターンを自動処理してくれます。

※ループ処理を導入する際は永久ループに陥らないように注意してください

 

それでは「はかいこうせん」を使って動きを確認してみましょう。

 

 

 

 

正常に反動メッセージが返ってきました。これで反動技による行動不能の実装は完了です。

 

とびひざげり

数ある中でもわずかですが、攻撃が外れることにより自らがダメージを受けるという技があります。その1つが「とびひざげり」です。こちらも初代でサワムラーが覚えるため、実装していきましょう。

 

行動失敗による反動ダメージ

反動ダメージを受ける技は「とっしん」などがありますが、これらと違って「とびひざげり」はeffectメソッドで処理ができません。なぜなら「攻撃が外れたらダメージを受ける」という反動のため、外れた際にはeffectメソッドが実行されないからです。

 

なので、新しく技クラスにfailedという失敗時に実行するためのメソッドを作成しましょう。

 

技クラス(/Classes/Move.php
/**
* 技の失敗
*
* @param object Pokemon $atk
* @return void
*/
public function failed($atk)
{
    //
}

 

ほとんどの技では使用しないため、おなじみ空メソッドを作成しておきます。引数には攻撃ポケモンのインスタンス(オブジェクト)を受け取りましょう。

 

次に、とびひざげりのクラスを作成します。

 

とびひざげり(/Classes/Move/HighJumpKick.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Move.php');
 
// とびひざげり
class HighJumpKick extends Move
{
 
    /**
    * 正式名称
    * @var string
    */
    protected $name = 'とびひざげり';
 
    /**
    * 説明文
    * @var string
    */
    protected $description = '攻撃がはずれると自分最大HPの半分のダメージを受ける。';
 
    /**
    * タイプ
    * @var string
    */
    protected $type = 'Fighting';
 
    /**
    * 分類
    * @var string(physical:物理|special:特殊|status:変化)
    */
    protected $species = 'physical';
 
    /**
    * 威力
    * @var integer
    */
    protected $power = 130;
 
    /**
    * 命中率
    * @var integer
    */
    protected $accuracy = 90;
 
    /**
    * 使用回数
    * @var integer
    */
    protected $pp = 10;
 
    /**
    * 優先度
    * @var integer
    */
    protected $priority = 0;
 
    /**
    * 技の失敗
    *
    * @param object Pokemon $atk
    * @return void
    */
    public function failed($atk)
    {
        // 最大HPの1/2ダメージを受ける
        $atk->calRemainingHp('sub', $atk->getStats('HP') / 2);
        // メッセージをセット
        $this->setMessage('勢い余って'.$atk->getPrefixName().'は地面にぶつかった');
    }
 
}

 

処理内容は、calRemainingHpメソッドを使って最大HPの半分を自らから減算するというものです。

failedメソッドではeffect同様に返り値はありません。メッセージを自身に格納するので、必要であれば実行後にメッセージを取り出して使用しましょう。

 

では攻撃が外れた際と、こうかがない等で技が当たらなかった時に失敗処理を呼び出すように攻撃用トレイト内のattackメソッドへ記述しましょう。まずは同一処理ができるように、メッセージの取得までの一連の流れをまとめたattackFailedというメソッドを作成します。

 

攻撃用トレイト(/Traits/Service/Battle/ServiceBattleAttackTrait.php
/**
* 攻撃判定失敗時の処理
*
* @param object Pokemon $atk
* @param object Move $move
* @return void
*/
private function attackFailed($atk, $move)
{
    // 技の失敗メソッドを呼び出し
    $move->failed($atk);
    // もしメッセージが返ってきていれば格納
    if(!empty($move->getMessages())){
        $this->setMessage($move->getMessages());
        $move->resetMessage();
    }
}

 

では、攻撃失敗判定で処理を終了させる前に作成したメソッドを呼び出しましょう。

 

攻撃用トレイト:attackメソッド内(/Traits/Service/Battle/ServiceBattleAttackTrait.php
// 「こうかがない」の判定(命中率と威力がnullではなく、タイプ相性補正が0の場合)
if(!is_null($move->getAccuracy()) && !is_null($move->getPower()) && ($this->m === 0)){
    // こうかがない
    $this->setMessage($def_pokemon->getPrefixName().'には効果が無いみたいだ');
    // 失敗判定
    $this->attackFailed($atk_pokemon, $move);
    return;
}
// 命中判定
if(!$this->checkHit($atk_pokemon, $def_pokemon, $move)){
    // 攻撃失敗
    $this->attackFailed($atk_pokemon, $move);
    return;
}

 

では、実際にとびひざげりを使用して、技が外れた際の動きを確認してみましょう。

 

 

 

  

ガッツリと最大HPの半分の反動ダメージを受けることができました。calRemainingHpの引数は整数指定をしているため、小数点以下は切り捨てで計算されます。

 

これで、失敗時に反動ダメージを受ける技(とびひざげり)の実装が完了しました。

 

まとめ

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

今回のPHPポケモンは「反動技(はかいこうせん・とびひざげり)」の作成方法を紹介しました。

現在プログラミング学習に取り組んでいる方や、ゲーム開発に興味がある方は、ぜひ参考にしてみてくださいね。

 

注目の記事

挫折してしまう人に共通する3つの要因〜解決方法を紹介します〜
雑記
挫折してしまう人に共通する3つの要因〜解決方法を紹介します〜

  仕事が上手くいかない 思ったように学習成果がでない   こういった理由で挫折してしまう人は、意外にも考え方や行動が共通しています。 それが何かを知り、考え方や環境、対応方法を少し変えるだけで、劇的に余裕が生まれて自己肯定ができるようになります。その結果、強い人になれるのです。   今...

SNSだけじゃダメ!PV数アップのためにSEO対策する理由とは
SEO対策
Twitter
SNSだけじゃダメ!PV数アップのためにSEO対策する理由とは

  「SNSで集客しているけど中々伸びなくなってきた」 「たまにPV数がアップするけど安定しない」 「本当に月何十万も稼げるぐらいPVは伸びるの?」   PV数を稼ぐためにSNSを駆使したり、中には広告を使って集客しているサイトもあるでしょう。ですが、それだけでは疲弊しながらユーザーを獲得しているに...

OSI参照モデルとTCP/IP 〜ネットワークモデルとは〜【第3回 ド素人のためのネットワーク講座】
ネットワーク
OSI参照モデル,TCP/IP,ネットワークモデル,プロトコル
OSI参照モデルとTCP/IP 〜ネットワークモデルとは〜【第3回 ド素人のためのネットワーク講座】

  ド素人のためのネットワーク講座! 栄えある第3回は「ネットワークモデル」についてです。   横文字や英字が多くなってきたり、歴史的経緯が関係してきたりとややこしくなってくる部分ですが、ネットワークを理解するためには押さえておきたいポイントです。   プログラミングやシステムエンジニアとし...

PHPポケモン「レベルアップ進化編」9
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「レベルアップ進化編」9

  PHPポケモン(旧:ピカチュウから学ぶオブジェクト指向)も第9回目となりました。前回GitHubよりコードを配布したので、これから学習しようと考えている人は、ぜひ参考にしてください。   最初からコードの内容について学びたい人は、ぜひ記念すべき第1回から順を追って取り組んでみてください。   ...

目先の利益に気をつけろ!貧乏ビジネスという落とし穴
フリーランス
目先の利益に気をつけろ!貧乏ビジネスという落とし穴

  目先の利益を求めてしまい、来たるべきビジネスチャンスに対応できないというケースは貧乏ビジネスに陥る大きな要因になります。また、相手が下す評価に左右されてしまうことも、自らの評価を下げてしまったり、見積もりを作る上でも大きく影響を及ぼしてしまいます。   今回は「目先の利益に気をつけろ!貧...

ダメージ固定技編(ちきゅうなげ・カウンター) PHPポケモン 41
プログラミング
PHP,PHPポケモン,ポケモン
ダメージ固定技編(ちきゅうなげ・カウンター) PHPポケモン 41

ダメージ固定技とは PHPポケモンでも作成したダメージ計算機能ですが、ポケモンの技の中にはそれを必要としない技がいくつかあります。それが「固定ダメージ技」です。 ポケモンwiki(ダメージ固定技) https://wiki.ポケモン.com/wiki/ダメージ固定技 ステータスに依存せず、わざ自体にダメージ量が決...

PHPポケモン「バトルシステム編〜状態変化〜」32
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「バトルシステム編〜状態変化〜」32

状態変化とは  状態異常の実装が完了したので、いよいよ状態変化の実装に移ります。PHPポケモンで実装する状態変化とは以下の4つです。 こんらん ひるみ バインド やどりぎのタネ   上記4つを実装していきます。状態異常と異なり、技によっては追加になる可能性があります。 ※いかり状態など  ...

HTMLの基本設計「よくわかるSEO対策」構造化(マークアップ)編
SEO対策
HTML,SEO,マークアップ
HTMLの基本設計「よくわかるSEO対策」構造化(マークアップ)編

  HTML5がリリースされて随分経ちました。 それにより多くのタグが増え、それにより今までデザインを目的と使用されていたものが「構造化」という本来の役割を持たされるようになりました。    構造化は、目に見えにくい部分です   それぞれの役割を理解していなければ、せっかくきれいなサ...

カテゴリ

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