Warning: session_save_path(): Cannot change save path when headers already sent in /home/yqual/s-yqual.com/public_html/s-yqual/public/yqual/wp-content/themes/yqual/session.php on line 2

Warning: session_start(): Cannot start session when headers already sent in /home/yqual/s-yqual.com/public_html/s-yqual/public/yqual/wp-content/themes/yqual/session.php on line 3

Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in /home/yqual/s-yqual.com/public_html/s-yqual/public/yqual/wp-content/themes/yqual/session.php on line 5
プログラミング

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

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

 

注目の記事

知らなきゃ損!表記ゆれに強いSEO対策とは「オーガニック検索ユーザーを増やそう」
SEO対策
description,keyword,meta,title
知らなきゃ損!表記ゆれに強いSEO対策とは「オーガニック検索ユーザーを増やそう」

  「なかなかオーガニック検索の割合が増えない」 「どういったSEO対策をすればいいかわからない」   ブログやサイト運営者の方で、思うように成果が出ないと悩んでいる人は、まだまだSEO対策が十分ではない可能性があります。そして、SEO対策の中でも知らないと損する一つが「表記ゆれ」への対応です。 ...

Zoomも飲み屋もなくならない 〜コロナ収束後の本当の世界〜
雑記
YouTube,Zoom,コロナ,テレワーク,リモートワーク
Zoomも飲み屋もなくならない 〜コロナ収束後の本当の世界〜

  新型コロナウイルスのニュースが絶えない毎日を過ごす中、コロナの内容に一度も触れていませんでしたがそろそろ触れておこうと思います。   マイナスな内容は不安を煽るような推測はSNSやニュースでイヤというほど目にしているので、可能性を感じられる内容と現実をお届けします。   コロナが収束した時、この...

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

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

進化の石編(構成) PHPポケモン 102
プログラミング
PHP,PHPポケモン,ポケモン
進化の石編(構成) PHPポケモン 102

進化の石 ピカチュウさんもそろそろ進化したがっているので、β版の公開に向けて進化の石を実装していきます。しかし、イーブイなど特別な進化先や条件を持ったポケモンを考慮すると、少し実装が手間取りそうだったので、今回は構成部分のみのまとめとなっておりますので、ご了承ください。   アイテムクラスの作...

PHPポケモン「レベルアップ進化編」9
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「レベルアップ進化編」9

  PHPポケモン(旧:ピカチュウから学ぶオブジェクト指向)も第9回目となりました。前回GitHubよりコードを配布したので、これから学習しようと考えている人は、ぜひ参考にしてください。   最初からコードの内容について学びたい人は、ぜひ記念すべき第1回から順を追って取り組んでみてください。   ...

パーティーの並び替え編 PHPポケモン 82
プログラミング
PHP,PHPポケモン,ポケモン
パーティーの並び替え編 PHPポケモン 82

パーティーの並び替え ポケモンをバトルに選出する際に欠かせないのが「パーティーの並び替え」です。パーティーの先頭(ひんし状態でない)がポケモンでは自動的に選択されるため、戦闘前に並び替えをしておく必要があります。 ゲーム上では簡単に見える処理ですが、これがPHPで行うとなれば少し厄介な問題が出てき...

データベース定義は超重要!システム開発を始める前に知っておきたい構造と構成の考え方
プログラミング
MySQL,データベース,プログラミング学習
データベース定義は超重要!システム開発を始める前に知っておきたい構造と構成の考え方

  システムやアプリ開発をする場合、そのほとんどでデータベースを使用しますね。 それぞれのデータを連携させるためにも、その構造をどうするかは重要で、設計が甘ければシステムそのものの保守性はもちろん、想定していた仕組みを実現するのが難しくなることもあります。   今回は、これからデータベースを...

HPバーアニメーション 後編 フロント側の対応 PHPポケモン 44
プログラミング
PHP,PHPポケモン,ポケモン
HPバーアニメーション 後編 フロント側の対応 PHPポケモン 44

HPバーアニメーション それでは前回に続き、HPバーのアニメーションづくりをしていきましょう。前回、メッセージに合わせてレスポンスを返却するというサーバー側の仕組みを作成しました。なので、今回はそれをフロント側で受け取り、タイミングよくアニメーションで再現します。   フロント側(js)の処理 前回...

カテゴリ

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