プログラミング

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

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

 

注目の記事

壁技編(リフレクター・ひかりのかべ)PHPポケモン 51
プログラミング
PHP,PHPポケモン,ポケモン
壁技編(リフレクター・ひかりのかべ)PHPポケモン 51

壁技とは 前回実装した「しろいきり」と同じく、初代から実装されたフィールド効果技が存在します。それが「壁技」です。 壁(ポケモンwiki) https://wiki.ポケモン.com/wiki/壁 壁とは、バトルにおける場の状態の一種、およびその場を形成するわざの総称。わざとしては第一世代から存在するが、場の状...

ビジュアル作り込み編(序) PHPポケモン66
プログラミング
PHP,PHPポケモン,ポケモン
ビジュアル作り込み編(序) PHPポケモン66

ビジュアルの作り込み 最近は内部の作り込みが多かったので、今回のPHPポケモンでは見た目を少しだけ作り込んでいきます。とはいっても、機能自体がそこまで揃っていないため、あくまで仮の見た目となります。 ある程度見た目が整っていると、プレイする側のモチベーションや楽しみも増えると思ったので、こちらは並...

賢い集客でボロ儲け!?仕事や案件に困らない基本戦略・3選
マーケティング
賢い集客でボロ儲け!?仕事や案件に困らない基本戦略・3選

  「仕事はどうすればもらえるの?」 「集客って何すればいいかわからない」 「告知ってどんな媒体をどう使えばいいの?」   フリーランスで仕事の取り方がわからず苦戦している人や、サービスや商品は作ったものの集客の方法がわからず悩んでいる人のほとんどが、集客のテクニックばかりに目線がいってしま...

独立するならWordPress理解しておけばOK!プログラミングでフリーランスはこれ一つで成り立ちます
プログラミング
PHP,WordPress,フリーランス,独立
独立するならWordPress理解しておけばOK!プログラミングでフリーランスはこれ一つで成り立ちます

  プログラミングでフリーランスを目指すには、どの言語始めればいいの?   プログラミングの学習を始めたのに、それをどう活かせばよいか分からず、いざフリーランスで活動しようと思ってもイメージできずに断念してしまう人は多いです。 言語にも向き不向きがあるため、フリーランスとして活動するために向...

【配列とは】初心者が最短でPHPを使えるようになるための実践的な学び方
プログラミング
foreach,PHP,配列
【配列とは】初心者が最短でPHPを使えるようになるための実践的な学び方

  初心者の方、今からプログラミングを始める方、HTMLとCSSの領域から抜け出せない人たちを対象にした、PHPをできるだけ使えるようになるための方法を紹介するコーナー。 栄えある第二回は【配列編】です。   第一回を飛ばしてこのページへに来てしまい「変数って何?」というレベルの人は、第一回の【変数編...

ブラウザで遊べる「PHPポケモン」
プログラミング
PHP,PHPポケモン,ポケモン
ブラウザで遊べる「PHPポケモン」

PHPポケモン 約1ヶ月半をかけて作り込んできたPHPポケモンですが、ある程度遊べるぐらいのレベルになったので、みなさまにも体験・楽しんでいただけるよう本日(2020年10月12日)より一般公開します。   PHPポケモンへのリンクは本記事の最後に用意しておりますので、プレイする前に注意事項等に目を通し...

PHPポケモン「タイプ実装編」15
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「タイプ実装編」15

ポケモンのタイプについて  2020年剣盾シリーズでのポケモンでは、全18タイプが実装されています。初代では15タイプ(あく、はがね、フェアリーを除く)からスタートして、たった3つのタイプしか増えていない、と感じる方もいるかも知れませんが、この追加に関してもバトルの歴史を大きく動かしてきたのです...

へんしん編 PHPポケモン 74
プログラミング
PHP,PHPポケモン,ポケモン
へんしん編 PHPポケモン 74

へんしんとは 今回はサムネイルに合わせて、特別技の1つ「へんしん」を実装します。  へんしん https://wiki.ポケモン.com/wiki/へんしん   へんしんを使うことで、相手ポケモンをコピーすることができますが、その全てをコピーするわけではありません。コピーできる項目とそうでない項目は以下の通りで...

カテゴリ

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