Maison  >  Article  >  développement back-end  >  Un jeu de cartes

Un jeu de cartes

Linda Hamilton
Linda Hamiltonoriginal
2024-11-03 21:52:03582parcourir

A deck of cards

J'ai travaillé ces derniers temps avec Verbs et Livewire et j'ai pensé qu'une expérience amusante serait d'essayer de créer des jeux de cartes auxquels j'aime jouer.

Pour faciliter cela, je dois définir un jeu de cartes que je peux utiliser dans n'importe lequel des projets sur lesquels je travaille par la suite.

Le jeu de cartes doit contenir une classe Card, Deck et CardCollection. Une carte doit avoir une couleur et une valeur, et le jeu doit être composé de 52 cartes. Parce que les couleurs et les valeurs sont toutes définies pour un jeu de cartes, je peux utiliser des énumérations pour les propriétés d'une carte.

La classe CardCollection me permet de stocker une collection de cartes en toute sécurité dans un état Verbes.

<?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();
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn