• 締切済み

PHPでの値の受け渡し方法を教えてください!

PHP新参者です。 現在、PHPでRPG風の簡易戦闘システムを作成しているのですが、永久ループに陥ってしまい、悩んでいます。 条件として、自分も敵も1体ずつ、HPはお互いに1000、相手の行動パターンは現在2パターン(攻撃or必殺)、自分の行動パターンは攻撃、特技、道具、逃げる(今はまだ攻撃と逃げるの2パターンしか作成していません。)となっています。 一応、仕様としては 名前の入力ページで主人公と敵の名前を設定、その後、コマンドを選択して自分→相手→自分のターン形式で行動していく、というシステムになっており、主人公が逃げる、もしくはどちらかのHPが0になった時点で終了し、タイトルに戻る、という予定です。(タイトルに戻る処理などはまだ未記入です) 名前の変数については、更新時も受け渡すことはできたのですが、記述ミスのせいで、HPの変数の受け渡しやターン毎の行動がリセットされてしまう(ボタンを押す度に前のターンの行動履歴が消滅してしまう)問題といった問題点が残っている状態です。 正直、どこを直せば正確に動作するのか、1週間ほど悩んでいます。 御教授をお願いします。質問下手ですみません。 <?php $command = 0; $myna = trim($_GET[ 'myna' ]); $enena = trim($_GET[ 'enena' ]); echo"<form method = \"GET\" action = \"dice.php\" name =\"form1\">"; if(isset($_POST["sub1"])){ $kbn = htmlspecialchars($_POST["sub1"],ENT_QUOTES,"UTF-8"); switch($kbn){ case "攻撃": $command=1; $enena=trim($_GET['enena']); $myna=trim($_GET['myna']); $myHP=trim($_GET['myHP']); $eneHP=trim($_GET['eneHP']); $turn=trim($_GET['turn']); break; case "特技": $command=2;$enena=trim($_GET['enena']); $myna=trim($_GET['myna']); $myHP=trim($_GET['myHP']); $eneHP=trim($_GET['eneHP']); $turn=trim($_GET['turn']); break; case "道具": $command=3;$enena=trim($_GET['enena']); $myna=trim($_GET['myna']); $myHP=trim($_GET['myHP']); $eneHP=trim($_GET['eneHP']); $turn=trim($_GET['turn']); break; case "逃げる": $command = 4; $enena=trim($_GET['enena']); $myna=trim($_GET['myna']); $myHP=trim($_GET['myHP']); $eneHP=trim($_GET['eneHP']); $turn=trim($_GET['turn']); break; default: echo"エラー"; exit; } } echo"</form>"; echo"<form method=\"POST\" action=\"\">"; echo "<input type=\"submit\" value=\"攻撃\" name=\"sub1\"/>"; echo "<input type=\"submit\" value=\"特技\" name=\"sub1\"/>"; echo "<input type=\"submit\" value=\"道具\" name=\"sub1\"/>"; echo "<input type=\"submit\" value=\"逃げる\" name=\"sub1\"/>"; echo "</form>"; echo "<br />"; echo "<br />"; $myHP = 1000; $turn = 1; echo "第"; echo"$turn"; echo"ターン"; echo "<br />"; echo "<br />"; for($eneHP=1000;$command!=0;$turn++){ if($command == 1){ $puttern = rand(1, 4); $dice1 = rand(1, 100); $dice2 = rand(1, 100); $dice3 = rand(1, 100); $kaishin = rand(1, 4); $damage = ($dice1 + $dice2 + $dice3)/3; if($kaishin == 4) $damage = $damage + 100; $eneHP = $eneHP-floor($damage); echo "$myna の攻撃!"; if($kaishin == 4) echo"会心の一撃!"; echo "<br />"; echo floor($damage); echo"のダメージを与えた!"; } if($command == 4){ echo "$myna は逃げた!"; break; break; break; break; } echo"<br />"; if($eneHP <= 0){ echo"$enena を倒した!"; break; break; }else echo"$enena HP $eneHP/1000"; echo"<br />"; echo"<br />"; if($puttern == 1 | $puttern == 2 | $puttern == 3){ $dice1 = rand(1, 100); $dice2 = rand(1, 100); $dice3 = rand(1, 100); $kaishin = rand(1, 4); $gotdamage = ($dice1 + $dice2 + $dice3)/3; if($kaishin == 4) $gotdamage = $gotdamage + 100; $myHP = $myHP-floor($gotdamage); echo "$enena の攻撃!"; if($kaishin == 4) echo"痛恨の一撃!"; echo"<br />"; echo floor($gotdamage); echo"のダメージを受けた!"; }else if($puttern == 4){ $gotdamage = $myHP/2; $myHP = $myHP-floor($gotdamage); echo "$enena の必殺技!"; echo "<br />"; echo "$myna の体力は半分まで削られた!"; } echo"<br />"; if($myHP <= 0){ echo"$myna は死んでしまった…!"; break; break; }else{ echo"$myna HP $myHP/1000"; } $command = 0; } echo"<br />"; echo"<br />"; ?>

  • PHP
  • 回答数1
  • ありがとう数0

みんなの回答

回答No.1

セッション使ったらどうですか。

関連するQ&A

  • PHPで画像を表示するプログラムについて

    実行するとランダムで取得した値を利用して、3パターンくらいの画像を切り替えて表示するPHPファイル を作成したいです! 以下のように書いてみたのですが、如何せん初心者なものでできない原因すらわかりません! 間違っているところを是非指摘していただきたいです。 宜しくお願い致します <?php $rand = rand(1,10); switch($rand){ case 1: echo("1"); break; case 2: echo("2"); break; case 3: echo("3"); break; case 4: echo("4"); break; case 5: echo("5"); break; case 6: echo("6"); break; case 7: echo("7"); break; case 8: echo("8"); break; case 9: echo("9"); break; case 10: echo("10"); break; if ($rand <= 3){ echo"<img src='a.jpg'>"; } elseif ($rand 4< || $rand >6 ) { echo"<img src='b.jpg'>"; elseif ($rand 7< || $rand >10 ) { echo"<img src='c.jpg'>"; } } ?>

    • 締切済み
    • PHP
  • RPGでのダメージの算出方法について

    詳しい方がいそうなのでここでお願いします。 RPGゲームでダメージを計算する時に、そのまんま(味方の攻撃力-敵の防御力)じゃなくて ある程度ランダムにダメージに幅を持たせたいのですが、 その幅のよく使われている計算方法などはあるのでしょうか? 例: ダメージ = ベースダメージ(味方の攻撃力-敵の防御力) +-ある程度の幅 自分なりに考えてみたのですが、どうもしっくりこないんです。 たとえばダメージが1000ほどある場合に、この条件式をだらだら書いていくのは 違うと思いますし、何か基準となるアルゴリズムなどはあるのでしょうか? int haba(int base_damage) { int haba = 0; if(2 <= base_damage && base_damage < 10) haba = rand((base_damage/2+1)); else if(10 <= base_damage && base_damage < 20) haba = rand((base_damage/3)); else if(20 <= base_damage && base_damage < 50) haba = rand((base_damage/4)); else if(50 <= base_damage && base_damage < 100) haba = rand((base_damage/5)); else if(100 <= base_damage) haba = rand((base_damage/6)); if(rand(2) == 0) haba *= -1; return haba; } damage = (base_damage+haba(base_damage));

  • htmlとphpのデータ受け渡し???

    いつもお世話になり誠にありがとうございます。 標記の件。 まだ、ボク自身、解っていないようです。 htmlとphpのソースコードを提示します。 どうすればデータの受け渡しができるか? 添削してくださらないでしょうか? html <!--入力画面--> <form action = "./Blog.php" method = "get"> <label class="label" for="name">お名前(ニックネーム)</label> <center><input id="name" type="text" name="name"></center> <label class="label" for="e-mail">メール</label> <input id="e-mail" type="e-mail" name="e-mail"> <label class="label" for="category">カテゴリー</label> <input id="category" type="category" name="categoryl"> <label class="label" for="message">本文</label> <textarea name="area1" style="color:rgb(8, 8, 8); font-size:100%;" cols="50" rows="30"></textarea><br> <input type="submit" name="confiem" value="確認"> </form> CSS <meta charset="utf-8"> <?php session_start(); $mode = 'input'; if( isset($_POST['back']) && $_POST['back'] ){ //何もしない } else if( isset($_POST['confirm']) && $_POST['confirm'] ){ $_SESSION['name'] = $_POST['name']; $_SESSION['e-mail'] = $_POST['e-mail']; $_SESSION['category']= $_POST['category']; $_SESSION['message'] = $_POST['message']; $mode = 'confirm'; } else if( isset($_POST['send']) && $_POST['send'] ){ $mode = 'send'; } else { $_SESSION['name'] =""; $_SESSION['e-mail'] =""; $_SESSION['category']=""; $_SESSION['message'] =""; } ?> <!--確認画面--> <?php if( $mode == 'input' ){ ?> お名前(ニックネーム)<?php echo $_POST['name'] ?><br> Eメール<?php echo $_POST['e-mail'] ?><br> カテゴリー<?php echo $_POST['category'] ?><br> 本文<br> <?php echo nl2br($_POST['message']) ?><br> <input type="submit" name="back" value="戻る" /> <input type="submit" name="send" value="送信" /> <?php } else { ?> <!--完了画面--> <?php } ?> 上記の通りです。 全然ダメだと思います。 添削のほど、宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • PHP 変数 aタグで囲いたい

    失礼します。echo の中の変数をaタグで囲いたいのですがやり方がわかりません。 よろしくお願いします。 foreach($files as $file_path => $file_info) { if (!$file_info->isFile()) { continue; } echo 'file path : ' .$file_path ."</br>"; echo 'file size : '. $file_info->getSize() ."</br>"; echo 'contents : '. file_get_contents($file_path) ."</br>"; }

    • ベストアンサー
    • PHP
  • PHPがおかしい

    $GET['type']が"login"でも"tutorial_hsp"と同じ挙動をしてしまいます。 部分のスクリプトはこんな感じです。 if(!isset($_GET['type'])){ echo "<h2>14ちゃんねるデベロッパーメニュー</h2>"; echo "<p><a href=\"menu.php?type=tutorial_hsp\">14ちゃんねるの扱い方<a href=\"https://hsp.tv\">(HSP)</a></a></p>"; echo "<p><a href=\"https://ux.getuploader.com/14channel/\">作ったツールのアップロード(別サイトに飛びます)</a></p>"; echo "<p><a href=\"../program\">作ったツールの宣伝</a></p>"; }else{ if($_GET['type'] = "tutorial_hsp"){ echo "<h2>14ちゃんねるの扱い方(HSP)</h2>"; echo "<p>"; echo "まずは、<a href=\"hsp.tv\">HSP</a>をインストールしてください。<br>"; echo "そうしたら、「HSPスクリプトエディタ」を開いて、以下のスクリプトを入力してください。"; echo "</p>"; echo "続きは制作中です..."; }else{ if($_GET['type'] = "login"){ echo "<h2>404 Not Found</h2>"; } } } URL: http://arkmonster.r.ribbon.to/developer/menu.php?type=login

  • PHPの正規表現 メール受信と文字コードについて

    Yahooのメールサーバに接続しメールを取得、メール本文に特定の語句が含まれているか調べたいのですが、うまく行かず悩んでいます。 SJIS文字コードが原因なんでしょうか? かなり長い文章になるので、お暇でしたらご教授下さい。 PHP Version 5.2.5です。 以下のプログラムでの問題点です。 <?php $mb=imap_open("{pop.mail.yahoo.co.jp:110/pop3}INBOX","ID","pass") or die("メールボックスを開けません<br>"); $i=4;//メール番号 //imap_fetchbody、mb_convert_encodingで取得した変数<$body_sjis>と比較する為、メール本文を変数<$mail_honbun>としてファイル内に定義。 $mail_honbun="次のことはを感じで、書きなさい。(すべて)手へんの漢字です。 「正解」はこのあとすぐ。仕上げの湾カールが決まるのは:エッセンシャルダメージケア新発売"; $body=imap_fetchbody($mb,$i,1,FT_PEEK);//本文取得 $body_sjis=mb_convert_encoding($body,"SJIS","auto");//SJISに変換 echo("$body_sjis<br><br><br>"); echo("[mail_honbunの場合]<br>"); if(preg_match("/次の.+書きなさい。/",$mail_honbun,$temp))//OK echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); if(preg_match("/次の.+正解/",$mail_honbun,$temp))//OK echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); if(preg_match("/エッセンシャル/",$mail_honbun,$temp))//OK echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); if(preg_match("/ダメージ/",$mail_honbun,$temp))//NG 何故ダメージはマッチしない? echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); echo("---------------------------------------<br>"); echo("[body_sjisの場合]<br>"); if(preg_match("/次の.+書きなさい。/",$body_sjis,$temp))//OK echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); if(preg_match("/書き.+正解/",$body_sjis,$temp))//NG 。を超えるとマッチしない echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); if(preg_match("/エッセンシャル/",$body_sjis,$temp))//OK エッセンシャルはOK echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); if(preg_match("/ダメージ/",$body_sjis,$temp))//NG ダメージがNG、何故? echo("$temp[0]<br>"); else echo("NOT MATCH<br>"); ?> ## 結果 ######################################################## [mail_honbunの場合] 次のことはを感じで、書きなさい。 次のことはを感じで、書きなさい。(すべて)手へんの漢字です。 「正解 エッセンシャル NOT MATCH --------------------------------------- [body_sjisの場合] 次のことはを感じで、書きなさい。 NOT MATCH エッセンシャル NOT MATCH ################################################################# 問題点<$mail_honbun>の場合 マッチするカタカナと、しないカタカナがある事。(エッセンシャルがマッチして、ダメージがマッチしない事) 問題点<$body_sjis>の場合 。を超えるとマッチしない事。 マッチするカタカナと、しないカタカナがある事。(エッセンシャルがマッチして、ダメージがマッチしない事) 自分で何が問題なのか、何を知らないのかがはっきりしません。 文字コードSJISを使わない方がいいのでしょうか? 参考になる事や、調べたら解決しそうなキーワードがあれば教えて下さい。宜しくお願いします。 ファイル"php.ini"の設定 mbstring.language = Japanese mbstring.internal_encoding = SJIS mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = On mbstring.detect_order = SJIS,EUC-JP,JIS,UTF-8,ASCII

    • ベストアンサー
    • PHP
  • PHPループをカウントダウンできますか?

    <?php $i = 0; while ($i < 10) {   if ($i == 5) {    echo "$i 回で終わります<br>";    break;   }   echo "$i 回目のループ<br>";   $i++; } 【結果】 0 回目のループ 1 回目のループ 2 回目のループ 3 回目のループ 4 回目のループ 5 回で終わります と、0,1,2,3,4,5とループがありますが、 この結果を逆に、 5 回で終わります 4 回目のループ 3 回目のループ 2 回目のループ 1 回目のループ 0 回目のループ とすることは可能でしょうか?? また、もし可能であれば、なんという方法(名称?専門的な呼び方?)となるのでしょうか ご存じの方いらっしゃいましたら、ご回答お願い致します。

    • ベストアンサー
    • PHP
  • PHPで$_GET[’m’]の意味が分かりません。

    市販の本を参考にPHPを勉強しています。 以下の(2箇所あります)$_GET['m']の'm'とは何なのでしょうか。mを得たらリセット・・?でもmを得るってなんなんでしょう?? 突然出てきて困っております。 初歩的な質問かもしれませんが、よろしくお願いします。 <?php //------------------------------------------------------- //宝探しゲーム //----------------------------------------------------- //セッションの開始 session_start(); //タイトルと説明表示 echo "<h1>宝探し</h1>"; echo "<p>マップ上の適当な場所をクリック!</p>"; //ゲーム状態を判定する $stat = $_SESSION['stat']; if (!$stat || $_GET['m'] == "reset"){ //初めての場合、リセット時 init_game(); draw_map(); exit; } //パネルを開くとき if ($_GET['m'] == 'click'){ click_panel(); } // ゲームパラメータの初期化 function init_game() { //ゲームの初期化 $_SESSION['stat'] ='playing'; $_SESSION['turn'] =0; //宝の位置を設定する $_SESSION['takara_x'] = rand(0,8); $_SESSION['takara_y'] = rand(0,8); //マップを初期化 for ($y = 0; $y < 9; $y++){ for ($x = 0; $x < 9; $x++){ $_SESSION["map"][$y][$x] = "*"; } } } //マップの描画(tableタグ表示) function draw_map() { //マップを描画する $map = $_SESSION['map']; $s = "<table border='1'>"; for ($y = 0; $y < 9; $y++) { $s .="<tr>"; for ($x = 0; $x < 9; $x++){ $v = $_SESSION["map"][$y][$x]; $color = "#FFFFFF"; if ($v == "*"){ $v = "<a href ='?m=click&x=$x&y=$y'>*</a>"; $color = "#COCOCO"; } $s .= "<td width='24' align='center' bgcolor='$color'>"; $s .= "$v</td>"; } $S .="</tr>"; } $s .= "</table>"; echo $s; echo "<p>現在、{$_SESSION['turn']}手目です。</p>"; echo "<p><a href='?m=reset'>* RESTART *</a></p>"; } //パネルクリック時の処理 function click_panel() { $x = intval($_GET['x']); $y = intval($_GET['y']); $takara_x = $_SESSION['takara_x']; $takara_y = $_SESSION['takara_y']; $_SESSION['turn']++; //宝を有無を判定 if ($takara_x == $x && $takara_y == $y) { //宝を見つけた判定 $_SESSION["map"][$y][$x] = '<font color="red">@</font>'; echo '<h1>☆大当たり☆</h1>'; draw_map(); init_game(); }else{ //間違えた場合は宝までの距離を表示 $dist = abs($takara_x - $x) + abs($takara_y - $y); $_SESSION['map'][$y][$x] = $dist; echo "<p>残念でした!ヒント・・あと $dist の距離のところ</p>"; draw_map(); exit; } } ?>

    • ベストアンサー
    • PHP
  • csvのデータをphpで表示する方法を教えてください。

    csvの中の特定の文字をphpで検索する方法を教えてください。 僕がためしたのは以下です。 ------------------------------------------------------------- <? $PTR = fopen( "./test.csv", "r" ); if( $PTR == FALSE ){ die( "file open error!!" ); } $Key = $_GET["val"] ; $Size = strlen( $Key ); while($Str = fgets( $PTR, 1024 ) ) { $Code = substr( $Str, 0, $Size ); if( $Code === $Key ) { echo $Str; break; } if( $Key <= $Code ){ break; } } fclose( $PTR ); ?> ------------------------------------------------------------- ですが、これだと頭の文字がマッチしなとヒットしないんです。 たとへばcsvに以下が入ってるとします。 あきら いちご えなり この[あきら]をヒットしたい場合、getで渡す文字を[あきら]や[あ]ならヒットします。これを[き]や[ら]だけの文字検索でも[あきら]と表示されるようにしたいのです。 最悪php自体全部変えてもいいので、誰か教えてください。 条件として携帯電話からも検索できるものに限ります。 ※機種依存はX

    • 締切済み
    • PHP
  • isset関数の動作と入力チェックについて

    issetの動作について疑問に思った事があるので、質問させて下さい。 以下のようなテスト用のphpを作成しました。 issettest.php <?php $a = $_GET["a"]; if(isset($_GET["a"])){ echo "\$GETに[".$_GET["a"]."]が入っています。<br>"; } if(isset($a)){ echo "\$aに[".$a."]が入っています。<br>"; } if(!isset($_GET["a"])){ echo "\$GETは空です。<br>"; } if(!isset($a)){ echo "\$aは空です。<br>"; } ?> ./issettest.php と実行すると、 $GETの値は空です。 $aの値は空です。 ./issettest.php?a=test と実行すると $GETに[test]が入っています。 $aに[test]が入っています。 ./issettest.php?a= と実行すると $GETに[]が入っています。 $aに[]が入っています。 となります。 これがissetの正常な動作なのでしょうか? 例えば、入力フォームを使いGETやPOSTでの値を送信する場合、入力フォームに値が入力されたかどうかを判定するにはissetは使えないのでしょうか? わかりづらい質問で申し訳ありませんが、先輩方の回答お待ちしています。 質問に不備などありましたらご指摘下さい。

    • ベストアンサー
    • PHP

専門家に質問してみよう