Passed
Push — main ( 101f2d...06b8a6 )
by Emil
25:10
created

ProjectController::blackJacBet()   A

Complexity

Conditions 5
Paths 4

Size

Total Lines 41
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 16
CRAP Score 5.2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
eloc 19
c 1
b 0
f 0
nc 4
nop 2
dl 0
loc 41
ccs 16
cts 20
cp 0.8
crap 5.2
rs 9.3222
1
<?php
2
3
namespace App\Controller;
4
5
use App\Game\BlackJack;
6
use App\Game\BlackJack\Player;
7
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
8
use Symfony\Component\HttpFoundation\Request;
9
use Symfony\Component\HttpFoundation\Response;
10
use Symfony\Component\HttpFoundation\Session\SessionInterface;
11
use Symfony\Component\Routing\Annotation\Route;
12
13
class ProjectController extends AbstractController
14
{
15 1
    #[Route('/proj', name: 'proj_start')]
16
    public function home(): Response
17
    {
18 1
        return $this->render('proj/home.html.twig');
19
    }
20
21 1
    #[Route('/proj/about', name: 'proj_doc')]
22
    public function about(): Response
23
    {
24 1
        return $this->render('proj/doc.html.twig');
25
    }
26
27 3
    #[Route('/proj/player/init/{num<\d+>}', name: 'proj_player_init')]
28
    public function playerInit(
29
        int $num,
30
    ): Response {
31 3
        if ($num > BlackJack::MAX_PLAYERS) {
32 1
            throw new \RuntimeException("Can't have more then ".BlackJack::MAX_PLAYERS.'players!');
33
        }
34 2
        if ($num < 1) {
35 1
            throw new \RuntimeException("Can't have less than 1 player!");
36
        }
37
38 1
        $data = [
39 1
            'numOfPlayers' => $num,
40 1
            'players' => [],
41 1
        ];
42
43
        // Create default name
44 1
        for ($i = 1; $i <= $num; ++$i) {
45 1
            $data['players'][] = "Player $i";
46
        }
47
48 1
        return $this->render('proj/player_creation.html.twig', $data);
49
    }
50
51 1
    #[Route('/proj/blackjack/init', name: 'proj_BlackJack_init', methods: ['POST'])]
52
    public function blackJackInit(
53
        SessionInterface $session,
54
        Request $request,
55
    ): Response {
56
        /** @var BlackJack $blackJack */
57 1
        $blackJack = new BlackJack();
58
59
        /** @var int $numOfPlayers */
60 1
        $numOfPlayers = $request->request->get('numOfPlayers');
61
62
        // Get the names of the players
63 1
        $players = [];
64
65 1
        for ($i = 1; $i <= $numOfPlayers; ++$i) {
66
            /** @var string|null $playerName */
67 1
            $playerName = $request->request->get("Player_$i");
68 1
            if (null === $playerName || '' === trim($playerName)) {
69 1
                $playerName = "Player $i"; // default name if blank
70
            }
71 1
            $players[] = new Player($playerName);
72
        }
73
74 1
        $blackJack->setPlayers($players);
75
76
        // Save to session
77 1
        $session->set('proj_black_jack', $blackJack);
78 1
        $session->set('proj_newGame', true);
79 1
        $session->set('proj_playerTurn', 0);
80
81 1
        return $this->redirectToRoute('proj_BlackJack_game');
82
    }
83
84 2
    #[Route('/proj/blackjack/game', name: 'proj_BlackJack_game', methods: ['GET'])]
85
    public function blackJack(
86
        SessionInterface $session,
87
    ): Response {
88
        /** @var BlackJack|null $blackJack */
89 2
        $blackJack = $session->get('proj_black_jack');
90
        /** @var bool|null $newGame */
91 2
        $newGame = $session->get('proj_newGame');
92
        /** @var int|null $playerTurn */
93 2
        $playerTurn = $session->get('proj_playerTurn');
94
95
        // redirect if blackJack or newGame or playerTurn is not in session
96 2
        if (null === $blackJack || null === $newGame || null === $playerTurn) {
97 1
            $this->addFlash(
98 1
                'warning',
99 1
                'A Black Jack game is not setup, choose a number of players to start!'
100 1
            );
101
102 1
            return $this->redirectToRoute('proj_start');
103
        }
104
105 1
        $data = $blackJack->stateOfGame();
106
107 1
        $data['newGame'] = $newGame;
108 1
        $data['playerTurn'] = $playerTurn;
109
110 1
        return $this->render('proj/black_jack.html.twig', $data);
111
    }
112
113 2
    #[Route('/proj/blackjack/bet', name: 'proj_BlackJack_Bet', methods: ['POST'])]
114
    public function blackJacBet(
115
        SessionInterface $session,
116
        Request $request,
117
    ): Response {
118
        /** @var BlackJack|null $blackJack */
119 2
        $blackJack = $session->get('proj_black_jack');
120
        /** @var bool|null $newGame */
121 2
        $newGame = $session->get('proj_newGame');
122
123
        // redirect if blackJack or newGame is not in session
124 2
        if (null === $blackJack || null === $newGame) {
125 1
            $this->addFlash(
126 1
                'warning',
127 1
                'A Black Jack game is not setup, choose a number of players to start!'
128 1
            );
129
130 1
            return $this->redirectToRoute('proj_start');
131
        }
132
133
        /** @var int $numOfPlayers */
134 1
        $numOfPlayers = $request->request->get('numOfPlayers');
135
136 1
        $bets = [];
137
138 1
        for ($i = 0; $i < $numOfPlayers; ++$i) {
139
            /** @var int|null $bet */
140
            $bet = $request->request->get("$i");
141
            if (null === $bet) {
142
                $bet = BlackJack::MINIMUM_BET; // default bet if blank
143
            }
144
            $bets[] = $bet;
145
        }
146
147 1
        $blackJack->newGame($bets);
148
149
        // Save to session
150 1
        $session->set('proj_black_jack', $blackJack);
151 1
        $session->set('proj_newGame', false);
152
153 1
        return $this->redirectToRoute('proj_BlackJack_game');
154
    }
155
156 2
    #[Route('/proj/blackjack/stay', name: 'proj_BlackJack_Stay', methods: ['POST'])]
157
    public function blackJackStay(
158
        SessionInterface $session,
159
    ): Response {
160
        /** @var BlackJack|null $blackJack */
161 2
        $blackJack = $session->get('proj_black_jack');
162
        /** @var int|null $playerTurn */
163 2
        $playerTurn = $session->get('proj_playerTurn');
164
165
        // redirect if blackJack or playerTurn is not in session
166 2
        if (null === $blackJack || null === $playerTurn) {
167 1
            $this->addFlash(
168 1
                'warning',
169 1
                'A Black Jack game is not setup, choose a number of players to start!'
170 1
            );
171
172 1
            return $this->redirectToRoute('proj_start');
173
        }
174
175 1
        $blackJack->stayPlayer($playerTurn);
176 1
        ++$playerTurn;
177
178
        // Save to session
179 1
        $session->set('black_jack', $blackJack);
180 1
        $session->set('proj_playerTurn', $playerTurn);
181
182 1
        return $this->redirectToRoute('proj_BlackJack_game');
183
    }
184
185 2
    #[Route('/proj/blackjack/hit', name: 'proj_BlackJack_Hit', methods: ['POST'])]
186
    public function blackJackHit(
187
        SessionInterface $session,
188
    ): Response {
189
        /** @var BlackJack|null $blackJack */
190 2
        $blackJack = $session->get('proj_black_jack');
191
        /** @var int|null $playerTurn */
192 2
        $playerTurn = $session->get('proj_playerTurn');
193
194
        // redirect if blackJack or playerTurn is not in session
195 2
        if (null === $blackJack || null === $playerTurn) {
196 1
            $this->addFlash(
197 1
                'warning',
198 1
                'A Black Jack game is not setup, choose a number of players to start!'
199 1
            );
200
201 1
            return $this->redirectToRoute('proj_BlackJack_game');
202
        }
203
204 1
        $blackJack->hitPlayer($playerTurn);
205
206
        // If bust then next players turn
207 1
        if (true === $blackJack->isPlayerBust($playerTurn)) {
208
            ++$playerTurn;
209
            $session->set('proj_playerTurn', $playerTurn);
210
        }
211
212
        // Save to session
213 1
        $session->set('black_jack', $blackJack);
214
215 1
        return $this->redirectToRoute('proj_BlackJack_game');
216
    }
217
218 2
    #[Route('/proj/blackjack/double_down', name: 'proj_BlackJack_DoubleDown', methods: ['POST'])]
219
    public function blackJackDoubleDown(
220
        SessionInterface $session,
221
    ): Response {
222
        /** @var BlackJack|null $blackJack */
223 2
        $blackJack = $session->get('proj_black_jack');
224
        /** @var int|null $playerTurn */
225 2
        $playerTurn = $session->get('proj_playerTurn');
226
227
        // redirect if blackJack or playerTurn is not in session
228 2
        if (null === $blackJack || null === $playerTurn) {
229 1
            $this->addFlash(
230 1
                'warning',
231 1
                'A Black Jack game is not setup, choose a number of players to start!'
232 1
            );
233
234 1
            return $this->redirectToRoute('proj_start');
235
        }
236
237 1
        $blackJack->doubleDownPlayer($playerTurn);
238 1
        ++$playerTurn;
239
240
        // Save to session
241 1
        $session->set('black_jack', $blackJack);
242 1
        $session->set('proj_playerTurn', $playerTurn);
243
244 1
        return $this->redirectToRoute('proj_BlackJack_game');
245
    }
246
247 1
    #[Route('/proj/blackjack/newGame', name: 'proj_BlackJack_NewGame', methods: ['POST'])]
248
    public function blackJackNewGame(
249
        SessionInterface $session,
250
    ): Response {
251
        // Save to session
252 1
        $session->set('proj_newGame', true);
253
254 1
        return $this->redirectToRoute('proj_BlackJack_game');
255
    }
256
}
257