Passed
Branch main (339f6d)
by Cornelia
17:44 queued 07:47
created

Game21::bankDrawUntilLimit()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 2
c 0
b 0
f 0
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
cc 2
nc 2
nop 0
crap 2
1
<?php
2
3
namespace App\Game;
4
5
use App\Card\DeckOfCards;
6
7
/**
8
 * Klass som hanterar logiken för spelet 21 (Blackjack).
9
 */
10
class Game21
11
{
12
    private DeckOfCards $deck;
13
    private Player $player;
14
    private Bank $bank;
15
    private string $status = 'ongoing';
16
17
    /**
18
     * Konstruktor som initierar spelet.
19
     */
20 6
    public function __construct()
21
    {
22 6
        $this->initGame();
23
    }
24
25
    /**
26
     * Initierar spelet genom att skapa och blanda kortleken samt skapa spelare och bank.
27
     */
28 6
    private function initGame(): void
29
    {
30 6
        $this->deck = new DeckOfCards(true);
31 6
        $this->deck->shuffle();
32
33 6
        $this->player = new Player();
34 6
        $this->bank = new Bank();
35
    }
36
37
    /**
38
     * Startar en runda och låter spelaren dra sitt första kort om det är första turen.
39
     */
40 2
    public function startRound(): void
41
    {
42 2
        if ($this->isFirstTurn()) {
43 2
            $this->player->drawCard($this->deck);
44
        }
45
    }
46
47
    /**
48
     * Kontrollerar om det är första turen för spelaren.
49
     *
50
     * @return bool true om spelarens poäng är 0, annars false
51
     */
52 2
    private function isFirstTurn(): bool
53
    {
54 2
        return 0 === $this->player->getScore();
55
    }
56
57
    /**
58
     * Låter spelaren dra ett kort och uppdaterar status om spelaren blir "busted".
59
     */
60 1
    public function playerDraw(): void
61
    {
62 1
        $this->player->drawCard($this->deck);
63
64 1
        if ($this->isPlayerBusted()) {
65 1
            $this->status = 'bank_wins';
66
        }
67
    }
68
69
    /**
70
     * Kontrollerar om spelaren har överskridit 21 poäng.
71
     *
72
     * @return bool true om spelarens poäng är över 21, annars false
73
     */
74 1
    private function isPlayerBusted(): bool
75
    {
76 1
        return $this->player->getScore() > 21;
77
    }
78
79
    /**
80
     * Spelaren väljer att stanna. Banken drar kort tills poängen är minst 17 och vinnaren bestäms.
81
     */
82 1
    public function playerStay(): void
83
    {
84 1
        $this->bankDrawUntilLimit();
85 1
        $this->determineWinner();
86
    }
87
88
    /**
89
     * Banken drar kort tills poängen är minst 17.
90
     */
91 1
    private function bankDrawUntilLimit(): void
92
    {
93 1
        while ($this->bank->getScore() < 17) {
94 1
            $this->bank->drawCard($this->deck);
95
        }
96
    }
97
98
    /**
99
     * Bestämmer vinnaren baserat på poäng och uppdaterar status.
100
     */
101 3
    private function determineWinner(): void
102
    {
103 3
        $playerScore = $this->player->getScore();
104 3
        $bankScore = $this->bank->getScore();
105
106 3
        if ($this->bankIsBusted() || $playerScore > $bankScore) {
107 2
            $this->status = 'player_wins';
108
        } else {
109 1
            $this->status = 'bank_wins';
110
        }
111
    }
112
113
    /**
114
     * Kontrollerar om banken har överskridit 21 poäng.
115
     *
116
     * @return bool true om bankens poäng är över 21, annars false
117
     */
118 3
    private function bankIsBusted(): bool
119
    {
120 3
        return $this->bank->getScore() > 21;
121
    }
122
123
    /**
124
     * Hämtar spelarobjektet.
125
     *
126
     * @return Player spelaren
127
     */
128 5
    public function getPlayer(): Player
129
    {
130 5
        return $this->player;
131
    }
132
133
    /**
134
     * Hämtar bankobjektet.
135
     *
136
     * @return Bank banken
137
     */
138 3
    public function getBank(): Bank
139
    {
140 3
        return $this->bank;
141
    }
142
143
    /**
144
     * Hämtar aktuell status för spelet.
145
     *
146
     * @return string Status, t.ex. 'ongoing', 'player_wins', eller 'bank_wins'.
147
     */
148 6
    public function getStatus(): string
149
    {
150 6
        return $this->status;
151
    }
152
}
153