プログラミング

ひとのものをとったらどろぼう!編 PHPポケモン 99

PHP PHPポケモン ポケモン
ひとのものをとったらどろぼう!編 PHPポケモン 99

ひとの ものを とったら どろぼう!

ポケモンの中でも有名なセリフの1つです。モンスターボールを投げることでポケモンを捕まえることができますが、既に別トレーナーが所有しているポケモンを捕まえることはできません。

初代から、トレーナー戦でモンスターボールを投げると「ひとの ものを とったら どろぼう!」というセリフが表示されるので、PHPポケモンでも同じように処理していきましょう。

 

捕獲処理への制御

そもそも、トレーナー戦自体でモンスターボールを使えなくしてしまうという方法もありますが、それではノードを直接変更してしまうことで処理が動いてしまい、トレーナーが繰り出してきたポケモンを捕まえることが出来てしまいます。なので、サービスそのものに判定を追加し、トレーナー戦であれば捕獲処理をスキップさせるように制御していきましょう。

 

アイテム使用サービス(/App/Services/Battle/ItemService.php
/**
* どうぐの使用
*/
class ItemService extends Service
{
 
--省略
 
    /**
    * どろぼうフラグ
    * @var boolean
    */
    protected $thief_flg = false;
 
    /**
    * @return void
    */
    public function execute()
    {
        // アイテムの確認
        if(!$this->validation()){
            response()->setMessage('指定されたアイテムは使用できません');
            return;
        }
        // アイテムの使用
        $this->use();
        if($this->capture_flg){
            // 捕獲成功
            // バトル終了判定用メッセージの格納
            response()->setEmptyMessage('battle-end');
        }else{
            // 捕獲失敗・通常アイテムの使用
            if($this->thief_flg){
                // トレーナー戦でのボールの使用
                response()->setMessage('人のものを取ったら、どろぼう!');
            }else{
                //相手のターン処理
                $this->enemyTurn();
            }
        }
    }

 

新たにthief_flgを追加し、サービス内で判定ができるようにしました。こちらを、ボール判定用のトレイトに入った際にチェック、フラグを有効化させます。

 

ボール使用時のトレイト(/Traits/Service/Item/ServiceItemCaptureTrait.php
// ボール使用時のトレイト
trait ServiceItemCaptureTrait
{
 
--省略
 
    /**
    * 捕獲判定
    * @param ball:string
    * @return boolean
    */
    protected function useItemCapture(string $ball): bool
    {
        // トレーナー戦の分岐
        if(battle_state()->isMode('trainer')){
            $this->thief_flg = true;
            return false;
        }

 

サービス内で全て処理してしまっても良かったのですが、別サービスからこのトレイトを使った際に通過してしまうことも懸念して、判定直前で処理を返却する構成にしました。

 

これで、トレーナー戦でモンスターボールを投げても捕獲処理へ入ることを防ぐことができましたね。

ゲームではボールを投げて弾かれるという演出があるので、ある程度システム部分が整えばこういった細かな部分も再現予定です。

  

賞金システム

PHPポケモンでは現在お金を稼ぐ手段が「ネコにこばん」しかありません。通常のポケモンでもメインとなる収益源は「トレーナー戦」なので、こちらも実装していきましょう。

 

賞金をもらった

トレーナー情報で賞金額は設定できるようにしているため、バトルに勝利すれば設定した金額を受け取れるように、勝負判定に処理を追加しましょう。

 

バトルコントローラー用トレイト(/App/Traits/Controller/BattleControllerTrait.php
// judgmentWinメソッド内
// 勝利演出
response()->setMessage(trainer()->getPrefixName().'との勝負に勝った', $msg_id);
response()->setResponse([
    'action' => 'show-trainer',
    'target' => 'enemy',
], $msg_id);
// 勝利メッセージ
response()->setMessage(trainer()->getLine('lose'));
// 賞金
$money = trainer()->getMoney();
response()->setMessage(player()->getName().'は、賞金として'.$money.'円を受け取った!');
player()->addMoney($money);
// 勝利時の最終処理
$this->judgmentWinLast();

 

勝利メッセージの後に賞金を取得、受け取った金額のメッセージを表示させました。おこづかいを増やすためのメソッドは、プレイヤークラスに作成したaddMoneyを使用しています。

 

降参

負け判定の際にはお小遣いが半分になります。また、RPGのフィールド進行が無い関係上、戦闘から離脱するための「降参」という機能を実装しておいても不都合がないので、こちらも合わせて実装します。

 

バトルコントローラー(/App/Controllers/Battle/BattleController.php
//branchメソッド内
/******************************************
* 降参(トレーナー戦のみ)
*/
case 'surrender':
if(battle_state()->isMode('trainer')){
    // 持ち金を半分失う
    player()->loseMoney();
    // バトル終了
    $this->battleEnd();
}
break;

 

トレーナー戦のみに限定したsurrenderというアクションを用意しました。おこづかいを半額失うという処理を、毎回書くのは面倒なので、プレイヤークラスにloseMoneyというメソッドを作成し、半額処理を行なっています。

 

プレイヤーおこづかい関係トレイト(/App/Traits/Class/Player/ClassPlayerMoneyTrait.php
/**
* バトル敗北時のお小遣い消費
* @return void
*/
public function loseMoney(): void
{
    // 半額を失う(切り捨て)
    $this->money = (int)($this->money / 2);
}

 

失った金額を表示させたい場合は、返り値として割った金額を返却しておくようにすると便利です。現状は使用予定がないので、返り値無しのメソッドとしました。

 

最後に、敗北判定時にも同じメソッドを追記しておきましょう。

 

バトルコントローラー用トレイト(/App/Traits/Controller/BattleControllerTrait.php
/**
* バトル結果(負け)
* @return void
*/
private function judgmentLose()
{
    // トレーナー戦
    if(battle_state()->isMode('trainer')){
        response()->setMessage(trainer()->getLine('win'));
    }
    // お小遣いの半額を失う
    player()->loseMoney();
    // 全滅
    response()->setMessage(player()->getName().'は、目の前が真っ暗になった...');
    // バトル終了判定用メッセージの格納
    response()->setEmptyMessage('battle-end');
}

 

おこづかいを失うという処理は、野生ポケモンとのバトルでも同じなので、分岐後の共通処理として行なっています。

では、実際にトレーナー戦の動きを見てみましょう。

 

勝利時には賞金が貰え、敗北時には半額が失われましたね。これでバトルシステムの大枠が完成です。

 

まとめ

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

今回のPHPポケモンでは「トレーナー戦でのモンスターボール使用不可判定」と「賞金システム」の実装方法をご紹介しました。

ゲームづくりに興味がある方、プログラミングに興味がある方は、ぜひ参考にしてみてくださいね。

 

注目の記事

PHPポケモン「野生ポケモン遭遇編」18
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「野生ポケモン遭遇編」18

  PHPポケモンが第18回にしていよいよバトルの第一歩、野生ポケモンとの遭遇編に突入です。 新しいコントローラーの作成と、バトル画面の作成、そしてポケモンデータの受け渡しなどを中心にご紹介します。   バトル画面の実装  ポケモンのゲームでも、野生ポケモンが現れるとバトル画面へ移管し...

画像に文字スペースを確保する簡単テクニックを3つ教えます【サムネイル作りで大活躍】
デザイン
Illustrator,Photoshop,サムネイル,バナー
画像に文字スペースを確保する簡単テクニックを3つ教えます【サムネイル作りで大活躍】

  サムネイル用の画像に文字スペースが無くて困っている・・・   せっかくいい写真が撮れたり、フリー画像が見つかったとしても、文字を配置するスペースが確保できずにせっかくのオブジェクトに重ねてしまったり、断念して別の画像を使用するようなケースはかなり多いです。 ですが、せっかく良い画像が見つ...

自称デザイナーがおしゃれ名刺を作成してみた!2度見したくなる名刺とは?
デザイン
Adobe,Illustrator
自称デザイナーがおしゃれ名刺を作成してみた!2度見したくなる名刺とは?

  自称デザイナーらしく、オリジナルデザインの名刺を作成しました。 今回作った名刺はコチラです。   会社名や住所、名前の部分は仮で当てはめています。公開情報なのでそのままでも良いんですが一応です。   今回は「自称デザイナーがおしゃれ名刺を作成してみた!2度見したくなる名刺とは?」につい...

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

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

PHPポケモン「行動順判定+敵ポケモン攻撃編」25
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「行動順判定+敵ポケモン攻撃編」25

行動順の判定 ポケモンの行動順は以下の通りです。 技の優先度 すばやさの実数値(補正有り) 同速の場合は50%の乱数   この順番で比較を行い、先行後攻を決めます。ただし、これは両者ともに攻撃を選択した場合のみです。アイテムの使用や交代は技よりも優先されますし(※一部技を除く)、にげる...

フレンドリィショップ編 開店準備 PHPポケモン 75
プログラミング
PHP,PHPポケモン,ポケモン
フレンドリィショップ編 開店準備 PHPポケモン 75

アイテム(どうぐ) PHPポケモンもバトル機能が一通り揃ってきたので、新機能として「アイテム」の実装に取り掛かります。 アイテムにも色々ありますが、技やポケモンのクラス同様に、初代で登場したアイテムから順番に取り揃えていきましょう。   キズぐすりの実装 ポケモンのどうぐ、一番手は「キズぐすり」...

アウトプットのための3つの習慣【3対7を成立させよう】
雑記
アウトプットのための3つの習慣【3対7を成立させよう】

  インプットとアウトプットの比率は3対7がベストだと言われています。 しかし、簡単にできるインプットに比べて、アウトプットは習慣化させておくことが大切です。それができていない人の多くが、膨大に本を読んだり学習に取り組んでも身につかず、趣味のレベルで終わってしまうのです。   今回は、そんな...

忘れさせる技選択 後編(新しい技を習得) PHPポケモン 56
プログラミング
PHP,PHPポケモン,ポケモン
忘れさせる技選択 後編(新しい技を習得) PHPポケモン 56

新しい技を習得 前編に続き、技習得時の処理分岐を作成していきましょう。今回は「新しい技を習得する」です。 前回は覚えようとしている技を諦めるだけだったので、ポケモンのオブジェクトを書き換える必要がありませんでしたね。ですが、新しく覚えようとしている技を既に覚えている技と置き換える場合は、ポケモ...

カテゴリ

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