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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

Q&A

2回答

3097閲覧

PHPでじゃんけん勝負

turtle410

総合スコア13

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

0グッド

0クリップ

投稿2021/01/31 04:25

前提・実現したいこと

じゃんけん勝負ができるプログラムを作成しました。ラジオボタンから選択した値
(「グー」あるいは「チョキ」あるいは「パー」)をPOSTで送信し、ユーザと相手(コンピュータ)が
選んだ手と、じゃんけんの勝敗を表示するというプログラムです。
エラーはありませんが、下記のプログラム以外にシンプルなプログラムがあれば教えてください。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

PHP

1<?php 2$janken = array('グー', 'チョキ', 'パー'); 3$result = ''; 4$me = ''; 5$com = ''; 6// $_POST['hand']が存在するか確認するのにissetを使う。$_POST['hand']を使いたいのであれば必ず必要 7if (isset($_POST['hand']) === TRUE) { 8 $me = htmlspecialchars($_POST['hand'], ENT_QUOTES, 'UTF-8'); 9 $com = $janken[array_rand($janken)]; 10} 11if ($me === '' || $com === '') { 12 $result = ''; //データがない時の処理 13 print '下の3つの中からどれかを選択してください'; 14} else if ($me === $com) { 15 $result = 'あいこ'; 16} else if ($me === 'グー' && $com === 'チョキ' || $me === 'チョキ' && $com === 'パー' || $me === 'パー' && $com === 'グー') { 17 $result = '勝ち'; 18} else { 19 $result = '負け'; 20} 21?> 22<!DOCTYPE HTML> 23<html lang="ja"> 24<head> 25 <meta charset="UTF-8"> 26 <title></title> 27</head> 28<body> 29 <form method ="POST"> 30 <h1>じゃんけん勝負</h1> 31 <p>自分:<?php print $me; ?></p> 32 <p>相手:<?php print $com; ?></p> 33 <p>結果:<?php print $result; ?></p> 34 <!--php if ($hand === 'グー'){ print 'checked';} もしhandがグーであるなら、チェックボックスにチェックを表示させる--> 35 <!--これをすることにより直近で選んだものにチェックがされるので、連続でクリックするときに便利--> 36 <label><input type="radio" name="hand" value="グー">グー</label> 37 <label><input type="radio" name="hand" value="チョキ">チョキ</label> 38 <label><input type="radio" name="hand" value="パー">パー</label> 39 <p><input type="submit" value="勝負!"></p> 40 </form> 41</body> 42</html> 43

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

yuuyu

2021/01/31 04:44

> 下記のプログラム以外にシンプルなプログラムがあれば どの辺がよりシンプルに記述できると想定して質問したのか、より具体的に記述すると回答を得られると思います。現状の内容だとただの作業依頼です。
guest

回答2

0

下記のプログラム以外にシンプルなプログラムがあれば

JavaScriptでやりきる。
PHP必要なくなるのでよりシンプルな構成になりますね。

投稿2021/01/31 06:03

m.ts10806

総合スコア80850

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

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

0

タイトルにつられたので回答

問題・課題が含まれていない質問にも思えますのでガイドライン等をよく読んでください。

じゃんけんの判定については以前たまたま見つけたアルゴリズムを用いた実装を参考にしてみました。
参考: じゃんけんアルゴリズムをちょっと応用

PHP

1<?php 2 3define('JANKEN', [ 4 'グー', 'チョキ', 'パー' 5]); 6 7define('RESULT', [ 8 'あいこ', '負け', '勝ち' 9]); 10 11/** 12 * 勝敗の判定 13 * 14 * @param $me int 15 * @param $com int 16 * @return int 17 */ 18function judgment(int $me, int $com): int 19{ 20 if ($me > 2 || $com > 2) { 21 $me = (int)($me / 3); 22 $com = (int)($com / 3); 23 } 24 return ($me - $com + 3) % 3; 25} 26 27if (isset($_POST['hand'])) { 28 $me = (int)$_POST['hand']; 29 if (isset(JANKEN[$me])) { 30 $com = array_rand(JANKEN); 31 $result = RESULT[judgment($me, $com)]; 32 } 33} 34 35?> 36 37<!DOCTYPE HTML> 38<html lang="ja"> 39<head> 40 <meta charset="UTF-8"> 41 <title></title> 42</head> 43<body> 44<form method="POST"> 45 <h1>じゃんけん勝負</h1> 46 <?php if (isset($result)): ?> 47 <p>自分:<?= JANKEN[$me] ?? $me ?></p> 48 <p>相手:<?= JANKEN[$com] ?></p> 49 <p>結果:<?= $result ?></p> 50 <?php endif; ?> 51 <label><input type="radio" name="hand" value="0">グー</label> 52 <label><input type="radio" name="hand" value="1">チョキ</label> 53 <label><input type="radio" name="hand" value="2">パー</label> 54 <p><input type="submit" value="勝負!"></p> 55</form> 56</body> 57</html>

肝心の説明を記載していなかったので追記

エラーはありませんが、下記のプログラム以外にシンプルなプログラムがあれば教えてください。

あなたの言うシンプルなプログラムってなんですか?まずそこを明確にしなけば自分自身がコードをシンプルにかけないと思いいますし、QAサイトの様に他人に伝えることもできません。
今回の回答ではシンプルなプログラムを以下の様に定義づけました。

  • コードを見ただけでも第三者が容易に理解できる
  • デバッグしやすい
  • 仕様変更しやすい

コードを見ただけでもわかると言うのは変数名であったり一連のロジックを関数化(オブジェクト思考)するなどが挙げられます。一連の処理でまとめることにより、処理によって役割を分担(単一責任)しているので、結果的にデバッグがしやすいです。
また、PHPDocは記載した方がわかりやすいとも言えると思います。
参考: 初心者を戒めるPHP PHPDocは必ず書け - Qiita

最後に仕様変更しやすいというのは今回の例ではじゃんけんの出す選択肢にグーではなく、ぐー✊ などに変更したかったとします。そうすると、変更する必要があるのはどこかを質問者さんの最初のコードとこの回答のコードで見比べてみてください。また、定数で定義しているので保守性も上がると思います。

ラジオボタンのvalueを変更しなければいいだけじゃない?と思われるかもしれませんが、valueも変更しなければならないケースを想定してください。。いい具体例が思いつかなかったのです。。

質問者の元の回答ではHTMLのラジオボタンの表示を変えるだけではなく、勝敗の判定のロジックも変更する必要があります。ただ、この回答ではJANKENという配列のインデックスで管理しているため、配列の要素のみを変更するだけで勝敗の判定は変更する必要もありません。

投稿2021/01/31 05:45

編集2021/01/31 07:10
kai0310

総合スコア2070

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問