From b8761d180907e139708d34dd2a28853754e21f86 Mon Sep 17 00:00:00 2001 From: Kieran Kihn <114803508+kierankihn@users.noreply.github.com> Date: Mon, 17 Nov 2025 15:24:21 +0800 Subject: [PATCH] fix(game): refactor `ServerPlayerState` and update `ServerGameState::updateStateByCard` logic - Replaced `handCard_` with `handCard` in `ServerPlayerState`. - Updated `updateStateByCard` in `ServerGameState` to handle card validation and player actions. - Made `updateStateByCard` virtual in `GameState`. --- src/game/GameState.cpp | 25 ++++++++++++++++++------- src/game/GameState.h | 14 ++++++++------ 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/game/GameState.cpp b/src/game/GameState.cpp index 4335f35..3c71536 100644 --- a/src/game/GameState.cpp +++ b/src/game/GameState.cpp @@ -47,20 +47,31 @@ namespace UNO::GAME { } ServerPlayerState::ServerPlayerState(std::string name, size_t remainingCardCount, bool isUno, HandCard *handCard) : - PlayerState(std::move(name), remainingCardCount, isUno), handCard_(handCard) + PlayerState(std::move(name), remainingCardCount, isUno), handCard(handCard) { } - template - void ServerPlayerState::draw(T... args) - { - this->handCard_->draw(args...); - } - ClientGameState::ClientGameState(GameStatus gameStatus, Player player) : GameState(gameStatus), player(std::move(player)) {} ServerGameState::ServerGameState() : GameState(GameStatus::WAITING_PLAYERS_TO_JOIN) {} + void ServerGameState::updateStateByCard(const Card &card) + { + if (this->discardPile_.isEmpty() == false && card.canBePlayedOn(this->discardPile_.getFront()) == false) { + throw std::invalid_argument("Card cannot be played"); + } + + const auto &handCardSet = this->getCurrentPlayer()->handCard->getCards(); + for (auto it = handCardSet.begin(); it != handCardSet.end(); it++) { + if (card.getType() == it->getType() && (card.getType() == CardType::WILD || card.getType() == CardType::WILDDRAWFOUR || card.getColor() == it->getColor())) { + this->getCurrentPlayer()->handCard->play(it); + } + } + + GameState::updateStateByCard(card); + } + + void ServerGameState::updateStateByDraw() { if (this->drawCount_ == 0) { diff --git a/src/game/GameState.h b/src/game/GameState.h index 3c05e30..855ab83 100644 --- a/src/game/GameState.h +++ b/src/game/GameState.h @@ -66,14 +66,10 @@ namespace UNO::GAME { * (供服务端使用)玩家状态 */ class ServerPlayerState : public PlayerState { - private: - HandCard *handCard_; - public: explicit ServerPlayerState(std::string name, size_t remainingCardCount, bool isUno, HandCard *handCard); - template - void draw(T... args); + HandCard *handCard; }; /** @@ -156,7 +152,7 @@ namespace UNO::GAME { * 由于用户出牌而改变状态 * @param card 用户出的牌 */ - void updateStateByCard(const Card &card); + void virtual updateStateByCard(const Card &card); /** * 由于用户摸牌而改变状态 @@ -287,6 +283,12 @@ namespace UNO::GAME { public: ServerGameState(); + /** + * 由于用户出牌而改变状态 + * @param card 用户出的牌 + */ + void updateStateByCard(const Card &card) override; + /** * 由于用户摸牌而改变状态 */