From 5196de460af14abdf82c75117dd1c4a12516eb05 Mon Sep 17 00:00:00 2001 From: Kieran Kihn <114803508+kierankihn@users.noreply.github.com> Date: Sun, 7 Dec 2025 13:57:54 +0800 Subject: [PATCH] refactor(game): simplify card play logic - Replaced iterator-based `play` methods with a single card-based method. - Streamlined logic in `ServerPlayerState`, `ClientGameState`, and `HandCard`. --- src/game/GameState.cpp | 20 +++----------------- src/game/GameState.h | 10 ++-------- src/game/Player.cpp | 28 ++++++++++++++++++++++------ src/game/Player.h | 18 +++++++++++------- 4 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/game/GameState.cpp b/src/game/GameState.cpp index 7113cba..38e5146 100644 --- a/src/game/GameState.cpp +++ b/src/game/GameState.cpp @@ -56,11 +56,6 @@ namespace UNO::GAME { PlayerState::draw(n, cards); } - Card ClientPlayerState::play(const Card &card) - { - return PlayerState::play(card); - } - ServerPlayerState::ServerPlayerState(std::string name, size_t remainingCardCount, bool isUno) : PlayerState(std::move(name), remainingCardCount, isUno) { @@ -80,16 +75,7 @@ namespace UNO::GAME { Card ServerPlayerState::play(const Card &card) { - for (auto it = this->handCard_.getCards().begin();; it++) { - if (it == this->handCard_.getCards().end()) { - throw std::invalid_argument("Card not found in hand"); - } - if (card.getType() == it->getType() - && (card.getType() == CardType::WILD || card.getType() == CardType::WILDDRAWFOUR || card.getColor() == it->getColor())) { - this->handCard_.play(it); - break; - } - } + this->handCard_.play(card); return PlayerState::play(card); } @@ -121,9 +107,9 @@ namespace UNO::GAME { this->player_.draw(cards); } - Card ClientGameState::play(const std::multiset::iterator &it) + void ClientGameState::play(const Card &card) { - return this->player_.play(it); + this->player_.play(card); } bool ClientGameState::isEmpty() const diff --git a/src/game/GameState.h b/src/game/GameState.h index e54a406..a333d9b 100644 --- a/src/game/GameState.h +++ b/src/game/GameState.h @@ -75,11 +75,6 @@ namespace UNO::GAME { * @param cards 摸的牌 */ void draw(size_t n, const std::vector &cards) override; - - /** - * 出一张牌 - */ - Card play(const Card &card) override; }; /** @@ -337,10 +332,9 @@ namespace UNO::GAME { /** * 打出一张牌 - * @param it 要打出的手牌的迭代器 - * @return 打出的手牌 + * @param card 要打出的手牌 */ - Card play(const std::multiset::iterator &it); + void play(const Card &card); /** * @return 手牌是否为空 diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 27eab8d..321127f 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -6,6 +6,7 @@ */ #include "Player.h" +#include #include namespace UNO::GAME { @@ -28,11 +29,24 @@ namespace UNO::GAME { } } - Card HandCard::play(const std::multiset::iterator &it) + void HandCard::play(const std::multiset::iterator &it) { - const Card card = *it; - cards_.erase(it); - return card; + this->cards_.erase(it); + } + + + void HandCard::play(const Card &card) + { + for (auto it = cards_.begin();; it++) { + if (it == cards_.end()) { + throw std::invalid_argument("Card not found in hand"); + } + if (card.getType() == it->getType() + && (card.getType() == CardType::WILD || card.getType() == CardType::WILDDRAWFOUR || card.getColor() == it->getColor())) { + this->play(it); + break; + } + } } bool HandCard::isEmpty() const @@ -67,8 +81,10 @@ namespace UNO::GAME { return this->handCard_.isEmpty(); } - Card Player::play(const std::multiset::iterator &it) + void Player::play(const Card &card) { - return this->handCard_.play(it); + return this->handCard_.play(card); + } + } } // namespace UNO::GAME diff --git a/src/game/Player.h b/src/game/Player.h index d1ea3a6..ba89daf 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -8,7 +8,6 @@ */ #ifndef UNO_GAME_PLAYER_H #define UNO_GAME_PLAYER_H -#include #include #include @@ -22,6 +21,13 @@ namespace UNO::GAME { private: std::multiset cards_; + private: + /** + * 打出一张牌 + * @param it 要打出的手牌的迭代器 + */ + void play(const std::multiset::iterator &it); + public: explicit HandCard(); @@ -45,10 +51,9 @@ namespace UNO::GAME { /** * 打出一张牌 - * @param it 要打出的手牌的迭代器 - * @return 打出的手牌 + * @param card 要打出的手牌 */ - Card play(const std::multiset::iterator &it); + void play(const Card &card); /** * @return 手牌是否为空 @@ -92,10 +97,9 @@ namespace UNO::GAME { /** * 打出一张牌 - * @param it 要打出的手牌的迭代器 - * @return 打出的手牌 + * @param card 要打出的手牌 */ - Card play(const std::multiset::iterator &it); + void play(const Card &card); /** * @return 手牌是否为空