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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

PHP

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

Q&A

解決済

1回答

3556閲覧

【PHP】しりとりゲーム作成【条件分岐】

ceoyama7

総合スコア15

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

PHP

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

0グッド

1クリップ

投稿2019/04/01 10:57

編集2019/04/01 11:02

現在、PHPを学習中です。
$_POST、$_GET変数の学習の一環として(というよりは条件分岐の学習になっているような気がしますが)、しりとりゲームを作ってみようと思い作成中なのですが、
なかなか思うように動かせません。
一通り思いつくことは試してみたのですが、うまく行かなかったため質問させていただきます。

記述中のコードですが、

html

1<div class="form"> 2 <form action="index.php" method="post"> 3 <input type="text" name="comment"> 4 <br> 5 <input type="submit" value="送信"> 6 </form> 7</div> 8 9<div class="siritori-spaces"> 10 <?php 11 for($i=1; $i <= 10; $i++){ 12 ?> 13 <div class="item"> 14 <div class="space" style="height: 50px; width:200px; border:2px solid black; float: left;"> 15 <p> 16 <?php 17 $boxNumber = $i; 18 if(isset($_POST['comment'])){ 19 $comment = $_POST['comment']; 20 if($i === $boxNumber){ 21 echo $boxNumber.".".$comment; 22 } 23 } 24 ?> 25 </p> 26 </div> 27 <div class="arrow"> 28 <p>==></p> 29 </div> 30 </div> 31 32 <?php }; ?> 33</div> 34

#想定しているやり方

for文で(ボックス+矢印)を10個作り、
formで取得したテキストをその中に1か所ずつ設置していく。
今のところは最初の文字と終わりの文字の一致判定は無視しています。

#わからないこと
現在のコードではフォームで取得したテキストが全てのボックスに入ってしまい、
(りんご⇒りんご⇒りんご⇒りんご、、、)
最初の1つの箱に入れる、ということがまずできません。
その後は箱に対して判定を行い、内容が入っていれば次の箱に入れる、という
やり方を想定しています。

#自分なりに考えた原因
forですべてを括ってしまっているため、1箱ずつの判定を記述できない。
試しに変数boxNumberを用意して箱内でechoしたところ、
番号の割り振りは成功していたのでこの辺りをつかって
一つずつの箱に番号の概念を与えてif分に反映させていけるのではないか?
と考えてはいるのですが、やり方を思いつきません。
.space内でに記述してあるifがその痕跡なのですが、
よくよく考えてみるとfor内での処理なのだからこの部分が偽になることってないよねって
いったん考え直しているところです。

経験者の方から見て、ここのやり方は不適切だとか、
そもそもこっちのやり方のほうがスムーズだとか、
このゲームを作るにあたっての枠組みといいますか、組み立て方、アルゴリズムは
こっちのほうが楽じゃない?みたいなものもあれば、
ご教授お願いいたします。

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

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

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

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

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

m.ts10806

2019/04/01 11:37

前に入力した情報は保持して、次に入力したら次の箱を表示してその箱に入力した値をってことですよね。 個数は今は10となっていますが、実際は固定じゃないですよね?
m.ts10806

2019/04/01 11:40

「固定じゃない」としたら、入力度に箱を増やすのが目的ですよね。 今回はどこまでしますか?10固定に順番に入っていくだけ?それとも入力回数分の箱を出す?
ceoyama7

2019/04/01 11:54

mts10806さん、先日に引き続き返答ありがとうございます。 深くは考えていませんでしたが、10個でゴールにしようと思います。
guest

回答1

0

ベストアンサー

hiddenで現在の番号と内容を保持するか、sessionで引き継ぐか、JSONなど外部ファイルで持つか、DBで持つか・・・。
いずれにしても入力した履歴を持つ仕組みが必要です。
hiddenだと画面上には出なくてもhtml上には出るので、できればそれ以外ですね。
※もし学習のためでなければ電卓とかと同じくPHP介さずJavaScriptだけでやりきっても良い気がします。次画面リロードでクリアにできますし

hiddenとsessionは似たような作りになりそうです。
とりあえずhiddenの例。※箱は固定のまま、中身だけ順々に

php

1<?php 2$comments = ''; 3$max = 10; 4$comment_number = 1; 5$comment_list = []; 6$btn_enable = ''; 7$comment_enable = ''; 8for ($i = 1; $i <= $max; $i ++) { 9 $comment_data = ''; 10 $comment = filter_input(INPUT_POST, 'comment'.$comment_number); 11 if (!is_null($comment) && $comment_number === $i) { 12 $comment_list[] = '<input type="hidden" name="comment'.$i.'" value="'.htmlspecialchars($comment, ENT_QUOTES, 'UTF-8').'">'; 13 $comment_data = $i . "." . htmlspecialchars($comment, ENT_QUOTES, 'UTF-8'); 14 $comment_number = $i+1; 15 if($comment_number >= ($max+1)){ 16 $btn_enable = ' disabled'; 17 $comment_enable = ' disabled'; 18 } 19 } 20 21 $next_arrow = '==>'; 22 if($i === $max){ 23 $next_arrow = ''; 24 } 25 $comments .=<<<EOF 26 <div class="item"> 27 <div class="space" 28 style="height: 50px; width: 200px; border: 2px solid black; float: left;"> 29 <p>{$comment_data}</p> 30 </div> 31 <div class="arrow"> 32 <p>{$next_arrow}</p> 33 </div> 34 </div> 35EOF; 36} 37?> 38<!DOCTYPE html> 39<html> 40<head> 41<meta charset="UTF-8"> 42<title>しりとり</title> 43</head> 44<body> 45 <div class="form"> 46 <form action="" method="post"> 47 <input type="text" name="comment<?=$comment_number?>"<?=$comment_enable ?>> <br> <input type="submit" value="送信"<?=$btn_enable ?>> 48 <?=implode("\n",$comment_list)?> 49 </form> 50 </div> 51 52 <div class="siritori-spaces"> 53 <?=$comments?> 54 </div> 55</body> 56</html>

※「自身に送信」ならaction指定なしで良いため、省いています。

PHP 5.4 以降では配列の短縮構文が追加され、 array() の代わりに [] を使えるようになりました。
紹介記事例:PHPでよく使う配列操作まとめ

紹介記事例:filter_input関数を使って簡潔なコードを書こう

PHPのhtmlspecialcharsでのHTMLエンティティ化と、一文字に簡略化方法

紹介記事例:PHP ヒアドキュメントの使いかた

投稿2019/04/01 12:23

編集2019/04/01 12:53
m.ts10806

総合スコア80850

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

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

ceoyama7

2019/04/01 12:40

ご回答ありがとうございます。 現段階で意味のわからない箇所もあるので、 模写しつつその都度調べて理解していきます。 p.s 先日アドバイス頂いたおかげで無事、PHPの学習に取り組めています。ありがとうございました(^^)
m.ts10806

2019/04/01 13:01 編集

PHP構文についてはPHPマニュアルと紹介記事例を追記しました。 あとは結局のところ「ロジック」です。 私も今回のコードを5分10分で作れたかと言うとそうではなくて、 1つ1つ仮のコードを埋めて検証して少しずつ完成させていっています。 完成したコードだけ出ていると伝わりづらいですが、何回か検証がうまくいかず組み立てなおしています。 ある程度汎用的にする必要がありますし、読みやすくするための工夫とかもちりばめています。 ただ、回答にも書きましたようにhiddenのHTMLコードをどんどん追記していく方式なので、 あまりよろしくはないやり方だったりします。 参考にするのはあくまでロジック部分だけにして、これ以外のやり方で実現してみてください。 ※あと、不具合対応ではなくても「デバッグ」は有用です。覚えてください。https://qiita.com/daaaayoshi/items/72011cd2eb69743a077a あと、 もし、解決の糸口になったようでしたら質問を「解決済み」にして締めていただけたらと思います。(前の質問も解決したのかどうかわからないので) https://teratail.com/help/question-tips#questionTips4
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問