1
10

Une partie de poker

Téléchargez le code du jeu de poker dans le dossier So-o :

  1. So-o
    1. Makefile
    2. So-o.h
    3. So-o.c
    4. OL.c
    5. Object.c
    6. ...
    7. poker
      1. Makefile
      2. poker.c
      3. Card.c
      4. Hand.c
      5. Deck.c
      6. ...

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
  1. #include "So-o.h"
  2.  
  3. #include "Card.h"
  4. #include "Hand.h"
  5. #include "Deck.h"
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9.  
  10. #include <string.h>
  11. #include <regex.h>

Inclut les déclarations des fonctions de So-o et des constructeurs des classes Card, Hand et Deck.

  1. int main( int argc, char *argv[] ) {
  2.     instance deck, hand;
  3.     list keep = list_new();
  4.  
  5.     regex_t regexp;
  6.     regmatch_t pmatch[2];
  7.  
  8.     regcomp(&regexp, "([1-5])", REG_EXTENDED );
  9.  
  10.     char line[16], num[2];
  11.     char *p, *beg, *end;
  12.     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.

  1.     defclassCard();
  2.     defclassHand();
  3.     defclassDeck();

Définit les classes Card, Hand et Deck. La classe Object est automatiquement définie pas la fonction defclass si nécessaire.

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

  1.     for (;;) {

Joue un tour indéfiniment tant que l'utilisateur ne sort pas du jeu.

  1.     }
  2.  
  3.     exit( 0 );
  4. }

Quitte le programme à la fin de la boucle principale.

  1.         sendmsg(deck, "shuffle");
  2.         hand = sendmsg(deck, "hand").p;
  3.         sendmsg(hand, "print", 1);

À chaque tour, mélange le jeu de cartes, tire une main et l'affiche.

  1.         printf("Keep (1-5...)? ");
  2.  
  3.         if (! fgets(line, sizeof (line), stdin))
  4.             break;

Demande à l'utilisateur de choisir quelles cartes il veut conserver. Saisit la réponse.

  1.         for (i = 0; i < 5; i++ )
  2.             list_put(keep, i, 0);

Initialise la liste des cartes à conserver avec des valeurs négatives.

  1.         p = line;
  2.         while (*p) {
  3.             if (regexec(&regexp, p, 2, pmatch, 0) != 0 )
  4.                 break;
  5.  
  6.             if (pmatch[1].rm_so == -1)
  7.                 break;
  8.  
  9.             beg = p+pmatch[1].rm_so;
  10.             end = p+pmatch[1].rm_eo;
  11.  
  12.             strncpy(num, beg, end-beg);
  13.  
  14.             i = atoi(num);
  15.  
  16.             list_put(keep, i-1, (void *)1);
  17.  
  18.             p = end;
  19.         }

Extrait de la saisie des chiffres de 1 à 5 et marque les cartes correspondantes comme à converser.

  1.         for (i = 0; i < 5; i++ ) {
  2.             if (!list_get(keep, i))
  3.                 sendmsg(hand, "setCard", i+1, sendmsg(deck, "deal").p);
  4.         }

Retire une main en conservant les cartes sélectionnées.

  1.         sendmsg(hand, "print", 1);

Affiche la donne finale.

  1.         printf("Play or (q)uit? ");
  2.  
  3.         if (! fgets(line, sizeof (line), stdin))
  4.             break;
  5.  
  6.         for (p = line; *p == ' '; p++)
  7.             ;
  8.  
  9.         if (*p == 'q' || *p == 'Q')
  10.             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.

VOIR AUSSI

Le manuel C

Commentaires

Votre commentaire :
[p] [b] [i] [u] [s] [quote] [pre] [br] [code] [url] [email] strip aide 2000

Entrez un maximum de 2000 caractères.
Améliorez la présentation de votre texte avec les balises de formatage suivantes :
[p]paragraphe[/p], [b]gras[/b], [i]italique[/i], [u]souligné[/u], [s]barré[/s], [quote]citation[/quote], [pre]tel quel[/pre], [br]à la ligne,
[url]http://www.izend.org[/url], [url=http://www.izend.org]site[/url], [email]izend@izend.org[/email], [email=izend@izend.org]izend[/email],
[code]commande[/code], [code=langage]code source en c, java, php, html, javascript, xml, css, sql, bash, dos, make, etc.[/code].