Prolog - 从一副牌中获得 X 个可能的牌
Posted
技术标签:
【中文标题】Prolog - 从一副牌中获得 X 个可能的牌【英文标题】:Prolog - get X possible cards from a deck 【发布时间】:2012-12-15 02:20:35 【问题描述】:我正在用 Prolog 编写一个扑克程序,我需要你的帮助。 我想让电脑检查一下,他还能拿到什么样的牌? 已经躺在桌子上,在他手里。为此,我需要用牌组中的牌填充剩余的牌。
示例:翻牌(3 张牌)已经在桌面上,2 张牌在玩家手中,还有 2 张牌可以抽。这意味着计算机需要检查他可以通过将他的 2 张隐藏牌和 3 张公开牌与其他 2 张尚未抽出的牌(包括其他玩家牌,因为他不认识他们,这没问题为我做)。
因此,如果他需要 2 张牌来获得顺子,那么如果池中还剩下 2 张满足条件的牌,计算机应该能够 ckeck。
既然我已经写下了手牌规则,我剩下要做的就是写一个规则,将电脑手中和桌子上的牌归还给我,再加上池中的 x 张牌。并且此规则需要能够返回这些卡片的所有可能组合(但不是一次全部)。
可能的剩余卡片列表如下所示: list = [card(Color,Value),card(Color,Value),...]
这里有没有人有关于如何做到这一点的想法?
【问题讨论】:
(不是你的问题的答案,因此是评论)...请注意,有两张牌来了,手里有两张未知的牌,他总能做出四边形(只要让他拿到一张在翻牌圈和你手中都没有出现过的牌的口袋对子)。他也总是可以做出顺子和同花顺。因此,基本上,正如您所写的,您几乎总是能够“满足条件”。或者,这样说:给我任何翻牌,让我选择我的手牌以及转牌和河牌,我会拿到同花顺。 【参考方案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 将尝试使用 HandSoFar(您已经持有的牌)和 CardsRemaining(可以抽出的牌)组成的每张 5 手牌
嘿,循环在哪里?你可能想知道。如果是这样,则“循环”是 ord_subset 留下选择点,而 hand_can_win 可能会失败。 8cD
【讨论】:
嗯.. 我试图了解这是如何工作的,尤其是 ord_subset。所以我尝试了这个:长度(X,1),ord_subset(X,[1,2,3,4])。我得到了“假”作为回报。你确定这行得通吗?此外,从未使用过“CardsINeed”。 @Toralf Schneider:我认为 CardsINeed 应该改名为 CardsDrawn 是的,我的错,CardsINeed 是 CardsDrawn以上是关于Prolog - 从一副牌中获得 X 个可能的牌的主要内容,如果未能解决你的问题,请参考以下文章