From e7f74d98a1e2d8b6468029bd1788993006fb2ca6 Mon Sep 17 00:00:00 2001 From: lcw Date: Sat, 10 Feb 2024 23:05:07 +0800 Subject: [PATCH] finish #1 --- processor/logic/GameBoard.cpp | 52 ++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/processor/logic/GameBoard.cpp b/processor/logic/GameBoard.cpp index 39f5484..e018ba8 100644 --- a/processor/logic/GameBoard.cpp +++ b/processor/logic/GameBoard.cpp @@ -1,9 +1,8 @@ #include "GameBoard.h" #include -GameBoard::GameBoard(pos_t w, pos_t h, const InitInfo &info) - : n(info.n), t(0), players(info.n + 1), w(w), h(h), board(w * h) -{ +GameBoard::GameBoard(pos_t w, pos_t h, const InitInfo& info) + : n(info.n), t(0), players(info.n + 1), w(w), h(h), board(w * h) { for (std::uint8_t i = 1; i <= n; ++i) { players[i].id = i; players[i].team = info.player_team[i]; @@ -19,12 +18,12 @@ const Tile& GameBoard::at(pos_t x, pos_t y) const { return board[x * w + y]; } -bool GameBoard::attack(const PlayerMove &o) { +bool GameBoard::attack(const PlayerMove& o) { if (!o.isValid(w, h)) return false; - auto &sc_tile = at(o.x, o.y); - auto &tt_tile = at(o.tx(), o.ty()); + auto& sc_tile = at(o.x, o.y); + auto& tt_tile = at(o.tx(), o.ty()); if (sc_tile.owner != o.player) return false; @@ -34,7 +33,8 @@ bool GameBoard::attack(const PlayerMove &o) { auto moving_unit = o.half ? sc_tile.unit : sc_tile.unit / 2; sc_tile.unit -= moving_unit; auto isfriend = isTeammate(o.player, tt_tile.owner); - auto delta = isfriend ? moving_unit + tt_tile.unit : moving_unit - tt_tile.unit; + auto delta + = isfriend ? moving_unit + tt_tile.unit : moving_unit - tt_tile.unit; updatedPosition(o.x, o.y); updatedPosition(o.ty(), o.ty()); @@ -51,7 +51,7 @@ bool GameBoard::attack(const PlayerMove &o) { void GameBoard::capitalCaptured(Player tt, Player sc) { for (pos_t x = 0; x < h; ++x) { for (pos_t y = 0; y < w; ++y) { - auto &tile = at(x, y); + auto& tile = at(x, y); if (tile.owner != tt || tile.type == TileType::Capital) continue; @@ -69,11 +69,12 @@ bool GameBoard::isTeammate(Player x, Player y) const { void GameBoard::turnUpdate() { for (pos_t x = 0; x < h; ++x) { for (pos_t y = 0; y < w; ++y) { - auto &tile = at(x, y); + auto& tile = at(x, y); if (tile.owner == neutral_player) continue; - if (tile.type == TileType::Stronghold || tile.type == TileType::Capital) + if (tile.type == TileType::Stronghold + || tile.type == TileType::Capital) tile.unit += 1; if (tile.type == TileType::Swamp) { @@ -88,7 +89,7 @@ void GameBoard::turnUpdate() { void GameBoard::roundUpdate() { for (pos_t x = 0; x < h; ++x) { for (pos_t y = 0; y < w; ++y) { - auto &tile = at(x, y); + auto& tile = at(x, y); if (tile.owner == neutral_player) continue; tile.unit += 1; @@ -115,8 +116,11 @@ std::uint8_t GameBoard::numTeams() const { std::vector GameBoard::leaderboard() const { std::vector res(t); std::vector prank(n); + for (Player i = 1; i <= n; ++i) - prank[i - 1].player = i; + prank[i - 1].player = i, + prank[i - 1].is_defeated + = defeated_players.find(i) != defeated_players.end(); for (Team i = 1; i <= t; ++i) res[i - 1].team = i; @@ -131,12 +135,28 @@ std::vector GameBoard::leaderboard() const { } } -// for (auto &p : prank) { -// res[teamOf(p.player) - 1] - // TODO + for (const auto& p : prank) + res[teamOf(p.player) - 1].players.push_back(p); + for (auto& team : res) { + for (const auto& p : team.players) { + team.land += p.land; + team.unit += p.unit; + } + sort(team.players.begin(), + team.players.end(), + [](const PlayerRanking& a, const PlayerRanking& b) { + return a.unit != b.unit ? a.unit > b.unit + : a.player < b.player; + }); + } + sort(res.begin(), + res.end(), + [](const TeamRanking& a, const TeamRanking& b) { + return a.unit != b.unit ? a.unit > b.unit : a.team < b.team; + }); + return res; } PlayerState::PlayerState() { is_defeated = false; } -