feat(game): add CardTile

This commit is contained in:
Kieran Kihn
2025-11-15 23:08:11 +08:00
parent 60a058c930
commit f28af1978d
2 changed files with 210 additions and 0 deletions

100
src/game/CardTile.cpp Normal file
View File

@@ -0,0 +1,100 @@
/**
* @file CardTile.cpp
*
* @author Yuzhe Guo
* @date 2025.11.15
*/
#include "CardTile.h"
#include <algorithm>
#include <random>
#include "../common/utils.h"
namespace UNO::GAME {
CardTile::CardTile() = default;
template<typename... T>
void CardTile::pushFront(T... t)
{
cards_.emplace_front(t...);
}
template<typename... T>
void CardTile::pushBack(T... t)
{
cards_.emplace_back(t...);
}
Card CardTile::popFront()
{
const Card card = cards_.front();
cards_.pop_front();
return card;
}
Card CardTile::popBack()
{
const Card card = cards_.back();
cards_.pop_back();
return card;
}
bool CardTile::isEmpty() const
{
return cards_.empty();
}
void CardTile::shuffle()
{
std::random_device rd;
std::mt19937 gen(rd());
std::ranges::shuffle(cards_, COMMON::Utils::getInstance()->getRandom().getGenerator());
}
void CardTile::clear()
{
cards_.clear();
}
DiscardPile::DiscardPile() = default;
void DiscardPile::add(Card card)
{
this->pushFront(card);
}
Deck::Deck() = default;
void Deck::init()
{
for (const auto color : AllColors) {
for (const auto type : AllTypes) {
if (color != CardColor::WILD && type != CardType::WILD && type != CardType::WILDDRAWFOUR) {
this->pushBack(color, type);
}
}
}
for (int i = 0; i < 4; i++) {
this->pushBack(CardColor::WILD, CardType::WILD);
this->pushBack(CardColor::WILD, CardType::WILDDRAWFOUR);
}
this->shuffle();
}
Card Deck::draw()
{
if (this->isEmpty()) {
this->init();
}
return this->popFront();
}
std::vector<Card> Deck::draw(const size_t n)
{
std::vector<Card> draw_card;
for (size_t i = 0; i < n; i++) {
draw_card.push_back(this->draw());
}
return draw_card;
}
} // namespace UNO::GAME

110
src/game/CardTile.h Normal file
View File

@@ -0,0 +1,110 @@
/**
* @file CardTile.h
*
* 牌堆
*
* @author Yuzhe Guo
* @date 2025.11.15
*/
#ifndef UNO_GAME_CARDTILE_H
#define UNO_GAME_CARDTILE_H
#include <deque>
#include <vector>
#include "Card.h"
namespace UNO::GAME {
/**
* @brief 牌堆
*/
class CardTile {
private:
std::deque<Card> cards_;
protected:
/**
* 向牌堆前加入卡牌
* @param t 要加入的卡牌
*/
template<typename... T>
void pushFront(T... t);
/**
* 向牌堆后加入卡牌
* @param t 要加入的卡牌
*/
template<typename... T>
void pushBack(T... t);
/**
* 将牌堆中第一张牌删除
* @return 删除的牌
*/
Card popFront();
/**
* 将牌堆中最后一张牌删除
* @return 删除的牌
*/
Card popBack();
/**
* @return 牌堆是否为空
*/
[[nodiscard]] bool isEmpty() const;
/**
* 将牌堆中的卡牌随机洗混
*/
void shuffle();
/**
* 清空牌堆
*/
void clear();
public:
CardTile();
};
/**
* @brief 弃牌堆
*/
class DiscardPile : CardTile {
public:
DiscardPile();
/**
* 向弃牌堆中添加 @param card 卡牌
*/
void add(Card card);
};
/**
* @brief 起牌堆
*/
class Deck : CardTile {
public:
Deck();
/**
* 初始化牌堆
*/
void init();
/**
* 摸一张牌
* @return 摸到的牌
*/
Card draw();
/**
* 摸 n 张牌
* @param n 摸牌的张数
* @return 摸到的牌
*/
std::vector<Card> draw(size_t n);
};
}
#endif //UNO_GAME_CARDTILE_H