From 2dfced2501d5635c3da3904409190e90364982d5 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Sun, 23 May 2021 14:49:58 +0200 Subject: [PATCH] Hearts: Let the AI prefer lead cards for which other cards are in play When picking a lead card the AI should avoid playing cards where it knows that no other player has a lower value card of the same type. --- Userland/Games/Hearts/Game.cpp | 5 ++++- Userland/Games/Hearts/Player.cpp | 17 ++++++++++++++--- Userland/Games/Hearts/Player.h | 2 +- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Userland/Games/Hearts/Game.cpp b/Userland/Games/Hearts/Game.cpp index d17fa9097b..2b661630dd 100644 --- a/Userland/Games/Hearts/Game.cpp +++ b/Userland/Games/Hearts/Game.cpp @@ -210,7 +210,10 @@ size_t Game::pick_card(Player& player) auto prefer_card = [this, &player](Card& card) { return !other_player_has_lower_value_card(player, card) && other_player_has_higher_value_card(player, card); }; - return player.pick_lead_card(move(valid_card), move(prefer_card)); + auto lower_value_card_in_play = [this, &player](Card& card) { + return other_player_has_lower_value_card(player, card); + }; + return player.pick_lead_card(move(valid_card), move(prefer_card), move(lower_value_card_in_play)); } } auto* high_card = &m_trick[0]; diff --git a/Userland/Games/Hearts/Player.cpp b/Userland/Games/Hearts/Player.cpp index 4e3bd7839f..c36ee8e3cf 100644 --- a/Userland/Games/Hearts/Player.cpp +++ b/Userland/Games/Hearts/Player.cpp @@ -11,7 +11,8 @@ namespace Hearts { -size_t Player::pick_lead_card(Function valid_play, Function prefer_card) +size_t Player::pick_lead_card(Function valid_play, Function prefer_card, + Function lower_value_card_in_play) { struct CardWithIndex { RefPtr card; @@ -38,17 +39,27 @@ size_t Player::pick_lead_card(Function valid_play, Function Player::pick_low_points_high_value_card(Optional type) diff --git a/Userland/Games/Hearts/Player.h b/Userland/Games/Hearts/Player.h index d7737951fe..6f143f34a9 100644 --- a/Userland/Games/Hearts/Player.h +++ b/Userland/Games/Hearts/Player.h @@ -21,7 +21,7 @@ public: { } - size_t pick_lead_card(Function, Function); + size_t pick_lead_card(Function, Function, Function); Optional pick_low_points_high_value_card(Optional type = {}); Optional pick_lower_value_card(Card& other_card); Optional pick_slightly_higher_value_card(Card& other_card);