PHP
初心者

【PHP編】初心者卒業試験 ブラックジャック

初めに

皆さん覚えてるでしょうか。
プログラミング入門者からの卒業試験は『ブラックジャック』を開発すべし
という記事が今年の2018年4月に公開されたのですが
ちょうどその頃僕も初心者用の記事を書きながら、どこまでがプログラミング初心者であるのか悩んでいたのでこっそり挑戦してみたのですが
5-6月が公私ともに忙しく寝る以外はほとんど外にいたので、記事にし損ねてました。

7月からは落ち着く予定なので、未経験からIT業界に挑戦するつもりの人たちが参考になれば良いなと思いちょこちょこ記事を書いていくつもりです。
ちなみにまだ僕も挑戦中なので、転職が成功するまでの過程や、結果をここで伝えていければ良いなと思います。

作ってみた結果

ブラックジャックが作れたからと言って初心者を卒業したとは思えない!!!

Github
完璧ではないでしょうが、きちんと動くし、自分としては色々と工夫をして作ってみたんです。
学ぶ事も多く作っている最中非常に楽しかった。
初心者が取り組む課題としては非常に良い難易度ですし、批評してるつもりではないんですが
「どうも、僕はプログラミング中級者です」といって上記のコードを見せても認められるとは思えなかったです。
僕の周りにはプログラマーの人が少ないので平均的なレベルはわかりませんが、少なくとも最近僕が求職中に見つけた未経験歓迎!!と書いてる所でも、上記を作っただけでは採用してくれる雰囲気ではなかったです。

完成したもの

詳しいルール等は元記事を参考にしてください。

index.php
<?php
require_once('deck.class.php');
require_once('game.class.php');
require_once('judgement.class.php');
define('MAXVALUE', 21);
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $button =$_POST['button'];
    $game = new Game;
    $judge = new Jadgement;
    switch ($button) {
        case 'newgame':
            $ceatedeck = new CreateDeck;
            $_SESSION['deck'] = $ceatedeck->shuffleDeck();
            $_SESSION['messages'] = $game->startGame();
            $_SESSION['user_hand'] = $game->firstDraw(); 
            array_splice($_SESSION['deck'], 0, 2); 
            $_SESSION['cpu_hand'] = $game->firstDraw();
            $_SESSION['secret_card'] = $_SESSION['deck'][1];
            array_splice($_SESSION['deck'], 0, 2);
            $user_points = $game->totalPoints($_SESSION['user_hand']);
            $judgement = $judge->bustOrBlackjack($user_points, 'あなた');
            $_SESSION['messages'][] = 'あなたの得点は:' . $user_points;
            break;
        case 'draw':
            $_SESSION['messages'][] = $game->showCard('あなた');
            $_SESSION['user_hand'][] = $game->nextDraw();
            array_splice($_SESSION['deck'], 0, 1);
            $user_points = $game->totalPoints($_SESSION['user_hand']);
            $judgement = $judge->bustOrBlackjack($user_points, 'あなた');
            $_SESSION['messages'][] = 'あなたの得点は:' . $user_points;
            break;
        case 'stop':
            $user_points = $game->totalPoints($_SESSION['user_hand']);
            $cpu_points = $game->totalPoints($_SESSION['cpu_hand']);
            $_SESSION['messages'][] = 'CPUの2枚目のカードは' . $_SESSION['secret_card'] . 'でした';
            $judgement = $judge->bustOrBlackjack($cpu_points, 'CPU');
            if (empty($judgement) && $cpu_points < 17) {
                for ($i=0; $cpu_points < 17; $i++) {
                    $_SESSION['messages'][] = $game->showCard('CPU');
                    $_SESSION['cpu_hand'][] = $game->nextDraw();
                    array_splice($_SESSION['deck'], 0, 1);
                    $cpu_points = $game->totalPoints($_SESSION['cpu_hand']);
                }
                $_SESSION['messages'][] = 'CPUの得点は:' . $cpu_points;
                $judgement = $judge->bustOrBlackjack($cpu_points, 'CPU');
                if (empty($judgement)) {
                    $judgement = $judge->checkTheWinner($user_points, $cpu_points);
                }
            } else {
                $_SESSION['messages'][] = 'CPUの得点は:' . $cpu_points;
                $judgement = $judge->checkTheWinner($user_points, $cpu_points);
            }
            break;
        default :
            echo 'error';
            exit;
    }
} else {
    echo "<h2>BlackJackを始める!!</h2>";
    echo "<form action='' method='post'>";
    echo "<input type='submit' name='button' value='newgame'>";
    echo "</form>";
    exit;
}
?>
<html lang="ja">
<head>
    <title>BlackJack</title>
</head>
<body>
    <h1>BlackJack</h1>
    <?php foreach ($_SESSION['messages'] as $msg) : ?>
    <p><?= $msg ?></p>
    <?php endforeach; ?>
    <?php if (!empty($judgement)) : ?>
    <?php foreach ($judgement as $row) : ?>
    <p><?= $row; ?></p>
    <?php endforeach ?>
    <form action='' method='post'>
        <input type="submit" name='button' value='newgame'>
    </form>
    <?php else : ?>
    <p>カードをひきますか?</p>
    <form action='' method='post'>
        <input type='submit' name='button' value='newgame'>
        <input type='submit' name='button' value='draw'>
        <input type='submit' name='button' value='stop'>
    </form>
    <?php endif; ?>
</body>
</html>

中身のdeck.php等はGithubのほうで確認していただければと思います。
大体こんな感じだよ!っていうので載せてみました。

    echo "<h2>BlackJackを始める!!</h2>";
    echo "<form action='' method='post'>";
    echo "<input type='submit' name='button' value='newgame'>";
    echo "</form>";
    exit;

こんな感じの恥ずかしいコードが載っていますが、他はそんなにおかしいものじゃないつもりです。
オブジェクト指向で書いて可読性を上げたつもりですがPHP始めたての方には少しわかりづらくなってるかもしれません。
初心者の方でコードで分かりづらい部分があればコメント頂ければ、解説させてもらおうかなとは思っていますが、とりあえずは解説無しです。

ジャッジメントですの。