Frage

Ich versuche Prolog zu lernen. Dies sind meine ersten Schritte mit dieser Sprache. Als Übung möchte ich Schreibprogramm, das einige Poker-Hände (Straight Flush, Vierling, Full House etc.) Erkennen kann.

Ich suche gute Karte Darstellung in Prolog. Ich brauche Möglichkeit zu haben, zu überprüfen, ob eine Karte ist größer als andere, wenn Karten geeignet sind und so ein.

Ich habe mit Code gestartet:

rank(2).
rank(3).
rank(4).
rank(5).
rank(6).
rank(7).
rank(8).
rank(9).
rank(t).
rank(j).
rank(q).
rank(k).
rank(a).

value(2, 2).
value(3, 3).
value(4, 4).
value(5, 5).
value(6, 6).
value(7, 7).
value(8, 8).
value(9, 9).
value(t, 10).
value(j, 11).
value(q, 12).
value(k, 13).
value(a, 14).
%value(a, 1).

suite(d).
suite(h).
suite(c).
suite(s).

rank_bigger(X, Y) :-
               value(X, A),
               value(Y, B),
               A > B.

Die give mi Möglichkeit zu überprüfen, ob Rang A größer als zum Beispiel J ist.

Aber ich bin nicht sicher, wie einzelne Karte darzustellen. Diese Darstellung sollte enthält Rang-Karte und auch Anzug. Es gibt auch einige Probleme mit Ace, weil Ace hat Rang 14 aber auch 1 in gerade sein kann.

Also meine Frage ist, wie man stellt Karten, wenn ich Regeln machen will wie:

isStraight(C1, C2, C3, C4, C5) :- 
                                  [...]

oder

isStraightFlush(C1, C2, C3, C4, C5) :- 
                                       [...]

Ich bin sicher, dass diese Art der einfachen Frage ist, wenn Sie die Sprache kennen, aber es ist nicht so einfach zu ‚Schalter‘ Denken aus Sprachen wie C oder Python. : -)

War es hilfreich?

Lösung

Sie Karten als Begriffe mit dem Formular Rank-Suite darstellen könnten.

Um zu überprüfen, ob die Karten aus der gleichen Suite kommen definieren ein Prädikat:

same_suit(_-S, _-S).

Sie können dieses Prädikat verwenden zu überprüfen, ob Sie einen Flush haben:

?- Cards = [1-d, 2-d, 3-d, 4-d, 5-d], maplist(same_suit(_-S), Cards).
Cards = [1-d, 2-d, 3-d, 4-d, 5-d],
S = d.

Um zu erkennen, wenn Sie ein Paar, zwei Paare, Drilling, Full House oder vier eine Art können Sie nur die Anzahl der Zählung Paare in der Hand und dann Karte das Ergebnis auf den Namen der Hand.

% Count the number of pairs in the given list of cards.
count_pairs([], 0).

count_pairs([R-_ | Cs], Pairs) :-
    count_rank(R, Cs, RankCount),
    count_pairs(Cs, Pairs0),
    Pairs is RankCount + Pairs0.


% Count the number of cards with the given rank
count_rank(R, Cs, RankCount) :-
    count_rank(R, Cs, 0, RankCount).


count_rank(_, [], RankCount, RankCount) :- !.

count_rank(R, [R-_ | Cs], RankCount0, RankCount) :-
    !,
    RankCount1 is RankCount0 + 1,
    count_rank(R, Cs, RankCount1, RankCount).

count_rank(R, [_ | Cs], RankCount0, RankCount) :-
    count_rank(R, Cs, RankCount0, RankCount).


% Map the number of pairs to the name of the hand
pairs_hand(1, one_pair).
pairs_hand(2, two_pair).
pairs_hand(3, three_of_a_kind).
pairs_hand(4, full_house).
%pairs_hand(5, 'NOT POSSIBLE').
pairs_hand(6, four_of_a_kind).

Anwendungsbeispiele:

?- count_pairs([q-c, q-d, q-s, j-s, q-h], PairsCount), pairs_hand(PairsCount, Hand).
PairsCount = 6,
Hand = four_of_a_kind.

?- count_pairs([j-c, q-d, q-s, j-s, q-h], PairsCount), pairs_hand(PairsCount, Hand).
PairsCount = 4,
Hand = full_house.

?- count_pairs([j-c, q-d, q-s, j-s, 7-h], PairsCount), pairs_hand(PairsCount, Hand).
PairsCount = 2,
Hand = two_pair.

Andere Tipps

Sie können Unicode und SWI verwenden, um ziemlich Programme zu machen ...

:- op(200, xf, ♥).
:- op(200, xf, ♦).
:- op(200, xf, ♣).
:- op(200, xf, ♠).
:- op(200, xf, ♡).
:- op(200, xf, ♢).
:- op(200, xf, ♧).
:- op(200, xf, ♤).

main :- print([2♠,3♦,'K'♥,10♠,3♣]),
        isFlush(2♠,3♦,'K'♥,10♠,3♣).

isFlush(♥(_),♥(_),♥(_),♥(_),♥(_)).
isFlush(♦(_),♦(_),♦(_),♦(_),♦(_)).
isFlush(♣(_),♣(_),♣(_),♣(_),♣(_)).
isFlush(♠(_),♠(_),♠(_),♠(_),♠(_)).

Verwenden Sie eine Liste von Paaren, card(rank, suite) für die Hand. Definieren Prädikate die Anzahl der Male zu zählen, jeder Rang in einer Hand wiederholt, sortieren umgekehrt durch Zählung, und Sie haben Poker in [4,1], voll in [3,2], Trio in [3|_] usw. Ein wenig mehr Arbeit mit Sortieren und Zählen wird zeigen Wallungen und Straights. Anstelle von Zahlenwerten, die Verwendung Beziehungen higher(a,b) und equal(a,b), die für beiden Reihen anzuwenden und Hände (und zu den Klagen, wenn diese Regel gilt).

Da es nur fünf Karten in einer Hand sind, können Sie mit Aufzählen der Möglichkeiten weg statt Sortierung ... Ihre Wahl.

. Hinweis: ich die Codebeispiele entfernt, weil sie zu viele Syntax und logische Fehler enthalten

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top