Heim >Backend-Entwicklung >PHP-Tutorial >Ein Kartenspiel
Ich habe in letzter Zeit mit Verbs und Livewire gearbeitet und dachte, es wäre ein lustiges Experiment, einige Kartenspiele zu entwickeln, die ich gerne spiele.
Um dies zu ermöglichen, muss ich ein Kartenspiel definieren, das ich in allen Projekten verwenden kann, an denen ich danach arbeite.
Das Kartendeck muss eine Card-, Deck- und CardCollection-Klasse enthalten. Eine Karte sollte eine Farbe und einen Wert haben und das Deck sollte aus 52 Karten bestehen. Da alle Farben und Werte für ein Kartenspiel definiert sind, kann ich Enums für die Eigenschaften einer Karte verwenden.
Mit der CardCollection-Klasse kann ich eine Sammlung von Karten sicher im Verbs-Zustand speichern.
<?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(); } }
Das obige ist der detaillierte Inhalt vonEin Kartenspiel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!