プログラミング

忘れさせる技選択 前編(覚えるのを諦める) PHPポケモン 55

PHP PHPポケモン ポケモン
忘れさせる技選択 前編(覚えるのを諦める) PHPポケモン 55

忘れさせる技の選択

PHPポケモンでは技習得時に忘れさせる技の選択が出来ず、古いものから順番に消えていっていました。ですが、これでは主力技として使っているものが、覚えたくもない技に消されてしまうということが起こってしまいます。

実際のゲームでも、技を覚えようとした際に既に最大数の4枠が埋まっていれば、代わりに忘れさせる技を選ぶことができます。今回はその「忘れさせる技の選択」を実装していきましょう。

 

技習得時の分岐

まず、技習得時の分岐について考えてみましょう。

忘れさせる技を選択させる以上、強制的に技を置き換える処理は一旦中断させなければなりません。なので、技習得時の選択肢は以下の2つになります。 

  1. 新しい技を覚えるのを諦める
  2. 現在覚えている技を指定して忘れさせる

 

新しい技を覚えるのを諦める

まずは処理が簡単な方から実装していきます。「新しい技を覚えるのを諦める」のは、現在の技構成から変更する必要がありません。なので、レスポンスに対して処理を行わなければ現在の技構成を維持することが可能です。

 

まずは、レベルアップ処理時の技習得処理に処理を加えていきましょう。

 

ポケモンクラスのチェック用トレイト(/App/Traits/Class/Pokemon/ClassPokemonCheckTrait.php
/**
* 現在のレベルで覚えられる技があるか確認する処理
*
* @return void
*/
protected function checkMove()
{
    // レベルアップして覚えられる技があれば習得する
    $level_move_keys = array_keys(
        array_column($this->level_move, 0),
        $this->level
    );
    foreach($level_move_keys as $key){
        $move_class = $this->level_move[$key][1];
        // 覚えようとしている技(クラス)が存在かつ重複していないか
        if(!in_array($move_class, array_column($this->move, 'class'), true)){
            // インスタンス化
            $move = new $move_class;
            if(count($this->move) < 4){
                /**
                * 技が4つ未満なら即習得
                */
                // 技クラスをセット
                $this->setMove($move);
                $this->setMessage($move->getName().'を覚えた!');
            }else{
                /**
                * 技選択用モーダルの返却
                */
                // メッセージIDを生成
                $msg_id = $this->issueMsgId();
                // レベルアップメッセージ
                $this->setMessage($this->getNickName().'は'.$move->getName().'を覚えたい');
                $this->setMessage('しかし技を4つ覚えるので精一杯だ');
                $this->setMessage($move->getName().'の代わりに他の技を忘れさせますか?', $msg_id);
                // レスポンスデータをセット
                $this->setResponse([
                    'toggle' => 'modal',
                    'target' => '#'.$msg_id.'-modal',
                    'move' => $move_class
                ], $msg_id);
                // モーダル用のレスポンスをセット
                $this->setModal([
                    'id' => $msg_id,
                    'modal' => 'selectmove',
                    'move' => array_merge($this->getMove(), [[
                        'class' => $move,
                        'remaining' => $move->getPp(),
                        'correction' => 0,
                    ]]),
                ]);
                // 諦めメッセージを事前に用意しておく
                $this->setMessage($this->getNickName().'は'.$move->getName().'を覚えるのを諦めた');
            }
        }
    }
}

 

現在習得している技が4つ未満であれば、今まで通りの処理です。もし4つ以上だった場合は強制的に書き換えるのではなく、確認メッセージを返却するようにしています。

モーダルのパラメータ(move)には、現在覚えている技と、新しく覚えようとしている技を配列で返却しています。この時点では覚えている技は変わっておらず、あくまで新しい技はレスポンス(モーダル)に追加しただけになります。

 

また、諦めメッセージについてですが、こちらは技習得段階で用意しておきましょう。諦めるという選択をした際にJavaScriptで追加するよりも処理が簡単で、もし諦めなかった場合はその時点でフォームの送信が発生するためメッセージはそのまま破棄することができるからです。

 

次に、返却されたモーダルの作成です。

 

忘れさせる技の選択モーダル(/Resources/Partials/Battle/Modals/selectmove.php
<!-- Modal -->
<div class="modal fade" id="<?=$modal['id']?>-modal" tabindex="-1" role="dialog" aria-labelledby="<?=$modal['id']?>-modal-title" aria-hidden="true" data-keyboard="false" data-backdrop="static">
    <div class="modal-dialog modal-dialog-centered" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="<?=$modal['id']?>-title">忘れさせる技を選ぶ</h5>
            </div>
            <div class="modal-body">
                <?php # 覚えている技 ?>
                <table class="table table-bordered table-sm table-hover">
                    <thead class="thead-light">
                        <tr>
                            <th scope="col">覚えている技</th>
                            <th scope="col">タイプ</th>
                            <th scope="col">PP</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach($modal['move'] as $key => $move): ?>
                            <tr class="move-detail-link forget-selectmove <?php if($key === 4) echo 'active new-move'; ?>"
                                data-target="#<?=$modal['id']?>_<?=get_class($move['class'])?>-content"
                                data-name="<?=$move['class']->getName()?>"
                                data-num="<?=$key?>">
                                <th scope="row" class="w-50"><?=$move['class']->getName()?></th>
                                <td><?=$move['class']->getType()->getName()?></td>
                                <td><?=$move['remaining']?>/<?=$move['class']->getPp($move['correction'])?></td>
                            </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
                <?php # 技説明 ?>
                <div class="overflow-auto p-3 border" style="height:160px;">
                    <?php foreach($modal['move'] as $key => $move): ?>
                        <div class="move-detail-content <?php if($key === 4) echo 'active'; ?>" id="<?=$modal['id']?>_<?=get_class($move['class'])?>-content">
                            <h6><?=$move['class']->getName()?></h6>
                            <hr>
                            <p><?=$move['class']->getDescription()?></p>
                        </div>
                    <?php endforeach; ?>
                </div>
            </div>
            <div class="modal-footer">
                <button type="button"
                class="btn btn-danger btn-sm"
                id="btn-forget-move"
                data-msg_id="<?=$modal['id']?>"
                style="display:none;">
                <span class="move-name"></span>を忘れる</button>
                <button type="button" class="btn btn-secondary btn-sm action-message-box" id="btn-abandon-move" data-dismiss="modal">
                    <?=$modal['move'][4]['class']->getName()?>を諦める
                </button>
            </div>
        </div>
    </div>
</div>

 

ホーム画面用の技詳細と同じテーブルを使用しました。忘れさせる手順は、テーブルから技を選択して、決定ボタンを押すという流れです。技を忘れさせる場合は別のボタンを用意し、モーダルを閉じるだけの処理を行います。

もし「忘れさせる」ボタンを押せば、そこで必要データをPOSTして処理を行います。諦める場合は、そのままモーダルを閉じることで、事前に用意した諦めメッセージが表示されます。

 

それでは、技習得時の流れを確認してみましょう。

 

  

問題なくモーダルが表示されました。技選択を諦める場合はモーダルをそのまま閉じて処理を進行させているだけなので、レベルアップ後のステータス表示処理とさほど変わりませんね。

これで、技選択の分岐1が完成です。

 

まとめ

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

今回のPHPポケモンは「技を忘れさせる(諦める)」の処理作成についてご紹介しました。

いろんな処理を作成しましたが、処理途中で分岐が入るのがWEBプログラミング(PHP)にとってはそこそこ厄介だということが、後編を見ればわかるはずです。ですが、実現できないわけではありません。

それでは、後編を乞うご期待ください。

 

注目の記事

PHPポケモン「引数メソッド実行編」デモ有り(御三家の追加)11
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「引数メソッド実行編」デモ有り(御三家の追加)11

  前回のPHPポケモンではメソッドを外部から実行できるようにコントローラー(インターフェース)を作成しました。なので、今回は引数が必要となるメソッドの実装に挑戦してみましょう。 最後にはデモページを準備しているので、気になった人はぜひ遊んでみてください。   第1回はコチラ     ...

【Youも明日からデザイナー】デザインセンスを磨くコツ3つ
デザイン
YouTube,サムネイル,バナー
【Youも明日からデザイナー】デザインセンスを磨くコツ3つ

  デザイナーにセンスは必要か?   この問いに、私は必ず「必要ない」と答えます。確かに、センスを磨くことは大切ですが、それがあたかも才能のように表現するのは間違っていると思っているからです。 デザインは誰にでもできます。そしてオリジナリティは各自が必ず持っています。だからこそ、なりたい...

未経験からWeb系エンジニアとしてフリーランスになる現実的な方法教えます【軌道に乗れば起業も可能】
フリーランス
エンジニア,フリーランス,プログラミング学習,独立,起業
未経験からWeb系エンジニアとしてフリーランスになる現実的な方法教えます【軌道に乗れば起業も可能】

  セカンドキャリアとしてプログラミングやデザインを学習したい   そう考えてスクールを受講したり、独学で始める人が増えていますが、そのほとんどが実らずに挫折してしまいます。 ですが、学習方法と経験の積み方や職の選び方さえ間違えなければ、技術を身につけてフリーランスとして活動することも難しく...

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

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

バトル状態のクラス化編 PHPポケモン 67
プログラミング
PHP,PHPポケモン,ポケモン
バトル状態のクラス化編 PHPポケモン 67

バトルの状態 PHPポケモンでも様々な技を再現してきましたが、まだまだ未実装のものはたくさんあります。そのほとんどがイレギュラー処理の必要なものだったりします。 それらをしっかりと解決していくためにも、今回は「バトル状態」をひとまとめに管理できるようにシステムの見直しを行います。   ひとまとめに...

WordPressをローカルと本番環境で同じ状態にするために理解しておきたい3つのポイントを徹底解説
プログラミング
PHP,phpMyAdmin,WordPress
WordPressをローカルと本番環境で同じ状態にするために理解しておきたい3つのポイントを徹底解説

  WordPressで作ったサイトは通常のサイトと違い、DBが絡んでくるためローカル環境と本番環境を同一の状態で稼働させるには設定や更新されるディレクトリの知識が必要になります。 今回は、WordPressを使ったサイトを作成している人や、開発に挑戦しようとしている人に向けて、ローカルで作ったWordPressのサイ...

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

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

【Wi-Fi6とは】スマホやPCの買い替えは必要?騙されないための基礎知識
ネットワーク
5G,IEEE 802.11ax,Wi-Fi
【Wi-Fi6とは】スマホやPCの買い替えは必要?騙されないための基礎知識

  本格的に5G普及への取り組みが始まり、Wi-Fi6といった新世代の規格が出たことによって、超情報化社会へ加速しました。 ですが、こういったナンバリングが一般化することによって、わからずに高性能な機器を斡旋されて無駄な購入をさせられたり、わからないことを理由に詐欺的営業を仕掛けてくる悪意ある人...

カテゴリ

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