1

私は Prolog でポーカー プログラムを書いています。あなたの助けを借りて。コンピューターにチェックしてもらいたいのですが、すでにテーブルの上にあり、彼の手の中にあるカードで、彼がまだどのようなハンドを獲得できるかを確認してください。これを行うには、デッキからのカードで残りのカードを埋める必要があります。

例: フロップ (3 枚のカード) が既にテーブルにあり、2 枚のカードがプレイヤーの手札にあり、2 枚のカードを引く必要があります。つまり、コンピューターは、2 枚の隠しカードと 3 枚のオープン カードと、まだ引かれていない他の 2 枚のカード (他のプレイヤーのカードを含む。彼はそれらを知らないため、これは問題ではない) を組み合わせることによって得られるハンドをチェックする必要があります。私のためにすること)。

したがって、彼がストレートに 2 枚のカードが必要な場合、そのプールに条件を満たす 2 枚のカードが残っている場合、コンピューターはチェックできるはずです。

私はすでにハンドのルールを書き留めているので、あとはコンピューターの手札とテーブルにあるカードと、プールからの x 枚のカードを返すルールを書くだけです。そして、このルールは、これらのカードのすべての可能な組み合わせを返すことができる必要があります (ただし、一度にすべてではありません)。

可能な残りのカードのリストは次のようになります: list = [card(Color,Value),card(Color,Value),...]

これを行う方法についてアイデアを持っている人はいますか?

4

1 に答える 1

1

私たちの問題の微妙な点を理解しているかどうかはわかりませんが、全体として、セット操作を使用してデッキに何があるかを把握したいようです。

パフォーマンスのために、swi-prolog を使用している場合は、順序付きセット lib を使用することを強くお勧めします。これには、入力をソートする必要があります。

最初に、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 に答える