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

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

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

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

Q&A

解決済

4回答

885閲覧

phpでじゃんけんゲームを作っています。

osusi

総合スコア15

PHP

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

1グッド

0クリップ

投稿2019/05/29 08:36

<?php $battle = array('ぐー','ちょき','ぱー'); $pc = ''; $my = ''; $result =''; if (isset($_POST['battle']) === TRUE) { $battle = htmlspecialchars($_POST['battle'], ENT_QUOTES, 'UTF-8'); $pc = $battle[array_rand($battle)]; } if ($my === 'ぐー' && $pc ==='ぐー') { $pc = 'ぐー'; $result ='あいこ'; }else if ($my ==='ぐー' && $pc ==='ちょき') { $pc = 'ちょき'; $result ='勝ち'; }else if ($my ==='ぐー' && $pc ==='ぱー') { $pc = 'ぱー'; $result ='負け'; }else if ($my ==='ちょき' && $pc ==='ぐー') { $pc = 'ぐー'; $result ='負け'; }else if ($my ==='ちょき' && $pc ==='ちょき') { $pc = 'ちょき'; $result ='あいこ'; }else if ($my ==='ちょき' && $pc ==='ぱー') { $pc = 'ぱー'; $result ='勝ち'; }else if ($my ==='ぱー' && $pc ==='ぐー') { $pc = 'ぐー'; $result ='勝ち'; }else if ($my ==='ぱー' && $pc ==='ちょき') { $pc = 'ちょき'; $result ='負け'; }else if ($my ==='ぱー' && $pc ==='ぱー') { $pc = 'ぱー'; $result ='あいこ'; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>じゃんけん勝負</title> </head> <body> <h1>じゃんけん勝負</h1> <label>自分: <?php print $my; ?></label> <label>相手: <?php print $pc; ?></label> <label>結果: <?php print $result; ?></label> <form method="post"> <input type="radio" name="battle" value="ぐー" <?php if ($my === 'ぐー') { print 'checked'; } ?>/>ぐー <input type="radio" name="battle" value="ちょき" <?php if ($my === 'ちょき') { print 'checked'; } ?>/>ちょき <input type="radio" name="battle" value="ぱー" <?php if ($my === 'ぱー') { print 'checked'; } ?>/>ぱー <input type="submit" value="勝負"> </form> </body> </html> ```現在、phpでじゃんけんげーむを作っています。 ラジオボタンから選択した値(グー or チョキ or パー)をPOSTで送信し、ユーザと相手(コンピュータ)が選んだ手とじゃんけんの勝敗を表示したいのですが エラーになってしまいます。ifが間違っているのか何なのか自分でわからないです。どこを治したらいいのでしょうか。教えてください。 よろしくお願いします。
syosin_php👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/05/29 08:41

エラーメッセージも貼り付けてください。
azuapricot

2019/05/29 08:58

エラーになってしまいます。「はいそうですか」でおわりです。 エラーになってしまうときはエラー文を貼り付けるのが常識ですよー
guest

回答4

0

こんな感じですかね

PHP

1<?php 2$battle = ["ぐー","ちょき","ぱー"]; 3$my = filter_input(INPUT_POST,'battle',FILTER_VALIDATE_REGEXP,["options"=>["regexp"=>"/^(".implode("|",$battle).")$/"]]); 4$checked["battle"]=array_combine($battle,array_fill(0,count($battle),"")); 5$checked["battle"][$my]=" checked"; 6$pc = ""; 7$result =""; 8 9if(!empty($my)){ 10 $pc =$battle[mt_rand(0,count($battle)-1)]; 11 $result =($my === $pc)?"あいこ":"負け"; 12 if (in_array([$my,$pc],[["ぐー","ちょき"],["ちょき","ぱー"],["ぱー","ぐー"]])) { 13 $result ='勝ち'; 14 } 15} 16?> 17<!DOCTYPE html> 18<html lang="ja"> 19<head> 20 <meta charset="UTF-8"> 21 <title>じゃんけん勝負</title> 22</head> 23<body> 24 <h1>じゃんけん勝負</h1> 25 <label>自分: <?=htmlspecialchars($my);?></label> 26 <label>相手: <?=$pc;?></label> 27 <label>結果: <?=$result;?></label> 28 29 <form method="post"> 30 <label><input type="radio" name="battle" value="ぐー" <?=$checked["battle"]["ぐー"];?>>ぐー</label> 31 <label><input type="radio" name="battle" value="ちょき"<?=$checked["battle"]["ちょき"];?>>ちょき</label> 32 <label><input type="radio" name="battle" value="ぱー" <?=$checked["battle"]["ぱー"];?>>ぱー</label> 33 <input type="submit" value="勝負"> 34 </form> 35</body> 36</html> 37

投稿2019/05/29 09:53

yambejp

総合スコア114839

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

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

退会済みユーザー

退会済みユーザー

2019/05/29 10:05

さすがっすねぇ。セキュリティ対策を盛り込み、htmlの使い方がおかしいところも直してくるところなんぞ。
osusi

2019/05/29 11:40

お忙しい中新しく書いてくれてありがとうございました!!無事解決しました!
guest

0

ベストアンサー

自分なりに書き直してみて、

・全角空白は論外。半角空白に直す。

・POST送信するパラメータがbattleで、ぐーちょきぱーを収めるのもbattleってのはややこしい。
なので、POST送信するパラメータの名前をbattleでなくmyにしてみる。

・if()で判定後に$pcに再度代入するのは無駄。

・コード中になんども「ぐー」「ちょき」「ぱー」「勝ち」「負け」「あいこ」が
何度も出てくるが見づらく感じたので、ユーザー定義定数にしてみる。

してみた。

php

1<?php 2 // 192036.php 3 4 define('GGG', 'ぐー'); 5 define('CCC', 'ちょき'); 6 define('PPP', 'ぱー'); 7 8 define('GAME_WIN', '勝ち'); 9 define('GAME_LOSE', '負け'); 10 define('GAME_DRAW', 'あいこ'); 11 12 $battle = array(GGG, CCC, PPP); 13 $pc = ''; 14 $my = ''; 15 $result =''; 16 17 18 if (isset($_POST['my']) === TRUE) { 19 $my = $_POST['my']; 20 $pc = $battle[array_rand($battle)]; 21 if ($my === GGG && $pc === GGG) { 22 $result = GAME_DRAW; 23 } else if ($my === GGG && $pc === CCC) { 24 $result = GAME_WIN; 25 } else if ($my === GGG && $pc === PPP) { 26 $result = GAME_LOSE; 27 } else if ($my === CCC && $pc === GGG) { 28 $result = GAME_LOSE; 29 } else if ($my === CCC && $pc === CCC) { 30 $result = GAME_DRAW; 31 } else if ($my === CCC && $pc === PPP) { 32 $result = GAME_WIN; 33 } else if ($my === PPP && $pc === GGG) { 34 $result = GAME_WIN; 35 } else if ($my === PPP && $pc === CCC) { 36 $result = GAME_LOSE; 37 } else if ($my === PPP && $pc === PPP) { 38 $result = GAME_DRAW; 39 } 40 } 41?> 42<!DOCTYPE html> 43<html lang="ja"> 44<head> 45 <meta charset="UTF-8"> 46 <title>じゃんけん勝負</title> 47</head> 48<body> 49 <h1>じゃんけん勝負</h1> 50 <label>自分: <?php print $my; ?></label> 51 <label>相手: <?php print $pc; ?></label> 52 <label>結果: <?php print $result; ?></label> 53 54 <form method="post"> 55 <input type="radio" name="my" value="<?=GGG?>"<?php if ($my === GGG) { print ' checked'; } ?>/><?=GGG?> 56 <input type="radio" name="my" value="<?=CCC?>"<?php if ($my === CCC) { print ' checked'; } ?>/><?=CCC?> 57 <input type="radio" name="my" value="<?=PPP?>"<?php if ($my === PPP) { print ' checked'; } ?>/><?=PPP?> 58 <input type="submit" value="勝負"> 59 </form> 60</body> 61</html>

で、判定のif文群も、switch文にすればもうちょっと洗練されるだろうと。

php

1<?php 2 // 192036.php 3 4 define('GGG', 'ぐー'); 5 define('CCC', 'ちょき'); 6 define('PPP', 'ぱー'); 7 8 define('GAME_WIN', '勝ち'); 9 define('GAME_LOSE', '負け'); 10 define('GAME_DRAW', 'あいこ'); 11 12 $battle = array(GGG, CCC, PPP); 13 $pc = ''; 14 $my = ''; 15 $result =''; 16 17 18 if (isset($_POST['my']) === TRUE) { 19 $my = $_POST['my']; 20 $pc = $battle[array_rand($battle)]; 21 switch($my) { 22 case GGG: 23 switch($pc) { 24 case GGG: 25 $result = GAME_DRAW; break; 26 case CCC: 27 $result = GAME_WIN; break; 28 case PPP: 29 $result = GAME_LOSE; break; 30 } 31 break; 32 case CCC: 33 switch($pc) { 34 case GGG: 35 $result = GAME_LOSE; break; 36 case CCC: 37 $result = GAME_DRAW; break; 38 case PPP: 39 $result = GAME_WIN; break; 40 } 41 break; 42 case PPP: 43 switch($pc) { 44 case GGG: 45 $result = GAME_WIN; break; 46 case CCC: 47 $result = GAME_LOSE; break; 48 case PPP: 49 $result = GAME_DRAW; break; 50 } 51 break; 52 } 53 } 54?> 55<!DOCTYPE html> 56<html lang="ja"> 57<head> 58 <meta charset="UTF-8"> 59 <title>じゃんけん勝負</title> 60</head> 61<body> 62 <h1>じゃんけん勝負</h1> 63 <label>自分: <?php print $my; ?></label> 64 <label>相手: <?php print $pc; ?></label> 65 <label>結果: <?php print $result; ?></label> 66 67 <form method="post"> 68 <input type="radio" name="my" value="<?=GGG?>"<?php if ($my === GGG) { print ' checked'; } ?>/><?=GGG?> 69 <input type="radio" name="my" value="<?=CCC?>"<?php if ($my === CCC) { print ' checked'; } ?>/><?=CCC?> 70 <input type="radio" name="my" value="<?=PPP?>"<?php if ($my === PPP) { print ' checked'; } ?>/><?=PPP?> 71 <input type="submit" value="勝負"> 72 </form> 73</body> 74</html>

配列を使うと見通しがぐっと良くなるケース。

php

1<?php 2 // 192036.php 3 4 define('GGG', 'ぐー'); 5 define('CCC', 'ちょき'); 6 define('PPP', 'ぱー'); 7 8 define('GAME_WIN', '勝ち'); 9 define('GAME_LOSE', '負け'); 10 define('GAME_DRAW', 'あいこ'); 11 12 $battle = array(GGG, CCC, PPP); 13 $judge = array( 14 GGG => array( 15 GGG => GAME_DRAW, 16 CCC => GAME_WIN, 17 PPP => GAME_LOSE, 18 ), 19 CCC => array( 20 GGG => GAME_LOSE, 21 CCC => GAME_DRAW, 22 PPP => GAME_WIN, 23 ), 24 PPP => array( 25 GGG => GAME_WIN, 26 CCC => GAME_LOSE, 27 PPP => GAME_DRAW, 28 ), 29 ); 30 $pc = ''; 31 $my = ''; 32 $result =''; 33 34 35 if (isset($_POST['my']) === TRUE) { 36 $my = $_POST['my']; 37 $pc = $battle[array_rand($battle)]; 38 $result = $judge[$my][$pc]; 39 } 40?> 41<!DOCTYPE html> 42<html lang="ja"> 43<head> 44 <meta charset="UTF-8"> 45 <title>じゃんけん勝負</title> 46</head> 47<body> 48 <h1>じゃんけん勝負</h1> 49 <label>自分: <?php print $my; ?></label> 50 <label>相手: <?php print $pc; ?></label> 51 <label>結果: <?php print $result; ?></label> 52 53 <form method="post"> 54 <input type="radio" name="my" value="<?=GGG?>"<?php if ($my === GGG) { print ' checked'; } ?>/><?=GGG?> 55 <input type="radio" name="my" value="<?=CCC?>"<?php if ($my === CCC) { print ' checked'; } ?>/><?=CCC?> 56 <input type="radio" name="my" value="<?=PPP?>"<?php if ($my === PPP) { print ' checked'; } ?>/><?=PPP?> 57 <input type="submit" value="勝負"> 58 </form> 59</body> 60</html>

投稿2019/05/29 09:24

編集2019/05/29 09:48
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

osusi

2019/05/29 11:35

分かりやすく教えてくれてありがとうございました!無事解決しました。
guest

0

php

1$battle['GGG']['GGG']='GAME_DRAW'; 2$battle['GGG']['CCC']='GAME_WIN'; 3$battle['GGG']['PPP']='GAME_LOSE';

こんなのにするとサックリと読みやすくなる気がする。

投稿2019/05/29 09:40

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/05/29 09:41

回答じゃなくてすまんね^^;
退会済みユーザー

退会済みユーザー

2019/05/29 09:48 編集

配列で判定するのもいいですね。回答をアレンジしてみました。
退会済みユーザー

退会済みユーザー

2019/05/29 09:52

ぶん投げの受け取り さんきゅ♪w
osusi

2019/05/29 11:36

おかげさまで読みやすくなりました!ありがとうございます!
guest

0

色んなところに全角空白が入っています。文字列内ならともかくコード内に全角空白はNGです。
エラー内容確認して調べましょう


あと細かいですが、htmlspecialchars()は取得時ではなく表示時につけてください。

エスケープは必ず出力するそのときにその場所で行います。

投稿2019/05/29 08:42

編集2019/05/29 08:45
m.ts10806

総合スコア80850

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

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

osusi

2019/05/29 11:33

ご指摘ありがとうございます!助かりました!おかげさまで無事解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問