プログラミング

反動技編(はかいこうせん・とびひざげり)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ポケモンは「反動技(はかいこうせん・とびひざげり)」の作成方法を紹介しました。

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

 

注目の記事

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

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

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

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

簡単に良質なブログ記事を量産する3箇条【ネタがないとは言わせない】
ライティング
ブロガー,ブログ
簡単に良質なブログ記事を量産する3箇条【ネタがないとは言わせない】

  ブログの毎日のテーマ決めが大変・・・ そもそも良質な記事をどうやって書けるようになるのかわからない   こんな悩みを抱えていませんか? 始めたばかりで伸び悩んでいる人には多いのではないでしょうか。 今回はブログで収益化や、アクセス数を伸ばそうと考えている人へ向けて「簡単に良質なブログ...

くれくれ姿勢が実は起業の近道だった!相手のことを考え過ぎるとハマる落とし穴とは
雑記
フリーランス,独立,起業
くれくれ姿勢が実は起業の近道だった!相手のことを考え過ぎるとハマる落とし穴とは

  仕事ください アドバイスしてください 〇〇について教えてください   こういったくれくれ姿勢の人は多く、投げかけられた側からすると「メリットは?」と感じてしまいます。 ですが実はこのくれくれ姿勢には意外な成功の要因が隠れています。多くの自己啓発記事やツイートをする人はこの本質的なものに触...

名刺は時代遅れ!?Googleの名刺検索「ピープルカード」とは
フリーランス
Google,SEO
名刺は時代遅れ!?Googleの名刺検索「ピープルカード」とは

  Googleが2020年8月よりインドでピープルカードの検索機能を開始しました。これがフリーランスや個人事業主、起業家などに対して営業ツールとして大きな影響をもたらすのでは無いかと期待されており、今後ビジネスにおける繋がりが大きく変化していくことも予想されます。   今回は、そんなGoogleの新し...

システムエンジニア向けまとめ情報サイト IT News Checker
ネットワーク
システムエンジニア向けまとめ情報サイト IT News Checker

新年のスタートダッシュが遅れ気味に見えるかも知れませんが、年末からじっくりと作業を進めており、やっとある程度形になりました。 師走の如く作業に走り、気分転換に雪遊びもしつつ、成人式を終えた辺りでリリースしたのが「IT News Checker」です。   IT News Checkerとは 簡潔に説明すると、まと...

PHPポケモン「バトルシステム実装編〜タイプ相性の判定〜」デモ&配布有り 19
プログラミング
jQuery,PHP,PHPポケモン,ポケモン
PHPポケモン「バトルシステム実装編〜タイプ相性の判定〜」デモ&配布有り 19

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

config実装編(ドット記法・多次元配列) PHPポケモン 71
プログラミング
PHP,PHPポケモン,ポケモン
config実装編(ドット記法・多次元配列) PHPポケモン 71

configファイルの作成 プログラミングでは設定値というものを使うことが良くあります。量が多い場合はデータベースへ格納して管理する場合も多いですが、わざわざテーブルを用意してまで格納するほどのものでなければ、ファイルに配列として定義してアクセスできる方が便利です。フレームワークではこれらをconfigフ...

カテゴリ

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