質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

1回答

723閲覧

RPG戦闘シーン/IF文による前提関数終了条件での別関数呼び出し(PHP)

退会済みユーザー

退会済みユーザー

総合スコア0

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2020/08/09 11:38

編集2020/08/09 12:47

よろしくお願いいたします。

OS: Mac 10.15.4

簡単なRPGの戦闘シーンを再現したいと思っております。主人公と対象の敵(pinoko)との間で、戦闘コマンド選択後の表示に関して、質問させていただきます。

HTML,CSSのすべての内容等含めるとかなりの量となってしまいますので、一部割愛し、仕組みの箇所だけご質問させていただければと思います。

敵側のpinoko.phpファイルはテスト的にクラスを作成し動作確認したところ、問題なく動いておりました。

現在は、battle.phpの画面から攻撃用の"echo"コマンド(紛らわしいですが、"攻撃する"意味合いでformタグの表示としております)
を選択すると、formより同一のファイルにname="attack"post形式で送り、同ファイルで$_REQUESTより受け取った"attack"を元に攻撃用のランダム関数を呼び出す仕組みとなっております。

攻撃用コマンドをクリックするたびに動作は問題なく動いているのですが、この後、敵キャラとして実体化したpinokoの攻撃ターンに移り主人公の攻撃後に呼び出したいのですが、どのようにすれば良いのか見当がつきません。

主人公の攻撃用関数をreturnさせ、pinoko攻撃用の関数から呼び出せばいけるのかと思いましたが、returnされた時点でphpが終了してしまうためうまくいきませんでした。

印象としてはIF文と混ぜて

if(主人公攻撃関数が終わったら){
echo $pinoko->attack1();
}

のような形式にできれば良いのですが、関数が終わったら条件で関数を呼び出すことなどできるのでしょうか。

単に連続的に関数を呼び出すだけですと、攻撃表示されるdiv内で主人公の攻撃メッセージとpinokoの攻撃メッセージが連結されてしまうだけなので、一度主人公の攻撃を終了し、pinokoの攻撃を文字として出力させたいのですが苦しんでおります。

html

1<body> 2 3 <div class="container"> 4 5 <div class="comment"> 6 <h1><font face="美咲ゴシック"> 7 <?php include_once("phpfile") ?> 8 </h1> 9 </div> 10 11 <div class="battle"> 12 <img src="pinoko.png" alt=""> 13 </div> 14 15 <div class="d-flex org-test"> 16 <div class="command"> 17 <ul> 18 <li><form action="battle.php" method="post"> 19 <input type="submit" value="echo" name="attack" ></li> 20 <li>スキル</li> 21 <li>どうぐ</li> 22 <li>にげる</li> 23 </ul> 24 </div> 25 26 <div class="party"> 27 <div class="main-char"> 28 <ul> 29 <li>主人公</li> 30 <li>HP:100</li> 31 <li>MP:100</li> 32 <li>職業:平民</li> 33 </ul> 34 </div> 35 </div> 36 37 </div> 38 39 </div> 40 41</body>

phpfile

1 <?php 2 include_once("pinoko.php"); 3 4 function attack() 5 { 6 $rand = rand(10, 50); 7 $rand = strval($rand); 8 $rand = mb_convert_kana($rand, "N"); 9 return "ひろしは ".$rand ." のダメージを与えた!!"; 10 } 11 12 if(isset($_REQUEST["attack"])){ 13 echo attack(); 14 } else { 15 echo "エラー発生"; 16 } 17 18 19 ?>

pinokophp

1<?php 2namespace BOUKEN\pinoko; 3use BOUKEN\pinoko as firstEnemy; 4 5class Pinoko{ 6 public $HP = 3000; 7 public $MP = 500; 8 9 public function attack1() { 10 return "50のダメージ!!"; 11 } 12 13 public function attack2() { 14 return "100のダメージ!!"; 15 } 16 17 public function attack3() { 18 return "150のダメージ!!"; 19 } 20 21 public function attack4() { 22 return "200のダメージ!!"; 23 } 24 25} 26 27$pinoko = new Pinoko(); 28 29?> 30

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi_takatsuk

2020/08/09 12:34

まず、質問タグの、 RPGは、 ロールプレイングゲームのRPGではないので、外しておきましょう。
退会済みユーザー

退会済みユーザー

2020/08/09 17:27

修正いたしました。ご指摘ありがとうございます
guest

回答1

0

まず、HTTP通信はステートレス(アクセスごとに状態がリセットされる)であるため、何も対策をしなければアクセスやフォーム送信するたびに状態がリセットされることを把握する必要があります。

これを解決するためには

  • フォームに全ての情報を詰め込んで、過去の情報を含めて毎回全部送信させる
  • セッションを使用して、以前に送信した情報をサーバサイドで管理する
  • cookieを使用して、以前送信した情報をクライアントサイドに保管しつつ、情報を毎回全部送らせる

のいずれかの方法をとる必要があります。

この中ではセッションが扱いやすいので、まずはセッションで実装してみることをお勧めします。

PHP セッション 仕組みあたりでざっと調べてみたあとに、
基本的な使用法を実際に試してみてください。

その後、例えば

  • アクセスするごとに単にHPが減っていき、0になったら死亡画面に遷移する
  • アクセスするたびにフォームが順番に変化する

等の簡単なセッションでの機能実装を行っていくと、今回実装しようとしている事のイメージを把握できると思います。

投稿2020/08/09 14:32

tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/08/09 16:02

ご回答ありがとうございます。 お答えいただきました仕組みはHPやMP情報などを引き継ぎながら戦闘を進めていくための事柄でしたでしょうか。 なるほどです。セッションIDを付与することで、前情報を引き継ぎながら(HPやMPの増減情報)展開できるということでしょうかね。 敵のターンを含めた実行処理というのはPHPでは難しそうでしたでしょうか。 たたかうコマンドをクリック→主人公の攻撃→敵の攻撃→1ターン終了 までの流れをPHPで実行したかったのですが、性質上、リクエストを2回投げないと実行できない気がしております。 一応考えた方法ですと 1.header関数リダイレクト処理にて関数呼び出しを2つに分けて元のファイルに再リダイレクト 2.cURL_multi関数なるものを利用する... 1の方法だと、header()関数の性質でphp開始タグの直後に定義する必要があるようなので、IF文内でpostを受け取った時の条件下での実行が難しそうでした。 そうでない場合は、条件から外れるためリダイレクトがループしてしまいます。 2の場合は複数のURL情報を結合して出力したりする事はできそうなのですが、2つのファイル(主人公と敵に分けた場合)をmultiで統合して処理する動きなどは再現できるのか不明で、もしかしたら全然関係なさそうでした。 何かアドバイスなどいただけますと幸いに存じます。 セッションの件ありがとうございました。勉強になりました。
tanat

2020/08/09 17:13 編集

> お答えいただきました仕組みはHPやMP情報などを引き継ぎながら戦闘を進めていくための事柄でしたでしょうか。 「現在の状態」全ての情報の引継ぎについてです。 HPやMPだけでは無く、現在どのページを表示するべきか等、GET/POSTに含まれていない情報の全てです。 > までの流れをPHPで実行したかったのですが、性質上、リクエストを2回投げないと実行できない気がしております。 PHPだけで実装する場合、POSTする数だけリクエストを送信する必要があります。 JavaScriptを併用することでこれを回避できますが、PHPだけで実装できない状態でJavaScriptを併用することは無謀です。 > 一応考えた方法ですと 基本的な事が分からない状態で無理やり何とかしようとしてもどうにもなりません。 まずは何回でもリクエストを投げて一つ一つの画面移動を制御出来るようにしてください。
退会済みユーザー

退会済みユーザー

2020/08/09 17:18

回答ありがとうございます。 了解です。 まずはセッションの理解と実際に動かしてみて念入りに確認してみたいと思います。 そのあとで希望の動きが可能か確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問