Passed
Push — main ( a387cb...339f6d )
by Cornelia
07:55
created

Player::getHand()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 1
c 1
b 0
f 0
dl 0
loc 3
ccs 2
cts 2
cp 1
rs 10
cc 1
nc 1
nop 0
crap 1
1
<?php
2
3
namespace App\Game;
4
5
use App\Card\CardHand;
6
use App\Card\DeckOfCards;
7
8
/**
9
 * Representerar en spelare i spelet 21.
10
 * Hanterar spelarens hand och beräknar poäng.
11
 */
12
class Player
13
{
14
    /** @var CardHand Spelarens hand med kort */
15
    protected CardHand $hand;
16
17
    /**
18
     * Konstruktor som skapar en tom hand.
19
     */
20 18
    public function __construct()
21
    {
22 18
        $this->hand = new CardHand();
23
    }
24
25
    /**
26
     * Drar ett kort från given kortlek och lägger till i spelarens hand.
27
     *
28
     * @param DeckOfCards $deck Kortleken att dra ifrån
29
     */
30 6
    public function drawCard(DeckOfCards $deck): void
31
    {
32 6
        $cards = $deck->draw();
33 6
        foreach ($cards as $card) {
34 6
            $this->hand->addCard($card);
35
        }
36
    }
37
38
    /**
39
     * Beräknar spelarens aktuella poäng enligt reglerna för 21.
40
     * Ess räknas som 11 eller 1 beroende på totalpoängen.
41
     *
42
     * @return int Spelarens aktuella poäng
43
     */
44 16
    public function getScore(): int
45
    {
46 16
        $score = 0;
47 16
        $aces = 0;
48
49 16
        foreach ($this->hand->getCards() as $card) {
50 14
            $value = $card->getValue();
51 14
            if (is_numeric($value)) {
52 11
                $score += (int) $value;
53 6
            } elseif (in_array($value, ['J', 'Q', 'K'])) {
54 4
                $score += 10;
55 4
            } elseif ('A' === $value) {
56 4
                ++$aces;
57
            }
58
        }
59
60 16
        for ($i = 0; $i < $aces; ++$i) {
61 4
            if ($score + 11 <= 21) {
62 2
                $score += 11;
63
            } else {
64 2
                ++$score;
65
            }
66
        }
67
68 16
        return $score;
69
    }
70
71
    /**
72
     * Returnerar spelarens hand.
73
     *
74
     * @return CardHand Spelarens hand
75
     */
76 6
    public function getHand(): CardHand
77
    {
78 6
        return $this->hand;
79
    }
80
81
    /**
82
     * Lägger till ett specifikt kort i spelarens hand, används vid testning.
83
     *
84
     * @param int|string $value Kortets värde, t.ex. 2–10, "J", "Q", "K", "A"
85
     */
86 2
    public function drawCardFromValue(int|string $value): void
87
    {
88 2
        $card = new \App\Card\Card('♥', $value);
89 2
        $this->hand->addCard($card);
90
    }
91
}
92