Пролог - получить X возможных карт из колоды

Я пишу программу для игры в покер на Прологе, и я помогу вам. Я хочу, чтобы компьютер проверил, какие руки он еще мог получить с картами, которые уже лежат на столе и в его руке. Для этого мне нужно заполнить оставшиеся карты картами из колоды.

Пример: флоп (3 карты) уже на столе, 2 карты на руках у игроков, 2 карты осталось добрать. Это означает, что компьютеру нужно проверить, какие руки он мог бы получить, объединив свои 2 скрытые карты и 3 открытые карты с 2 другими картами, еще не разыгранными (включая карты других игроков, потому что он их не знает, это не проблема). сделать для меня).

Таким образом, если ему нужны 2 карты для стрита, компьютер должен проверить, остались ли в этом пуле 2 карты, удовлетворяющие условию.

Поскольку у меня уже есть записанные правила для рук, мне осталось написать правило, которое возвращает мне карты, уже находящиеся в руке компьютера и на столе, плюс x карт из пула. И это правило должно возвращать ВСЮ возможную комбинацию этих карт (правда, не все сразу).

Список возможных оставшихся карт будет выглядеть так: list = [card(Color,Value),card(Color,Value),...]

Кто-нибудь здесь есть идея о том, как это сделать?


person Toralf Schneider    schedule 30.12.2012    source источник
comment
(не ответ на ваш вопрос, следовательно, комментарий)... обратите внимание, что с двумя предстоящими картами и двумя неизвестными картами в руке он всегда может собрать каре (просто дайте ему карманную пару с карты, которую еще не видели ни на флопе, ни в вашей руке). Он также всегда может собрать стрит и стрит-флеш. Таким образом, вы почти всегда сможете, как вы написали, выполнить условие. Или, говоря так: дайте мне любой флоп и дайте мне выбрать свою руку, а также терн и ривер, и я соберу стрит-флеш.   -  person TacticalCoder    schedule 03.01.2013


Ответы (1)


Я не уверен, что понимаю тонкости нашей проблемы, но в целом похоже, что вы хотите использовать операции над множествами, чтобы выяснить, что в колоде.

Я настоятельно рекомендую использовать библиотеку упорядоченных наборов, если вы используете swi-prolog, для повышения производительности. Это потребует сортировки ваших входных данных.

Для начала сделайте набор из 52 карт.

Каждый раз, когда компьютерный игрок видит карту, он удаляет ее из набора.

Тогда есть правило

combination_fullfills_hand(HandSoFar, CardsRemaining, CardsINeed) :-
        length(HandSoFar, HandSize),
        NeedN is 5 - HandSize,
        length(CardsDrawn, NeedN), % done first for speed
        ord_subset(CardsDrawn, CardsRemaining),
        ord_union(CardsDrawn, HandSoFar, CompleteHand),
        hand_can_win(CompleteHand).

hand_can_win будет испробован с каждой рукой размера 5, которая может быть составлена ​​из HandSoFar (карты, которые вы уже держите в руке) и CardsRemaining (карты, которые можно взять)

Эй, а где петли? Вы можете быть удивлены. Если это так, то «петля» состоит в том, что ord_subset оставляет точки выбора, а hand_can_win может потерпеть неудачу. 8cD

person Anniepoo    schedule 31.12.2012
comment
Хм.. Я пытался понять, как это работает, особенно ord_subset. Итак, я попробовал это: длина (X, 1), ord_subset (X, [1,2,3,4]). и я получил ложь в ответ. Вы уверены, что это работает? Кроме того, CardsINeed никогда не используется. - person Toralf Schneider; 31.12.2012
comment
@Toralf Schneider: я думаю, что CardsINeed следует переименовать в CardsDrawn - person CapelliC; 31.12.2012
comment
Да, моя ошибка, CardsINeed был бы CardsDrawn - person Anniepoo; 01.01.2013