Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
AITradeUtility.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "AIUtility.hpp"
4#include "Actions.hpp"
5
6#include <array>
7#include <cstddef>
8#include <cstdint>
9#include <span>
10
11namespace monopoly::ai::trade
12{
14 {
15 std::array<rules::PlayerNumber, rules::MaxPlayers> players{};
16 std::size_t count{};
17 };
18
19 using PropertySets = std::array<
22
23 inline constexpr std::size_t DeckCount =
24 static_cast<std::size_t>(rules::DeckType::Count);
25
27 {
30 std::int64_t cashReceived{};
31 std::int64_t cashGiven{};
32 std::array<bool, DeckCount> jailCardGiven{};
33 std::array<bool, DeckCount> jailCardReceived{};
34
35 bool operator==(const TradeProposalRecord&) const = default;
36 };
37
38 using TradeProposalList = std::array<
40
51
52 using FutureImmunityList = std::array<
54
58 std::span<const rules::PlayerNumber> candidates,
59 const PropertySets& properties) noexcept;
60 [[nodiscard]] std::int64_t transferTax(
62 rules::board::PropertySet properties) noexcept;
64 rules::board::PropertySet properties) noexcept;
68 rules::board::SquareType square) noexcept;
69
70 enum class MonopolyTradeDecision : std::uint8_t
71 {
72 Avoid = 0,
73 Required = 1,
74 Maybe = 2
75 };
76
77 enum class MonopolySortOrder : std::uint8_t
78 {
79 Ascending = 0,
81 Random
82 };
83
84 [[nodiscard]] std::array<rules::board::SquareGroup, 8> orderMonopolyImportance(
85 std::int64_t liquidAssets,
87 std::span<const std::uint32_t> randomKeys = {}) noexcept;
88
102
104 {
105 double importance{};
108 };
109
110 [[nodiscard]] PropertyImportanceResult findPlayerPropertyImportance(
111 const rules::GameState& state,
112 rules::PlayerNumber player,
114 const PropertyImportanceConfig& config,
115 std::int64_t moneyOwed = 0) noexcept;
116
118 const rules::GameState& before,
119 const rules::GameState& after,
120 rules::PlayerNumber player,
121 rules::PlayerNumber strategyPlayer,
124 const PropertyImportanceConfig& config,
125 std::span<const std::int64_t> moneyOwed = {}) noexcept;
126
128 const rules::GameState& state,
129 rules::PlayerNumber player) noexcept;
130
132 const rules::GameState& state,
133 rules::PlayerNumber player,
134 std::span<const std::int64_t> moneyOwed = {}) noexcept;
136 const rules::GameState& state,
137 rules::PlayerNumber player) noexcept;
139 const rules::GameState& state,
140 rules::PlayerNumber player,
141 rules::PlayerNumber excludedPlayer = rules::NobodyPlayer) noexcept;
142
143 enum class StrategicPropertyImportance : std::uint8_t
144 {
145 NotImportant = 0,
147 AllowsTrade = 2,
148 CashCow = 3
149 };
150
152 const rules::GameState& state,
156 rules::PlayerNumber purchasingPlayer = rules::NobodyPlayer,
157 rules::board::SquareType purchasingProperty = rules::board::SquareType::Count) noexcept;
159 std::span<const std::int64_t> timeLastTrade,
160 std::size_t maxTrades) noexcept;
161
162 inline constexpr std::uint8_t TradeSomewhatImportant = 1u << 0;
163 inline constexpr std::uint8_t TradeDesperate = 1u << 1;
164 inline constexpr std::uint8_t TradeForCash = 1u << 2;
165 inline constexpr std::uint8_t TradeGiveMonopoly = 1u << 3;
166
178
179 [[nodiscard]] bool shouldTrade(
180 const rules::GameState& state,
181 rules::PlayerNumber player,
182 std::uint8_t importance,
183 std::span<const std::int64_t> timeLastTrade,
184 std::size_t maxTrades,
185 const TradeCadenceInputs& inputs) noexcept;
186
188 {
189 std::array<int, rules::MaxPlayers> playerIndex{};
191 std::array<rules::PlayerNumber, rules::MaxPlayers> tradePlayers{};
192 std::size_t tradePlayerCount{};
194 };
195
196 [[nodiscard]] PlayerPropertyAttitudeList createPlayerPropertyAttitudeList(
197 const rules::GameState& state,
198 rules::PlayerNumber player,
200 std::span<const double> playerAttitudes) noexcept;
201
202 enum class PropertyClassification : std::uint8_t
203 {
204 None = 0,
205 One = 1,
206 Two,
207 Three,
208 Four,
209 Five,
210 Six,
211 Worst = 10,
212 Best = 11
213 };
214
223
224 inline constexpr std::size_t WhatToTradeEntries = 20;
225 using WhatToTradeTable = std::array<MonopolyTradeGenerosity, WhatToTradeEntries>;
226
228 const rules::GameState& state,
229 rules::PlayerNumber toPlayer,
230 rules::board::PropertySet& properties,
233 std::int64_t moneyOwed = 0) noexcept;
234
236
238 {
239 Monopoly = 0,
240 Trade,
243 Railroad,
244 Utility,
245 Count,
246 Junk
247 };
248
254
255 using TradeImportanceList = std::array<TradeImportanceRecord, 6>;
256
258 const rules::GameState& state,
259 rules::PlayerNumber player,
263 const CashMultiplierTable& multipliers) noexcept;
264
265 [[nodiscard]] bool addTypeProperty(
266 const rules::GameState& before,
267 const rules::GameState& after,
268 rules::PlayerNumber player,
273 const PropertySets& properties,
274 bool giveDescending,
275 const WhatToTradeTable& whatToTrade,
277 std::int64_t playerMoneyOwed = 0) noexcept;
278
280 {
281 std::array<rules::board::PropertySet, rules::MaxPlayers> bit1{};
282 std::array<rules::board::PropertySet, rules::MaxPlayers> bit2{};
283 };
284
286 PropertyTradeMemory& memory,
287 rules::PlayerNumber proposedPlayer,
288 const TradeProposalRecord& proposal) noexcept;
290 const PropertyTradeMemory& memory,
291 rules::PlayerNumber proposedPlayer,
292 const TradeProposalRecord& proposal,
293 int dangerLevel) noexcept;
294 void forgetTradedProperties(PropertyTradeMemory& memory) noexcept;
295
296 [[nodiscard]] double cashMultiplier(
297 double attitude,
298 const CashMultiplierTable& multipliers) noexcept;
299
301 const TradeProposalRecord& proposal) noexcept;
303 const TradeProposalList& proposals) noexcept;
304 [[nodiscard]] bool tradeIsProper(
305 const rules::GameState& state,
307 std::span<const FutureImmunityRecord> immunities = {}) noexcept;
308 void makeTradeProper(
309 const rules::GameState& state,
311 std::span<const FutureImmunityRecord> immunities = {}) noexcept;
313 rules::GameState& state,
314 const TradeProposalList& proposals) noexcept;
315 [[nodiscard]] bool isMonopolyTrade(
316 const rules::GameState& state,
317 const TradeProposalList& proposals) noexcept;
319 rules::PlayerNumber player,
320 std::span<const FutureImmunityRecord> immunities) noexcept;
321 enum class ProposedTradeSendStatus : std::uint8_t
322 {
323 InvalidInput = 0,
324 Busy,
327 Ready,
329 };
330
338
339 inline constexpr std::size_t MaxProposedTradeSendActions =
341 ((2 * rules::MaxPlayers) - 1) +
342 static_cast<std::size_t>(rules::board::SquareType::InJail) +
343 DeckCount + 1;
344
346 {
348 std::array<actions::Message, MaxProposedTradeSendActions> actions{};
349 std::size_t count{};
350
356 };
357
358 [[nodiscard]] ProposedTradeSendPlan buildProposedTradeSendPlan(
359 const rules::GameState& state,
360 rules::PlayerNumber player,
362 const ProposedTradeSendInputs& inputs) noexcept;
363
364 [[nodiscard]] bool addTradeItem(
366 FutureImmunityList& immunities,
368 std::int64_t amount,
369 rules::PlayerNumber fromPlayer,
370 rules::PlayerNumber toPlayer,
372
373}
unsigned state
unsigned index
Kind kind
std::int64_t transferTax(const rules::GameState &state, rules::board::PropertySet properties) noexcept
void rememberTradedProperties(PropertyTradeMemory &memory, rules::PlayerNumber proposedPlayer, const TradeProposalRecord &proposal) noexcept
int findFreeTradeSpot(std::span< const std::int64_t > timeLastTrade, std::size_t maxTrades) noexcept
void forgetTradedProperties(PropertyTradeMemory &memory) noexcept
double cashMultiplier(double attitude, const CashMultiplierTable &multipliers) noexcept
PlayerPropertyAttitudeList createPlayerPropertyAttitudeList(const rules::GameState &state, rules::PlayerNumber player, const TradeProposalList &proposals, std::span< const double > playerAttitudes) noexcept
rules::PlayerNumber nextPlayerWantingCash(const TradeProposalList &proposals) noexcept
constexpr std::size_t DeckCount
std::array< TradeImportanceRecord, 6 > TradeImportanceList
ProposedTradeSendPlan buildProposedTradeSendPlan(const rules::GameState &state, rules::PlayerNumber player, const TradeProposalList &proposals, const ProposedTradeSendInputs &inputs) noexcept
constexpr std::uint8_t TradeForCash
bool tradeIsProper(const rules::GameState &state, const TradeProposalList &proposals, std::span< const FutureImmunityRecord > immunities) noexcept
rules::board::PropertySet propertiesAlreadyTraded(const PropertyTradeMemory &memory, rules::PlayerNumber proposedPlayer, const TradeProposalRecord &proposal, int dangerLevel) noexcept
bool playerInvolvedInTrade(const TradeProposalRecord &proposal) noexcept
constexpr std::uint8_t TradeSomewhatImportant
std::array< rules::board::SquareGroup, 8 > orderMonopolyImportance(std::int64_t liquidAssets, MonopolySortOrder order, std::span< const std::uint32_t > randomKeys) noexcept
int vetoMonopolies(rules::board::PropertySet properties) noexcept
MonopolyTradeGroup findSmallestMonopolyTrade(rules::PlayerNumber player, rules::board::PropertySet monopoly, std::span< const rules::PlayerNumber > candidates, const PropertySets &properties) noexcept
std::array< MonopolyTradeGenerosity, WhatToTradeEntries > WhatToTradeTable
PropertyImportanceResult findPlayerPropertyImportance(const rules::GameState &state, rules::PlayerNumber player, rules::PlayerNumber strategyPlayer, const PropertyImportanceConfig &config, std::int64_t moneyOwed) noexcept
constexpr std::uint8_t TradeDesperate
constexpr std::uint8_t TradeGiveMonopoly
TradeImportanceList createItemImportanceList(const rules::GameState &state, rules::PlayerNumber player, rules::PlayerNumber strategyPlayer, const PropertyImportanceConfig &config, double strategyAttitudeTowardPlayer, const CashMultiplierTable &multipliers) noexcept
bool addTypeProperty(const rules::GameState &before, const rules::GameState &after, rules::PlayerNumber player, rules::PlayerNumber strategyPlayer, rules::board::PropertySet &combinedProperties, TradeImportanceItem item, TradeProposalList &proposals, const PropertySets &properties, bool giveDescending, const WhatToTradeTable &whatToTrade, double strategyAttitudeTowardPlayer, std::int64_t playerMoneyOwed) noexcept
bool addTradeItem(TradeProposalList &proposals, FutureImmunityList &immunities, rules::TradeItemKind kind, std::int64_t amount, rules::PlayerNumber fromPlayer, rules::PlayerNumber toPlayer, rules::board::PropertySet propertySet) noexcept
std::array< double, WhatToTradeEntries > CashMultiplierTable
bool isMonopolyTrade(const rules::GameState &state, const TradeProposalList &proposals) noexcept
std::array< FutureImmunityRecord, rules::MaxCountHitSets > FutureImmunityList
constexpr std::size_t MaxProposedTradeSendActions
void makeTradeProper(const rules::GameState &state, TradeProposalList &proposals, std::span< const FutureImmunityRecord > immunities) noexcept
bool onlyPlayerHasMonopoly(const rules::GameState &state, rules::PlayerNumber player) noexcept
void applyTradeToState(rules::GameState &state, const TradeProposalList &proposals) noexcept
bool addTradeMonopoly(const rules::GameState &state, rules::PlayerNumber toPlayer, rules::board::PropertySet &properties, PropertyClassification type, TradeProposalList &proposals, std::int64_t moneyOwed) noexcept
bool shouldTrade(const rules::GameState &state, rules::PlayerNumber player, std::uint8_t importance, std::span< const std::int64_t > timeLastTrade, std::size_t maxTrades, const TradeCadenceInputs &inputs) noexcept
std::array< rules::board::PropertySet, rules::MaxPlayers > PropertySets
bool playerHasFutureOrImmunity(rules::PlayerNumber player, std::span< const FutureImmunityRecord > immunities) noexcept
std::array< TradeProposalRecord, rules::MaxPlayers > TradeProposalList
int possibleMonopoly(const rules::GameState &state, rules::PlayerNumber owner, rules::board::SquareType square) noexcept
MonopolyTradeDecision shouldTradeForMonopoly(const rules::GameState &state, rules::PlayerNumber player) noexcept
double calculateTradePropertyImportance(const rules::GameState &before, const rules::GameState &after, rules::PlayerNumber player, rules::PlayerNumber strategyPlayer, const TradeProposalList &proposals, bool givingMonopolyAway, const PropertyImportanceConfig &config, std::span< const std::int64_t > moneyOwed) noexcept
constexpr std::size_t WhatToTradeEntries
bool hasMonopolyTrade(const rules::GameState &state, rules::PlayerNumber player, rules::PlayerNumber excludedPlayer) noexcept
rules::PlayerNumber findNonmonopolyPlayer(const rules::GameState &state, rules::PlayerNumber player, std::span< const std::int64_t > moneyOwed) noexcept
StrategicPropertyImportance strategicPropertyImportance(const rules::GameState &state, rules::board::SquareType property, rules::PlayerNumber excludedPlayer, rules::PlayerNumber includedPlayer, rules::PlayerNumber purchasingPlayer, rules::board::SquareType purchasingProperty) noexcept
std::int64_t liquidAssets(const rules::GameState &state, rules::PlayerNumber player, bool countHouses, bool countMonopolies, std::int64_t moneyOwed) noexcept
std::uint32_t PropertySet
std::uint8_t PlayerNumber
Definition RuleTypes.hpp:12
constexpr std::size_t MaxCountHitSets
Definition RuleTypes.hpp:53
constexpr PlayerNumber MaxPlayers
Definition RuleTypes.hpp:14
constexpr PlayerNumber NobodyPlayer
Definition RuleTypes.hpp:16
bool operator==(const FutureImmunityRecord &) const =default
std::array< rules::PlayerNumber, rules::MaxPlayers > players
std::array< int, rules::MaxPlayers > playerIndex
std::array< rules::PlayerNumber, rules::MaxPlayers > tradePlayers
std::array< actions::Message, MaxProposedTradeSendActions > actions
rules::board::PropertySet propertiesGiven
rules::board::PropertySet propertiesReceived
std::array< bool, DeckCount > jailCardGiven
bool operator==(const TradeProposalRecord &) const =default
std::array< bool, DeckCount > jailCardReceived