【PHP入門 / 練習問題】Webじゃんけんゲームを作ろう!(回数カウント実装)

PHP

前回コンピューター対戦まで実装した、Webじゃんけんゲームに回数のカウント機能を実装します。
また、内部のリファクタリング(マジックナンバーを潰します)を少し行ってコードを見やすくします。

前回の記事はこちらです。

この記事の目標(作るもの)について

下記のように、プレイ回数とユーザーの勝った回数のカウントを実装します。

回数カウント機能を実装する

コンピューターとの対戦結果を判定している箇所の下に追記していきます。
game.phpに下記のように追記してみてください。

         if ($computerHand === $userHand) {
         } else if ($computerHand === 'rock' && $userHand === 'scissors') {
             $winnerFlag = 1;
         } else if ($computerHand === 'scissors' && $userHand === 'paper') {
             $winnerFlag = 1;
             $winnerFlag = COMPUTER_WIN;
         }else if ($computerHand === 'paper' && $userHand === 'rock') {
             $winnerFlag = 1;
         } else {
             $winnerFlag = 2;
         }
// ----- ここから追加する -----
         // 回数のカウント
         $playCount = isset($_SESSION['count']) ? $_SESSION['count'] : 0;
         $playCount = $playCount + 1;
         $_SESSION['count'] = $playCount;

         $userWinCount = isset($_SESSION['userWinCount']) ? $_SESSION['userWinCount'] : 0;
         if ($winnerFlag == 2) {
             $userWinCount = $userWinCount + 1;
             $_SESSION['userWinCount'] = $userWinCount;
         }
// ----- ここまで追加する -----

解説

まず、プレイした回数を$playCountという変数に入れるために用意しています。
セッションにある場合はセッションから取得して、セッションにない場合は0から始めます。
毎回この変数に1を足して、セッションに格納するようにしています。(プレイ回数が実行するたびに加算されます)

次に、ユーザーが勝った回数をカウントしています。
ユーザーが勝った回数をセッション($_SESSION['userWinCount'])に保持しています。毎回プレイするたびに勝った場合は+1していきます。

回数カウントの表示箇所を実装する

game.phpの画面の表示している箇所を下記のように修正します。

   // ----- ここから削除する -----
   <div class="fs-4">n回のうち、n回勝ちました。</div>
   // ----- ここまで削除する -----
   // ----- ここから追加する -----
   <div class="fs-4"><?php echo $playCount; ?>回のうち、<?php echo $userWinCount; ?>回勝ちました。</div>
   // ----- ここまで追加する -----
 </div>
 <div class="d-flex justify-content-center align-items-center flex-column mt-2">

プレイした回数($playCount)とユーザーの勝った回数($userWinCount)の変数を表示するように修正しました。

マジックナンバーを修正して、コードを見やすくする

直接数値を比較している箇所があるので、修正してコードの見通しを良くしましょう。
下記のようなコードは数値が何を示しているか、本人以外はわからないのでマジックナンバーと呼ばれます。

if ($winnerFlag == 2) { // 2が何なのかよくわからない。

定数を作って、修正していきます。
下記のように、session_startを呼び出している配下に、define関数で定数を作成します。

<?php
    session_start();
// ---- ここから追加する ----
    define("DRAW", 0);
    define("COMPUTER_WIN", 1);
    define("USER_WIN", 2);
// ---- ここまで追加する ----

このようにdefineで定数化しておくと、DRAW0COMPUTER_WIN1USER_WIN2が返ってきます。

それでは、作成した定数を使ってコードを修正します。
まずは、判定箇所を修正します。下記のように数値を使っている箇所を定数に変更します。

// ----- ここから削除する -----
         $winnerFlag = 0;
// ----- ここまで削除する -----
// ----- ここから追加する -----
         $winnerFlag = DRAW;
// ----- ここまで追加する -----
         if ($computerHand === $userHand) {
         } else if ($computerHand === 'rock' && $userHand === 'scissors') {
// ----- ここから削除する -----
             $winnerFlag = 1;
// ----- ここまで削除する -----
// ----- ここから追加する -----
             $winnerFlag = COMPUTER_WIN;
// ----- ここまで追加する -----
         } else if ($computerHand === 'scissors' && $userHand === 'paper') {
// ----- ここから削除する -----
             $winnerFlag = 1;
// ----- ここまで削除する -----
// ----- ここから追加する -----
             $winnerFlag = COMPUTER_WIN;
// ----- ここまで追加する -----
         }else if ($computerHand === 'paper' && $userHand === 'rock') {
// ----- ここから削除する -----
             $winnerFlag = 1;
// ----- ここまで削除する -----
// ----- ここから追加する -----
             $winnerFlag = COMPUTER_WIN;
// ----- ここまで追加する -----
         } else {
// ----- ここから削除する -----
             $winnerFlag = 2;
// ----- ここまで削除する -----
// ----- ここから追加する -----
             $winnerFlag = USER_WIN;
// ----- ここまで追加する -----
         }

次は、先ほど修正したユーザーの勝ったカウントの箇所も下記のように修正します。

$userWinCount = isset($_SESSION['userWinCount']) ? $_SESSION['userWinCount'] : 0;
// ----- ここから削除する -----
if ($winnerFlag == 2) {
// ----- ここまで削除する -----
// ----- ここから追加する -----
if ($winnerFlag == USER_WIN) {
// ----- ここまで追加する -----
    $userWinCount = $userWinCount + 1;
    $_SESSION['userWinCount'] = $userWinCount;
}

これでマジックナンバーが消えて、コードの見通しがよくなったと思います。
このように、プログラムの挙動はそのままで内部的に処理を綺麗にしたりすることをリファクタリングと言います。

動作確認する

ユーザーのプレイ回数と勝った回数が表示されるか動作確認してみましょう。
`http://localhost:8080/php-rock-paper-scissors/index.php`にアクセスして、ユーザー名を入力してプレイしてみます。

このように回数がカウントされることが確認できました!

終わりに

今回はセッションに回数を保持して、表示するようにしてみました。
そして、マジックナンバーの修正も一緒に行いました。

コードが見やすくなったかと思います。
なるべくマジックナンバーはコードの作成時に潰して見通しをよくしておくようにすると良いです。

次回は最終回です。ログアウト機能を実装してみます。

コメント

タイトルとURLをコピーしました