プログラミング

ポケモンプロパティ編(全国図鑑No・捕捉率・重さ) PHPポケモン 77

PHP PHPポケモン ポケモン
ポケモンプロパティ編(全国図鑑No・捕捉率・重さ) PHPポケモン 77

PHPポケモン記事も記念すべき第77回を迎えることができ、これもひとえに皆様のお力があってのことです。いろんな方のご協力もあり(ドット絵とかドット絵とかドット絵とか)見た目はかなりゲームらしくなってきました。

しかし、肝心のゲーム要素が本家と比べればまだまだ機能も少なく未実装の項目も多いので、これを機に展開力を持たせるべくいろんな要素を追加していきます。

 

 ポケモンプロパティの追加

さて、ポケモンのプロパティとして様々な値を割り当ててきましたが、原作にはまだまだ及びません。初代がベースとなるので特性などの機能はしばらく先ですが、まだゲームを楽しむための要素は数多くあるので、それらを追加しつつ、機能実装を視野に入れていきましょう。

 

全国図鑑No

ポケモンといえば、バトルはもちろんコレクター要素も楽しみの1つです。中でもポケモン図鑑をいっぱいにするというのが、ゲームストーリー上はオーキドより課せられた指名でもあります。

なので、図鑑を作るために必要な要素である「全国図鑑No」をポケモンのプロパティとして割り当てていきましょう。

 

ピカチュウ(/Classes/Pokemon/Pikachu.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Pokemon.php');
 
// ピカチュウ
class Pikachu extends Pokemon
{
 
    /**
    * ポケモンナンバー
    * @var integer
    */
    protected $number = 25;

 

アニメポケモンの主人公ポケモンでもあるピカ様は、誰もが知っているように全国図鑑No025です。プログラムで管理する都合上、数値として保管しておくほうが都合良さそうだったので、数値としてnumberというプロパティにセットしました。

ただ、図鑑に表示する場合などには3桁ゼロ埋め表記も使いたくなるので、こちらは取得メソッド側に処理を加えて対応します。

 

ポケモン情報取得用トレイト(/App/Traits/Class/Pokemon/ClassPokemonGetTrait.php
<?php
trait ClassPokemonGetTrait
{
 
    /**
    * ナンバーを取得する
    * @param zero_fill:boolean
    * @return integer|string
    */
    public function getNumber($zero_fill=false)
    {
        if($zero_fill){
            // ゼロ埋め
            $zero = '';
            // ゼロ必要数の算出
            $zero_count = 3 - strlen($this->number);
            for ($i=0; $i < $zero_count; $i++) {
                $zero = $zero.'0';
            }
            // ゼロ埋め返却
            return $zero.$this->number;
        }else{
            // ナンバー返却
            return $this->number;
        }
    }

 

引数で数値かゼロ埋めを判別できる仕様です。これで状況に応じた値を受け取ることができるようになりました。

 

捕捉率

2つ目の追加プロパティは「捕捉率」です。これはポケモンの捕まえやすさに影響するため、今後パーティーを編成していくためには無くてはならない値の1つになります。

捕捉率は低ければ低いほど捕まえにくい(レアリティが高い)という仕様です。最大255の数値で表記され、伝説のポケモンなどは最小の3が割り当てられています。

 

では、全国図鑑Noと同じくピカチュウの捕捉率について見てみましょう。

/**
* 捕捉率
* @var integer
*/
protected $capture = 190;

 

ピカチュウの捕捉率は190で、全体で見れば比較的捕まえやすいポケモンです。ただ、序盤では捕獲用アイテム(ボール)の性能が低いということもあり、捕まえづらさは感じる絶妙なラインとなっています。それに対して御三家は、通常野生では出てくることがないポケモンのため、捕捉率が45と低くなっています。

こちらは全国図鑑Noとは異なり、そのままの値が取得できれば良いので、getCaptureメソッドでは、引数指定なしでそのままの値を返却するようにしています。

 

重さ

最後に追加するプロパティは「重さ」です。こちらは初代でも図鑑に表示するための値として用意されていましたが、バトルでは使われることがありませんでした。しかし、第3世代からは「けたぐり」が重さに合わせて威力が変動したり、バトルにおいても把握して置かなければならない値となりました。

 

こちらもピカチュウを例にプロパティを割り当てていきましょう。

/**
* 重さ
* @var numeric
*/
protected $weight = 6.0;

 

重さは小数点第1位までが設定されており一部の技威力にも関係してくるため、int型ではなくnumeric型で保管します。

こちらも捕捉率同様、getWeightというメソッドを作成してそのままの値を返却させます。

 

けたぐりの実装

では、今回追加したプロパティを使って、新しい技「けたぐり」を実装しましょう。

けたぐり(ポケモンwiki

 

初代・第2世代では威力50、追加効果として「30%の確率でひるみ」という技仕様でしたが、第3世代からは「相手の重さによって威力が変動する」という内容に変更されました。

 

まずは技クラスの基本部分から作成していきましょう。

 

けたぐり(/Classes/Move/MoveLowKick.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Move.php');
 
// けたぐり
class MoveLowKick extends Move
{
 
    /**
    * 正式名称
    * @var string
    */
    protected $name = 'けたぐり';
 
    /**
    * 説明文
    * @var string
    */
    protected $description = '相手の重さによって威力が変わる。';
 
    /**
    * タイプ
    * @var string
    */
    protected $type = 'TypeFighting';
 
    /**
    * 分類
    * @var string(physical:物理|special:特殊|status:変化)
    */
    protected $species = 'physical';
 
    /**
    * 威力
    * @var integer|null
    */
    protected $power = null;
 
    /**
    * 命中率
    * @var integer
    */
    protected $accuracy = 100;
 
    /**
    * 使用回数
    * @var integer
    */
    protected $pp = 20;
 
    /**
    * 対象
    * @var string
    */
    protected $target = 'enemy';
 
}

 

威力は対象がいなければ算出できないため、変化技や固定ダメージ技と同様にnullとしています。

 

威力の算出

それでは威力の算出方法についてです。けたぐりの威力値判定は以下の通りです。

第六世代以降

9.9kg20

10.0kg24.9kg40

25.0kg49.9kg60

50.0kg99.9kg80

100.0kg199.9kg100

200.0kg~:120

 

威力は最小値が20で、そこから20区切りで最大120まで上昇します。重さを上記の最低値と比較して、以上であれば20を加算するという処理を組めば威力の算出自体はさほど複雑ではありません。

 

ですが、変更した威力値を返す方法が現在のPHPポケモンの仕組みではできません。威力補正値用のメソッド(powerCorrection)を使えば算出できますが、ベースとなる威力自体がnullのため乗算すれば0になってしまいます。

威力を20で設定していれば乗算することで算出は可能ですが、本来威力の設定がない技に対して、処理の都合で値を組み込むこともしたくありません

フラグや分岐を追加して威力値を取得することもできますが、そもそもバトルメソッド自体が複雑化しているため、できるだけその辺りも最小限に抑えておきたいので、威力補正値の計算処理に対してNull合体演算子を用いることで対応します。

 

攻撃トレイト(/App/Traits/Service/Battle/ServiceBattleAttackTrait.php
// attackSuccessメソッド内
 
// 補正込みの技威力を取得(けたぐり等を考慮してnullの場合は1をセット)
$power = ($move->getPower() ?? 1) * $move->powerCorrection($atk_pokemon, $def_pokemon);
【PHP7】はてな2つとは??Null合体演算子を使った存在チェック 【PHP7】はてな2つとは??Null合体演算子を使った存在チェック

  PHP Notice:  Undefined variable: 変数名 in /***/***.php on line 2   PHPで変数や対象のキーが存在しない配列を使おうとすれば、上記のようなエラーが吐き出されますね。PHP5.6までは初期値を設定したり、issetで判定したりしてそれを回避していましたが、2015年末にリリースされたPHP7からは新しくN...

 

getPowerでは通常数値が返却されますが、けたぐりなどの威力変動がある技はnullが返ります。それを威力補正値で正常算出できるように、nullであれば1をセットするようにしました。

これなら、powerCrrectionメソッドで威力値計算をして返却することでそのままの威力を使うことが可能になります。

 

けたぐり(/Classes/Move/MoveLowKick.php
/**
* 威力補正値の取得
*
* @param mixed
* @return integer
*/
public function powerCorrection(...$args)
{
    /**
    * @param Pokemon:object $atk 攻撃ポケモン
    * @param Pokemon:object $def 防御ポケモン
    */
    list($atk, $def) = $args;
    // 防御ポケモンの重さを取得
    $weight_list = [0, 10, 25, 50, 100, 200];
    $power = array_map(function($weight) use($def){
        if($def->getWeight() >= $weight){
            return 20;
        }else{
            return 0;
        }
    }, $weight_list);
    // 威力合計値を補正値として返却
    return array_sum($power);
}

 

array_mapを使って配列内に威力を溜め、最終的にarray_sumで合計値を返却するようにしました。

これで、指定の重さ以上であれば20が上乗せされていくことで重さに対する威力を返すことができます。

 

実際にけたぐりを使ってみましょう。

 

おわかりいただけただろうか・・・

 

フシギダネの重さは6.9kg、それに対してフシギバナの重さは100.0kgです。フシギダネには威力20、フシギバナには威力120が算出されるため、フシギバナの方がダメージ量が多くなっていますね。

個体値によって防御力に差はありますが、種族値で見ればフシギバナの方が圧倒的に防御力が高いため、それに対して上回るダメージを与えられたということは、重さに合わせた威力算出がされているということになります。

 

これで、けたぐりの実装は完了です。

 

まとめ

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

今回のPHPポケモンでは「ポケモンプロパティの追加」と「けたぐりの実装」についてご紹介しました。

ポケモンに興味がある方、プログラミング学習に取り組んでいる方は、ぜひ参考にしてみてくださいね。

注目の記事

Toastr(トースト)活用編 PHPポケモン 100
プログラミング
JavaScript,PHP,PHPポケモン,ポケモン
Toastr(トースト)活用編 PHPポケモン 100

記念すべき第100回目です!   色々考えましたが、100回目だからと言って特別な内容ではなく、いつもの流れの延長での開発進行となります。ご了承ください。 今回は、何人かのプレイユーザーの声も参考にしながら、ユーザビリティをあげるための機能追加を進めていきます。   Toastr(トースト)と...

【Laravel7】既存makeテンプレートのカスタマイズ Requestサンプル有り
プログラミング
Laravel,Linux,PHP
【Laravel7】既存makeテンプレートのカスタマイズ Requestサンプル有り

  Laravel7では新しい機能が様々導入されており、Webアプリケーションの開発がよりスムーズなものとなってきています。その中でも、もどかしい場所へ手を届いたと感じさせてくれたのが、既存makeコマンドのstubを簡単にカスタマイズできるようになったことです。   今回は既存make用stubの取得コマンドと、リ...

フリーランス必見!良質案件を獲得するための3つのプロセス
フリーランス
フリーランス必見!良質案件を獲得するための3つのプロセス

  「良い案件に巡り会えない」 「なかなか仕事が受注できない」   駆け出しフリーランスや、これから独立しようと考えている人が直面する大きな悩みの1つですね。 ですが、意外にも自分でその案件自体を制限していたり、良質だった案件を自らで質を下げてしまっているというケースは少なくありません。...

これってスパム?amazon・paypalを装う悪質メールの対処方法とは
ネットワーク
amazon,Paypal,Xserver,スパム,三井住友,楽天,迷惑メール
これってスパム?amazon・paypalを装う悪質メールの対処方法とは

定期更新、役立つコラムのコーナー!   今回の注目したのは「迷惑(悪質)メールについて」です。   以前はamazonや楽天を名乗る業者から届いた迷惑メールについて紹介、その対処方法について取り上げましたが、今回は更にレベルアップしたスパムがいくつか届いたので、それらも紹介がてら、騙されないため...

PHPポケモン(α)第1回目の大型アプデ
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン(α)第1回目の大型アプデ

第1回目 大型アップデートについて 本日、PHPポケモンの大型アップデートをしました。 今回のアップデートには全体的なデザインチェンジが含まれているため、今まで遊んでくれていた人も、新鮮な気持ちで初められることができるはずです。   デザインについては、PHPを使った開発をしている人からすれば馴...

今からできる!ブログのアクセスを爆UPさせる3大SNS活用法
マーケティング
Facebook,Instagram,Twitter,ブロガー,ブログ
今からできる!ブログのアクセスを爆UPさせる3大SNS活用法

  ブログを収益化させたいけど、なかなかアクセス数が増えない 記事の質は高いのに、その良さをどうやって伝えれば良いかわからない   SEO対策をする上でも、収益化するためにも記事のクオリティは重要です。 しかし、せっかく良い記事を書いていても、そのブログや記事の存在を伝えることができなけれ...

PHPポケモン「2進化ポケモン実装編」8
プログラミング
PHP,PHPポケモン,プログラミング学習,ポケモン
PHPポケモン「2進化ポケモン実装編」8

  記念すべき?第8回目で遂にタイトル変更です。 (旧)ピカチュウから学ぶオブジェクト指向 (新) PHPポケモン   機能増設によりオブジェクト指向云々より、PHP学習がメインになったので泣く泣く変更です。(今の所)順調に続いているのも、多くの方?が見てくれているおかげです。感謝感激雨ア...

「発想と企画を量産する」第3回 朝活のまとめ
イベント
三宮,朝活,神戸
「発想と企画を量産する」第3回 朝活のまとめ

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