refactor(game): replace player iterator with player ID in GameState functions

This commit is contained in:
Kieran Kihn
2025-12-10 21:43:53 +08:00
parent 8d9f76eab3
commit d1f87d8113
3 changed files with 10 additions and 7 deletions

View File

@@ -107,6 +107,10 @@ namespace UNO::GAME {
this->player_.setName(name); this->player_.setName(name);
} }
size_t ClientGameState::getSelfId() const
{
return this->self_ - this->players_.begin();
}
void ClientGameState::nextPlayer() void ClientGameState::nextPlayer()
{ {

View File

@@ -159,9 +159,9 @@ namespace UNO::GAME {
[[nodiscard]] const std::vector<PlayerStateType> &getPlayers() const; [[nodiscard]] const std::vector<PlayerStateType> &getPlayers() const;
/** /**
* @return 当前玩家对应的 iterator * @return 当前玩家对应的 ID
*/ */
[[nodiscard]] std::vector<PlayerStateType>::iterator getCurrentPlayer() const; [[nodiscard]] size_t getCurrentPlayerId() const;
/** /**
* @return 弃牌堆 * @return 弃牌堆
@@ -206,9 +206,9 @@ namespace UNO::GAME {
} }
template<PlayerStateTypeConcept PlayerStateType> template<PlayerStateTypeConcept PlayerStateType>
std::vector<PlayerStateType>::iterator GameState<PlayerStateType>::getCurrentPlayer() const size_t GameState<PlayerStateType>::getCurrentPlayerId() const
{ {
return this->currentPlayer_; return this->currentPlayer_ - this->players_.begin();
} }
template<PlayerStateTypeConcept PlayerStateType> template<PlayerStateTypeConcept PlayerStateType>

View File

@@ -46,8 +46,7 @@ namespace UNO::SERVER {
throw std::invalid_argument("Invalid message payload type from client"); throw std::invalid_argument("Invalid message payload type from client");
} }
if (this->serverGameState_.getServerGameStage() == GAME::ServerGameStage::IN_GAME if (this->serverGameState_.getServerGameStage() == GAME::ServerGameStage::IN_GAME
&& this->networkIdToGameId.at(playerId) && this->networkIdToGameId.at(playerId) != this->serverGameState_.getCurrentPlayerId()) {
!= this->serverGameState_.getCurrentPlayer() - this->serverGameState_.getPlayers().begin()) {
throw std::invalid_argument("Invalid player message: not this player's turn"); throw std::invalid_argument("Invalid player message: not this player's turn");
} }
if (playerMessage.getMessagePayloadType() == NETWORK::MessagePayloadType::DRAW_CARD) { if (playerMessage.getMessagePayloadType() == NETWORK::MessagePayloadType::DRAW_CARD) {
@@ -67,7 +66,7 @@ namespace UNO::SERVER {
for (const auto &player : serverGameState_.getPlayers()) { for (const auto &player : serverGameState_.getPlayers()) {
players.emplace_back(player.getName(), player.getRemainingCardCount(), player.getIsUno()); players.emplace_back(player.getName(), player.getRemainingCardCount(), player.getIsUno());
} }
size_t currentPlayerIndex = static_cast<size_t>(serverGameState_.getCurrentPlayer() - serverGameState_.getPlayers().begin()); size_t currentPlayerIndex = serverGameState_.getCurrentPlayerId();
for (size_t i = 0; i < playerCount; i++) { for (size_t i = 0; i < playerCount; i++) {
NETWORK::InitGamePayload payload = { NETWORK::InitGamePayload payload = {
i, players, serverGameState_.getDiscardPile(), serverGameState_.getPlayers()[i].getCards(), currentPlayerIndex}; i, players, serverGameState_.getDiscardPile(), serverGameState_.getPlayers()[i].getCards(), currentPlayerIndex};