최근 Verbs와 Livewire로 작업하면서 제가 즐겨 플레이하는 카드 게임을 만들어 보는 것도 재미있는 실험이 될 것 같다고 생각했습니다.
이를 원활하게 하려면 이후에 진행하는 모든 프로젝트에서 사용할 수 있는 카드 덱을 정의해야 합니다.
카드 덱에는 Card, Deck 및 CardCollection 클래스가 포함되어야 합니다. 카드에는 슈트와 값이 있어야 하며, 덱은 52장의 카드로 구성되어야 합니다. 카드 덱에 대해 슈트와 값이 모두 정의되어 있으므로 카드 속성에 Enum을 사용할 수 있습니다.
CardCollection 클래스를 사용하면 카드 모음을 동사 상태로 안전하게 저장할 수 있습니다.
<?php // Cards/Enums/Suit.php declare(strict_types=1); namespace Cards\Enums; enum Suit: string { case Clubs = 'Clubs'; case Diamonds = 'Diamonds'; case Hearts = 'Hearts'; case Spades = 'Spades'; }
<?php // Cards/Enums/Value.php declare(strict_types=1); namespace Cards\Enums; enum Value: string { case Two = 'Two'; case Three = 'Three'; case Four = 'Four'; case Five = 'Five'; case Six = 'Six'; case Seven = 'Seven'; case Eight = 'Eight'; case Nine = 'Nine'; case Ten = 'Ten'; case Jack = 'Jack'; case Queen = 'Queen'; case King = 'King'; case Ace = 'Ace'; }
<?php // Cards/Card.php declare(strict_types=1); namespace Cards; use Cards\Enums\Suit; use Cards\Enums\Value; final readonly class Card { public function __construct( public Suit $suit, public Value $value, ) {} }
<?php // Cards/CardCollection.php declare(strict_types=1); namespace Cards; use Illuminate\Support\Collection; use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use Thunk\Verbs\SerializedByVerbs; class CardCollection extends Collection implements SerializedByVerbs { public static function deserializeForVerbs(mixed $data, DenormalizerInterface $denormalizer): static { return static::make($data) ->map(fn($serialized) => Card::deserializeForVerbs($serialized, $denormalizer)); } public function serializeForVerbs(NormalizerInterface $normalizer): string|array { return $this->map(fn(Card $card) => $card->serializeForVerbs($normalizer))->toJson(); } }
<?php // Cards/Deck.php declare(strict_types=1); namespace Cards; use Cards\Enums\Suit; use Cards\Enums\Value; final class Deck { public CardCollection $cards; public function __construct() { $this->cards = CardCollection::make([]); collect(CardSuit::cases()) ->each(function (CardSuit $suit): void { collect(CardValue::cases()) ->each(function (CardValue $value) use ($suit): void { $this->cards->push(new Card($suit, $value)); }); }); $this->shuffle(); } public function shuffle(): void { $this->cards = $this->cards ->shuffle() ->reverse(); } public function deal(): ?Card { if (0 === $this->cards->count()) { return null; } return $this->cards->pop(); } public function remainingCards(): int { return $this->cards->count(); } }
위 내용은 카드 한 벌의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!