Domanda

Sto cercando di imparare Prolog. Questo sono i miei primi passi con questo linguaggio. Come esercizio Voglio programma di scrittura che possono riconoscere alcune mani di poker (scala a colore, Quattro di un genere, Full house, ecc.).

sto cercando buona rappresentanza carta in Prolog. Ho bisogno di avere la possibilità di controllare se una carta è più grande di loro, se le carte sono adatti e così uno.

Ho iniziato con il codice:

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.

che danno mi possibilità di controllare se rango A è più grande di quanto ad esempio J.

Ma io non sono sicuro di come rappresento singola scheda. Questa rappresentazione dovrebbe contiene rango di carta e anche l'esempio. C'è anche qualche problema con Ace perché Ace ha rango 14, ma può essere anche 1 in rettilineo.

Quindi la mia domanda è come rappresenta carte se voglio fare regole come:

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

o

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

Sono sicuro che questo è una specie di semplice domanda se si conosce la lingua, ma non è così facile pensare 'interruttore' da linguaggi come C o Python. : -)

È stato utile?

Soluzione

Si potrebbe rappresentare carte come i conti con la forma Rank-Suite.

Al fine di verificare se le carte provengono dalla stessa suite di definire un predicato:

same_suit(_-S, _-S).

È possibile utilizzare questo predicato per verificare se si dispone di un colore:

?- 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.

Al fine di rilevare se si dispone di una coppia, due coppie, tre di un genere, full, o quattro di un genere si può solo contare il numero di coppie nella mano e poi la mappa il risultato al nome della mano.

% 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).

esempi di utilizzo:

?- 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.

Altri suggerimenti

È possibile utilizzare unicode e SWI per rendere i programmi belle ...

:- 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(♠(_),♠(_),♠(_),♠(_),♠(_)).

Usa un elenco di coppie, card(rank, suite) per la mano. Definire predicati per contare il numero di volte che ogni rango si ripete in una mano, sorta inversamente dal conte, e si dispone di poker in [4,1], completa in [3,2], trio in [3|_], ecc Un po 'di lavoro con l'ordinamento e il conteggio rivelerà vampate e rettilinei. Invece di valori numerici, utilizzare le relazioni higher(a,b) e equal(a,b) che si applicano sia i ranghi e alle mani (e ai vestiti, se si applica questa regola).

Perché ci sono solo cinque le carte in una mano, si può farla franca con l'enumerazione delle possibilità invece che l'ordinamento ... la vostra scelta.

Nota. Ho tolto gli esempi di codice perché contenevano troppi errori di sintassi e di logica

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top