TEST (LayoutSamplingTest, GenerateSimpleLayout) { for (uint32_t iter = 0; iter < 100; iter++) { GameState gameState = GenLayout(); vector<shared_ptr<IPlayer>> players = { CreatePlayer("random", nullptr), CreatePlayer("random", nullptr), CreatePlayer("random", nullptr) }; GameManager manager(players); manager.SetNewLayout(gameState, /*openCards=*/true); manager.PlayForNMoves(15); auto sampler = LayoutSampler(manager.GetState(), gameState.GetFirstPlayer(), 0); auto newLayouts = sampler.DoSample(5, /*playMoveHistory=*/false); for (const auto& newLayout : newLayouts) { // 2. If suit is out for some player, cards of suit in sampled layout must be the same // 3. Moves in history must be in the player hands ASSERT_EQ(newLayout.Hand(0).Size(), 10); ASSERT_EQ(newLayout.Hand(1).Size(), 10); ASSERT_EQ(newLayout.Hand(2).Size(), 10); ASSERT_EQ(newLayout.Hand(0).Add(newLayout.Hand(1).Add(newLayout.Hand(2))).Size(), 30); for (uint32_t player = 0; player < 3; player++) { for (Suit suit = (Suit)0; (uint8_t)suit < 4; suit = (Suit)((uint8_t)suit + 1)) { if (manager.GetState().IsSuitOut(player, suit)) { ASSERT_EQ(newLayout.Hand(player).GetSubsetOfSuit(suit), gameState.Hand(player).GetSubsetOfSuit(suit)); } } } for (const auto moveData : manager.GetState().GetMoveHistory()) { ASSERT_TRUE(newLayout.Hand(moveData.player_).IsInSet(moveData.card_)); } } } }
static FeaturesSet CalcPlayFeatures(const GameState& playerView, Card move, uint32_t ourHero) { static PlayFeaturesRegistry reg; FeaturesSet result = reg.CreateEmptySet(); CardsSet knownCards = playerView.GetKnownCards(); auto setCardF = [&](FeaturesRange& fr, Card c, float value) { result.Set(fr, GetCardBit(c), value); }; for (Suit s = Spades; s != NoSuit; s = (Suit)(uint32_t(s) + 1)) { uint32_t realRank = 0; for (Rank r = 0; r < 8; ++r) { auto card = MakeCard(s, r); auto cardForFeature = card; //MakeCard(s, realRank); if (IsCardCovers(card, playerView.OnDesk(playerView.PlayerWithGreaterCard()), playerView.GetTrump())) { setCardF(reg.IsGreaterCard, cardForFeature, 1.0f); } setCardF(reg.IsValidMove, cardForFeature, playerView.IsValidMove(card) ? 1.0f : 0.0f); for (uint32_t i = 0, player = playerView.GetFirstPlayer(); i < 2; player = (player + 1) % 3, i++) { if (playerView.OnDesk(player) == card) { setCardF(reg.CardsOnDesk[i], cardForFeature, 1.0f); } } if (playerView.Hand(ourHero).IsInSet(card)) { setCardF(reg.PlayerCards[0], cardForFeature, 1.0f); } if (playerView.Out().IsInSet(card)) { setCardF(reg.NotInGameCards, cardForFeature, 1.0f); } realRank++; } } return result; }