Une partie de poker
Téléchargez le code du jeu de poker dans le dossier So-o :
- So-o
- Makefile
- So-o.h
- So-o.c
- OL.c
- Object.c
- ...
- poker
- Makefile
- poker.c
- Card.c
- Hand.c
- Deck.c
- ...
Dans le dossier So-o, assurez-vous que la librairie libso-o.a a été compilée :
$ cd So-o
$ make
...
ar rc libso-o.a So-o.o Object.o OL.o list.o alist.o Once.o Application.o Responder.o
Si vous souhaitez ajouter la librairie et les fichiers d'en-tête de So-o à votre système, tapez make install
.
Dans le sous-dossier poker, compilez l'exécutable poker
:
$ make
gcc -g -I.. -Wno-missing-braces -O -fstrength-reduce -finline-functions -fomit-frame-pointer -c poker.c
gcc -g -I.. -Wno-missing-braces -O -fstrength-reduce -finline-functions -fomit-frame-pointer -c Deck.c
gcc -g -I.. -Wno-missing-braces -O -fstrength-reduce -finline-functions -fomit-frame-pointer -c Hand.c
gcc -g -I.. -Wno-missing-braces -O -fstrength-reduce -finline-functions -fomit-frame-pointer -c Card.c
gcc -g poker.o Deck.o Hand.o Card.o ../libso-o.a -o poker
Exécutez le programme poker :
$ ./poker
3h,4h,4s,Jd,6c -> ONEPAIR
Keep (1-5...)? 23
Vous avez une paire. Le programme demande quelles cartes vous voulez garder. Entrez 23 pour garder la deuxième et la troisième carte et tirer 3 nouvelles cartes. Le programme affiche le résultat du second tirage :
Js,4h,4s,Ks,4c -> THREEOFKIND
Play or (q)uit?
Vous avez un brelan. Appuyez sur Entrée pour rejouer :
3c,Ah,2s,7d,3d -> ONEPAIR
Keep (1-5...)? 15
3c,5h,3s,5d,3d -> FULLHOUSE
Play or (q)uit? q
Entrez q pour quitter le programme.
CODE
- #include "So-o.h"
- #include "Card.h"
- #include "Hand.h"
- #include "Deck.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <regex.h>
Inclut les déclarations des fonctions de So-o et des constructeurs des classes Card, Hand et Deck.
- int main( int argc, char *argv[] ) {
- instance deck, hand;
- list keep = list_new();
- regex_t regexp;
- regmatch_t pmatch[2];
- regcomp(®exp, "([1-5])", REG_EXTENDED );
- char line[16], num[2];
- char *p, *beg, *end;
- int i;
La liste keep
sert à déterminer qu'elles cartes sont conservées entre les deux donnes d'un tour de jeu.
regexp
contient l'expression régulière utilisée pour extraire de la saisie un numéro de carte à conserver dans une donne.
- defclassCard();
- defclassHand();
- defclassDeck();
Définit les classes Card, Hand et Deck.
La classe Object est automatiquement définie pas la fonction defclass
si nécessaire.
- deck = sendmsg(Deck, "new", 1).p;
Crée un jeu de cartes qui est automatiquement mélangé quand toutes les cartes ont été tirées.
- for (;;) {
Joue un tour indéfiniment tant que l'utilisateur ne sort pas du jeu.
- }
- exit( 0 );
- }
Quitte le programme à la fin de la boucle principale.
- sendmsg(deck, "shuffle");
- hand = sendmsg(deck, "hand").p;
- sendmsg(hand, "print", 1);
À chaque tour, mélange le jeu de cartes, tire une main et l'affiche.
- printf("Keep (1-5...)? ");
- if (! fgets(line, sizeof (line), stdin))
- break;
Demande à l'utilisateur de choisir quelles cartes il veut conserver. Saisit la réponse.
- for (i = 0; i < 5; i++ )
- list_put(keep, i, 0);
Initialise la liste des cartes à conserver avec des valeurs négatives.
- p = line;
- while (*p) {
- if (regexec(®exp, p, 2, pmatch, 0) != 0 )
- break;
- if (pmatch[1].rm_so == -1)
- break;
- beg = p+pmatch[1].rm_so;
- end = p+pmatch[1].rm_eo;
- strncpy(num, beg, end-beg);
- i = atoi(num);
- list_put(keep, i-1, (void *)1);
- p = end;
- }
Extrait de la saisie des chiffres de 1 à 5 et marque les cartes correspondantes comme à converser.
- for (i = 0; i < 5; i++ ) {
- if (!list_get(keep, i))
- sendmsg(hand, "setCard", i+1, sendmsg(deck, "deal").p);
- }
Retire une main en conservant les cartes sélectionnées.
- sendmsg(hand, "print", 1);
Affiche la donne finale.
- printf("Play or (q)uit? ");
- if (! fgets(line, sizeof (line), stdin))
- break;
- for (p = line; *p == ' '; p++)
- ;
- if (*p == 'q' || *p == 'Q')
- break;
Demande à l'utilisateur s'il veut continuer à jouer ou quitter la partie. Quitte le programme si la réponse commence par q or Q ou si l'entrée est fermée.
Commentaires