コーディング道場 「phpでジャンケン」の問題を解いてみる。
コーディング道場でphpのジャンケンの勝敗を決めるプログラミングの問題を解いていますが、できませんでした。その過程を書いてみます。
問題文の要約
変数 $player と $rival には、ジャンケンの履歴が文字列で入っています。
プレイヤー側が何勝何敗したかを求めて、勝利を:$win 負けを:$loseの変数に代入して結果を表示する。
<数字の意味>
0:グー、2:チョキ、5:パー
問題から、forの繰り返し、配列の取り出し、ifの条件分岐を使うことがわかります。そこで、問題文では勝負数が不明なので、5回ジャンケンをして勝敗を決めるプログラミングをしてみました。5回ジャンケンをするプログラミングができていれば、勝負数が不明でも応用できます。
ジャンケンを5回した場合の勝敗
説明していきます。
1、自分と敵の変数に配列を使って、何を出したか?を5回記録。
$player = array('0','5','0','2','5');//自分 5回分のジャンケン
$rival = array('5','2','0','5','0');//敵 5回分のジャンケン
2、$win $loseを勝敗ごとに加算
0からのスタートとする。試合が始まる前から1勝していてはおかしいですよね。
$win = 0;//勝ち負けは、0から加算する
$lose = 0;
後述する、$win++ $lose++で、0から1ずつ足していくという意味になります。
3、forで配列の数 5回だけ繰り返して行うことを宣言。
for($i = 0,$j = 0;$i < count($myPlayer),$j < count($tekiRival);
$i++,$j++)
ループの並列処理
自分と敵の勝負数が必要なので、$i =0, $j = 0;と書くことで同時に処理ができます。
配列の個数を知る
count(配列 変数名)で、配列の数を知ることができます。5回戦したので、$i < 5と同じ意味です。
つまり、$i = 0,$i < count($myPlayer),$i++は、$iは、0から始まって 0 1 2 3 4と5回数えますよ、というのを表しています。
$i = 1,$i <= 5でも、1 2 3 4 5と5回数えることになりますが、プログラミングの世界では0からスタートします。
4、条件分岐 else if
ifの複雑化ともいえるif else if。こうすることで、1に当てはまらなかったら2の条件処理やって、それでも違うなら3の条件処理をやってね、ということができます。
if*1{ //変数[]で、配列の順番に基づく要素を指定。条件分岐で勝敗を加算する。
$win++;}
5、変数と文字列の結合
最後に、$win++ $lose++の集計をします。
print($win.'勝'.$lose.'敗'); ('文字'.変数.'文字')のように文字は’ ’で、変数は. .で結合をします。
これでやってみると、2勝2敗と表示されました。バッチリです。
ジャンケンの回数が不明の勝敗
しかし、コーディング道場の問題は、5回戦の勝敗を表示できたプログラミングの仕方では正解しませんでした。いちばんの問題点は、countで配列の個数が数えられていないことでした。
上から、4つめの要素、配列の要素全部、要素数です。
そこで気が付きました。もしかしたら、何を出したかの勝負数が文字列になっているからじゃないかと。自分で作ったのは、0 2 5を数値でやっていました。だから配列の個数を数えることができたし、大なり小なりも比較することができました。
しかし、数字が文字列になっていると、個数を数えたり比較することができないのではないか。そこで、intvalというやつで文字列を数字に変換するようにしました。
$myPlayer = intval($player);で数字に変換して、あとは全部$playerを$myPlayerに変更しました。($rivalも同様に)
これで正解!と思ったのですが、これでもダメでした。なぜ?
参考サイト
for文で複数の変数を変化させる - 繰り返し処理 - PHP入門
複数の条件分岐(if..elseif..else) - 条件分岐 - PHP入門
配列に含まれる項目数を取得する(count) - 配列関数 - PHP関数
*1:$player[$i] == 0)&&($Rival[$j] == 2