プログラミング

ポケモン預かりシステム編 PHPポケモン 85

PHP PHPポケモン ポケモン
ポケモン預かりシステム編 PHPポケモン 85

ポケモン預かりシステムとは

ポケモンは手持ち(パーティー)に6匹しか入れることができません。そのため、ポケモンを捕まえた際にその上限に達していれば、ボックスへ転送するという仕組みPHPポケモンでも実装していきます。これが、ポケモン預かりシステムです。

今回は前段階であるボックスの仕様決めをメインに解説します。

 

機能について

ボックスを作成するにあたって機能面について確認していきましょう。世代によってはアイテムやメールの管理もできますが、アイテムはカテゴリ分けしてカバンへ入れられるようにしており、わざわざ預けて管理する必要もないので現段階では不要とします。

 

預ける

ポケモンを預ける方法は、「手持ちが6匹の状態で、新しく1匹を捕まえた際の自動転送」と、「ボックスに接続してパーティーからポケモンを預ける」の2通りです。

第1世代ではポケモンを預けた際に体力や状態異常の回復処理はされませんでしたが、PHPポケモンでは第2世代以降を参考に全回復の処理は実装します。

また、ボックスに預ける際も通常ルート外からのアクセスを防ぐために、ポケモンの立場が味方(friend)のみに制限をかけておきます。

  

引き取る

預けたポケモンをパーティーへ加えるためには、ボックスへアクセスしてポケモンを引き取るという手順になります。

手持ちに既に6匹いれば追加することができず、1匹を預けてから引き取るという手順を踏む必要があります。第2世代ではボックス整理、第3世代からはポケモンを預けずに入れ替えることができるなど操作性は向上し、自由度も高い機能となっていました。ですが、処理自体が複雑になる可能性を考慮し、PHPポケモンでは処理それぞれを独立させて実装予定です。

 

処理速度問題

データベースを使用していないPHPポケモンでは、ボックスを作成するにあたって、1点気になるポイントがあります。それは「膨大なデータの暗号化と復号化」についてです。

こちらの問題点をまとめながら、検証していきましょう。

 

暗号化と復号化

画面移管時にはセッション経由でデータを渡しています。そのため、オブジェクト(インスタンス)をそのまま送ることができず、毎回暗号化(シリアライズ)して文字列として格納しています。画面再開時には復号化(アンシリアライズ)して再度使用できる状態にしていますが、これをポケモンボックスのように膨大なオブジェクトを抱えた配列に対して行えば膨大な処理時間がかかることが予想されます

 

そこで今回検証するのは、データをシリアライズ(暗号化)して文字列として格納するのと、オブジェクトとして格納するのでは、どれぐらいの速度差があるのかです。

ポケモンボックスはクラスと作成し、その1つのプロパティ(配列)のポケモン情報を格納していくことになります。ですが、このポケモンボックスのクラスを復号化、または暗号化すれば、中に保管されているものがオブジェクトか文字列かで差がでることが予想されます。

もしこの差がごく小さなものであれば、オブジェクトで格納しても問題ありませんが、明らかな差が出れば、ポケモン自体は常に暗号化された状態で保管しておき、必要なとき(ボックスへのアクセス時)にだけ復号化するようにしなければなりません。

 

なので、上記検証をするためにテストコードを使って速度計算をしてみました。

<?php
class TestChild
{
    public $name = '子テスト';
    public $desc = '子テスト説明';
}
class Test
{
    public $tests = [];
    public function __construct($serialize=false)
    {
        for($i=0;$i<10000;$i++){
            if($serialize){
                // シリアライズ(暗号化)して格納
            $test = new TestChild;
            $this->tests[] = serialize($test);
            }else{
                // オブジェクトそのまま格納
            $this->tests[] = new TestChild;
            }
        }
       
    }
}
 
$start = microtime(true);
 
// 計測する処理 ====
$test = new Test(); #インスタンス化
$serialize = serialize($test);
$un = unserialize($serialize);
// ====
 
$time = microtime(true) - $start;
echo "{$time} 秒"; # かかった時間

 

計測する処理のインスタンス化時に引数で暗号化・復号化の分岐をさせています。ポケモンオブジェクトのような複雑なクラスで検証するのは手間なので、今回は物量でカバーするため、forを使って1万個の子オブジェクトを格納しています。

まずは引数なし(オブジェクトのまま格納)の速度結果です。

0.018399953842163 秒

 

次に、引数trueのシリアライズ(暗号化)して文字列として格納した際の速度結果です。

0.007889986038208 秒

 

若干のばらつきはありますが、暗号化すると速度を1/2程度に抑えることができました。なので、膨大なポケモンオブジェクトが格納される可能性のあるボックスは、基本的に暗号化した状態で保管するようにしておき、ボックスへアクセスした場合のみ復号化するような仕様で作成していきます。

※実際のポケモンでもボックスアクセス時にはセーブや切り替えという機能があるので、似たような理由が存在しているのかも知れません。言語の違いもあるため実際のところはわかりませんが、実際に作る側に回ってみるといろいろな気付きがあります

 

まとめ

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

今回のPHPポケモンでは、ポケモン転送システムについてご紹介しました。

次回からはいよいよ機能実装を進めていきますので、乞うご期待ください。

 

注目の記事

ピカチュウから学ぶオブジェクト指向 〜クラス継承編〜 2
プログラミング
PHP,PHPポケモン,オブジェクト指向,ポケモン
ピカチュウから学ぶオブジェクト指向 〜クラス継承編〜 2

  ピカチュウから学ぶオブジェクト指向の第2弾はオブジェクトの継承についてです。 前回作成したピカチュウクラスを使用するので、もし基礎的な内容を学習したい人は、以下の記事を参考にしてください。   オブジェクトの継承が理解できれば、複雑で規模の大きなシステムを構築することができるようになり...

プログラミングを優しく解説!学んで得する3つの理由
プログラミング
プログラミング教育
プログラミングを優しく解説!学んで得する3つの理由

  プログラミング教育が始まるけど、そもそもよくわかっていない   2020年からは小学校がプログラミング学習が必修化され、翌年には中学校でも導入予定です。 しかし、保護者からすると全くわからず困惑していたり、教える先生たち教師陣からしてもよくわかっていないケースは少なくありません。   今回...

レベニューシェアとは?利益報酬・共同事業に潜む罠
フリーランス
レベニューシェアとは?利益報酬・共同事業に潜む罠

  レベニューシェアという言葉を聞いたことがありますか?   ビジネスの世界にいる人なら、意味は知らなくてもやったことがある方が意外と多いはずです。特にフリーランスの人や、プログラミングやデザインといったスキルを持っている人はレベニューシェアでは重宝されるため多い傾向があります。ここ最近...

状態異常演出編 PHPポケモン 62
プログラミング
PHP,PHPポケモン,ポケモン
状態異常演出編 PHPポケモン 62

状態異常の演出 今回は「状態異常」にかかった際の動的な変更、演出を実装していきます。 どく状態になれば、メッセージに合わせて「どく」を表記、まひ状態になれば、メッセージに合わせて「まひ」をセットするという単純なものです。   返り値の変更 それではまず、状態異常をセットしてメッセージを生成して...

進化の石編(実装)PHPポケモン103
プログラミング
PHP,PHPポケモン,ポケモン
進化の石編(実装)PHPポケモン103

アイテムによる進化 前回作成した、進化アイテムによる構成の続きです。   進化アイテムとして「かみなりのいし」、ピカチュウの進化判定を作成したので、アイテムの使用から進化処理までを作成、実装します。   今回作成する処理は以下の2点です。 アイテムの使用判定 進化画面への移管   それ...

教師が勝ち組!?出会い&学習の超正統派マッチングサービスとは【ビジネス企画書】
ビジネスモデル
マーケティング
教師が勝ち組!?出会い&学習の超正統派マッチングサービスとは【ビジネス企画書】

  「出会いがない」   社会人になると多くの人が抱く悩みの1つです。職場の男女比率や年齢層が理由の人もいれば、同じ職場での出会いは求めていない人もいるでしょう。 今回はそんな「出会い」を解決するための企画「出会い&学習の超正統派マッチングサービス」について、企画案と考察をまとめました。   ...

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

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

PHPポケモン「バトルシステム編 〜バトル終了判定〜」28
プログラミング
JavaScript,jQuery,PHP,PHPポケモン,ポケモン
PHPポケモン「バトルシステム編 〜バトル終了判定〜」28

バトル終了判定 今回はバトル終了判定を実装しましょう。今までは「にげる」による戦闘離脱のみで、ひんし状態でも殴り合うことが出来たので、それを解消するためにも戦闘結果による判定を導入します。   ひんし状態の監視 まずは「ひんし」の監視です。現在は交代ポケモンどちらか一方がひんし状態になれば、そ...

カテゴリ

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