1

我正在用 Prolog 编写一个扑克程序,我需要你的帮助。我想让电脑检查一下,他还能拿到什么样的牌,而他已经躺在桌子上和手里了。为此,我需要用牌组中的牌填充剩余的牌。

示例:翻牌(3 张牌)已经在桌面上,2 张牌在玩家手中,还有 2 张牌可以抽。这意味着计算机需要检查他可以通过将他的 2 张隐藏牌和 3 张公开牌与其他 2 张尚未抽出的牌(包括其他玩家牌,因为他不认识他们,这没问题为我做)。

因此,如果他需要 2 张牌来获得顺子,那么如果池中还有 2 张满足条件的牌,计算机应该能够进行 ckeck。

因为我已经写下了手牌的规则,所以我剩下要做的就是写一个规则,把已经在电脑手上和桌子上的牌归还给我,再加上池中的 x 张牌。并且这条规则需要能够返回这些卡片的所有可能组合(但不是一次全部)。

可能的剩余卡片列表如下所示: list = [card(Color,Value),card(Color,Value),...]

这里有没有人有关于如何做到这一点的想法?

4

1 回答 1

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

于 2012-12-31T01:55:23.730 回答