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);
}
size_t ClientGameState::getSelfId() const
{
return this->self_ - this->players_.begin();
}
void ClientGameState::nextPlayer()
{

View File

@@ -159,9 +159,9 @@ namespace UNO::GAME {
[[nodiscard]] const std::vector<PlayerStateType> &getPlayers() const;
/**
* @return 当前玩家对应的 iterator
* @return 当前玩家对应的 ID
*/
[[nodiscard]] std::vector<PlayerStateType>::iterator getCurrentPlayer() const;
[[nodiscard]] size_t getCurrentPlayerId() const;
/**
* @return 弃牌堆
@@ -206,9 +206,9 @@ namespace UNO::GAME {
}
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>

View File

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