diff --git a/src/game/GameState.cpp b/src/game/GameState.cpp index 5d2981b..2b701c7 100644 --- a/src/game/GameState.cpp +++ b/src/game/GameState.cpp @@ -157,4 +157,19 @@ namespace UNO::GAME { this->nextPlayer(); return cards; } + + void ServerGameState::reset() + { + discardPile_.clear(); + isReversed_ = false; + drawCount_ = 0; + + for (auto &player : players_) { + while (!player.isEmpty()) { + player.play(*player.getCards().begin()); + } + } + + currentPlayer_ = players_.begin(); + } } // namespace UNO::GAME \ No newline at end of file diff --git a/src/game/GameState.h b/src/game/GameState.h index 15aca2c..fa0aabc 100644 --- a/src/game/GameState.h +++ b/src/game/GameState.h @@ -359,6 +359,11 @@ namespace UNO::GAME { * 由于用户摸牌而改变状态 */ std::vector updateStateByDraw() override; + + /** + * 重置游戏状态(用于重新开始) + */ + void reset(); }; } // namespace UNO::GAME diff --git a/src/server/UnoServer.cpp b/src/server/UnoServer.cpp index 812f464..99e2b1a 100644 --- a/src/server/UnoServer.cpp +++ b/src/server/UnoServer.cpp @@ -90,11 +90,41 @@ namespace UNO::SERVER { void UnoServer::handlePlayCard(size_t playerId, GAME::Card card) { this->serverGameState_.updateStateByCard(card); + + // 检查是否有玩家获胜(手牌为空) + bool gameEnded = false; + for (const auto &player : this->serverGameState_.getPlayers()) { + if (player.isEmpty()) { + gameEnded = true; + break; + } + } + NETWORK::PlayCardPayload payload = {card}; auto message = NETWORK::MessageSerializer::serialize({NETWORK::MessageStatus::OK, NETWORK::MessagePayloadType::PLAY_CARD, payload}); for (size_t i = 0; i < playerCount; i++) { this->networkServer_.send(gameIdToNetworkId.at(i), message); } + + if (gameEnded) { + this->handleEndGame(); + } + } + + void UnoServer::handleEndGame() + { + NETWORK::EndGamePayload payload{}; + auto message = NETWORK::MessageSerializer::serialize({NETWORK::MessageStatus::OK, NETWORK::MessagePayloadType::END_GAME, payload}); + + for (size_t i = 0; i < playerCount; i++) { + this->networkServer_.send(gameIdToNetworkId.at(i), message); + } + + this->serverGameState_.reset(); + + for (size_t i = 0; i < playerCount; i++) { + this->isReadyToStart[i] = false; + } } void UnoServer::run() diff --git a/src/server/UnoServer.h b/src/server/UnoServer.h index 53af658..1bee331 100644 --- a/src/server/UnoServer.h +++ b/src/server/UnoServer.h @@ -46,6 +46,11 @@ namespace UNO::SERVER { */ void handlePlayCard(size_t playerId, GAME::Card card); + /** + * 处理游戏结束事件 + */ + void handleEndGame(); + public: explicit UnoServer(uint16_t port = 10001);