プログラミング

ポケモン預かりシステム編 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ポケモンでは、ポケモン転送システムについてご紹介しました。

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

 

注目の記事

フリーランスのための値段交渉術!案件はこうやって見極めろ
フリーランス
フリーランスのための値段交渉術!案件はこうやって見極めろ

  「これもっと安くならない?」 「他の人はこれぐらいの金額でやってくれるよ」   こういった値切り交渉を受けたことがある人もいるのではないでしょうか?技術を提供するフリーランスであれば、金額を落とすということは自分の価値を下げているということを理解しておかなければなりません。 値段交渉...

お金を生む仕組みを理解しよう【知っておきたい3つのポイント】
マーケティング
お金を生む仕組みを理解しよう【知っておきたい3つのポイント】

  どんなビジネスが儲かるのか・・・   一度はこういった悩みを持ったことがあるのではないでしょうか。 それを知るためには、どういった要素がお金を生むために作用しているのかを理解しておく必要があります。 今回は「お金を生む仕組み」について、知っておいてためになる基礎的な部分をわかりやすく...

動画編集で知っておくべき基本的な3工程
動画編集
Adobe,AfterEffects,Illustrator,Photoshop,PremierePro
動画編集で知っておくべき基本的な3工程

  YouTubeに動画を投稿したいけど、動画の基本的な作成手順がわからない・・・   動画作成をするためのソフトは色々ありますが、有料なものであればやはりAdobe製品に軍配が上がります。 しかし準備したは良いものの、いろんなソフトが合ってどれを使えばよいか分からないという悩みを抱えている方は非常...

PHPポケモン「バトルシステム編〜経験値の獲得〜」29
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「バトルシステム編〜経験値の獲得〜」29

経験値の獲得 今まではポケモンに直接経験値を与えるというチートびっくりの仕様でしたが、バトルシステムも終盤に差し掛かってきたので「倒したポケモンから経験値を取得する」というごく当たりまえの仕様を導入していきます。   基礎経験値の設定 では、経験値の計算式に入る前に、必要なパラメーターを1つ用...

仕事用PCは2年で買い替えろ!その理由とは?
フリーランス
MacBook
仕事用PCは2年で買い替えろ!その理由とは?

  「あなたはパソコンをどのタイミングで買い替えますか?」   私は先日、2015年モデルのMacbookPro15インチから最新モデルのMacbookPro13インチに買い替えました。その理由は、メモリが32GBになったことや、15インチが持ち運びという点で見れば向いていないと判断したということ、そこそこの年数が経...

フリーランスの仕事の取り方教えます!この3つを押さえておけばOKです【企業も応用可】
フリーランス
フリーランス,独立,起業
フリーランスの仕事の取り方教えます!この3つを押さえておけばOKです【企業も応用可】

  仕事ってどうやってとればいいの?   独立したい、起業したいと考えている人の多くが、仕事はどうやってとればいいのかと悩んで足踏みしています。 実は、基本的な3つのポイントさえ知っていれば、継続して仕事を受注することは簡単です。 今回は自分が実際にやっていることを例に「フリーランスなら...

できるやつの「雑学力」
雑記
勉強法,雑学力
できるやつの「雑学力」

  テレビのコメンテーター、討論番組の出演者で活躍するほとんどの人は物知りだ。 あなたも「よくそんなことまで知っているな」と思ったことはあるだろう。 現代で起業して成功し続ける人のほとんどが、常に新しい情報を取り入れている。 そして得た情報に対して、歴史情報と照らし合わせ、自分なりの意見や解釈を...

デザイン
サムネイル,デザイナー,バナー,広告
デザイナーにセンスは必要ない!誰でも作れるおしゃれなサムネイル

  「デザイナーになるためにはセンスが必要ですか?」   バナーづくりの小規模講習会を実施した際に、この質問した人がいました。 よくある質問なのですが、いつも決まって自分の回答は「NO」です。   実際に一流のデザイナーとして活躍するレベルまでいくには、確かにセンスと呼ばれているものが必要...

カテゴリ

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