4

Une carte à jouer

  1. #include "OL.h"
  2.  
  3. extern class Card;
  4.  
  5. extern void defclassCard();
  6.  
  7. #define TWO         0
  8. #define THREE       1
  9. #define FOUR        2
  10. #define FIVE        3
  11. #define SIX         4
  12. #define SEVEN       5
  13. #define EIGHT       6
  14. #define NINE        7
  15. #define TEN         8
  16. #define JACK        9
  17. #define QUEEN       10
  18. #define KING        11
  19. #define ACE         12
  20.  
  21. #define CLUBS       0
  22. #define DIAMONDS    1
  23. #define HEARTS      2
  24. #define SPADES      3

Inclut les définitions des types de données et les signatures des fonctions de l'Object Layer. Déclare la classe Card et la fonction defclassCard qui la construit. Définit des constantes pour la valeur et la couleur d'une carte.

  1. #include "So-o.h"
  2.  
  3. #include "Card.h"
  4.  
  5. class Card;

Inclut les signatures des fonctions de So-o. Inclut les déclarations de la classe Card. Définit la classe Card.

  1. static instance i_init(instance self, va_list va) {
  2.     int rank = va_arg(va, int);
  3.     int suit = va_arg(va, int);
  4.  
  5.     supersend(Card, self, "init");
  6.  
  7.     sendmsg(self, "set", "rank", rank);
  8.     sendmsg(self, "set", "suit", suit);
  9.  
  10.     return self;
  11. }

init prend 2 arguments : rank et suit, la valeur et la couleur d'une carte. Elle initialise les propriétés rank et suit de self avec rank et suit.

  1. static int i_rank(instance self) {
  2.     return sendmsg(self, "get", "rank").i;
  3. }

rank retourne la propriété rank de self.

  1. static int i_suit(instance self) {
  2.     return sendmsg(self, "get", "suit").i;
  3. }

suit retourne la propriété suit de self.

  1. static int i_compare(instance self, va_list va) {
  2.     instance card = va_arg(va, instance);
  3.  
  4.     int rank1 = sendmsg(self, "get", "rank").i;
  5.     int rank2 = sendmsg(card, "get", "rank").i;
  6.  
  7.     return rank1 == rank2 ? 0 : rank1 > rank2 ? 1 : -1;
  8. }

compare compare self avec card, une autre instance de Card. Elle retourne 0 si la valeur de self est égale à la valeur de card, -1 si elle plus faible, 1 si elle est plus forte. compare sert à trier une instance de Hand.

  1. static char *i_toString(instance self) {
  2.     static char srank[] = { '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A' };
  3.     static char ssuit[] = { 'c', 'd', 'h', 's' };
  4.  
  5.     static char s[2+1];
  6.  
  7.     int rank = sendmsg(self, "get", "rank").i;
  8.     int suit = sendmsg(self, "get", "suit").i;
  9.  
  10.     sprintf(s, "%c%c", srank[rank], ssuit[suit]);
  11.  
  12.     return s;
  13. }

toString retourne une chaîne de caractères contenant la valeur et la couleur de self. Cette chaîne de caractères est formatée dans une zone statique. Il faut s'en servir avant de rappeler cette méthode.

  1. void defclassCard() {
  2.     property _i_properties[] = {
  3.         "rank",
  4.         "suit",
  5.         0, 0
  6.     };
  7.     selector _i_messages[] = {
  8.         "init",     METHOD(i_init),
  9.         "rank",     METHOD(i_rank),
  10.         "suit",     METHOD(i_suit),
  11.         "compare",  METHOD(i_compare),
  12.         "toString", METHOD(i_toString),
  13.         0, 0
  14.     };
  15.  
  16.     Card = defclass("Card", 0, 1, 0, _i_properties, 0, _i_messages);
  17. }

Initialise la classe Card. La classe Card hérite de la classe Object. Une instance a 2 propriétés : rank, sa valeur, et suit, sa couleur. Une instance redéfinit les messages init et toString. Elle implémente les messages rank, suit et compare.

TEST

Compilez et exécutez le test unitaire :

$ make test-Card
gcc -g -I.. -Wno-missing-braces -O -fstrength-reduce -finline-functions -fomit-frame-pointer -c test-Card.c
gcc -g -I.. -Wno-missing-braces -O -fstrength-reduce -finline-functions -fomit-frame-pointer -c Card.c
gcc -g test-Card.o Card.o ../libso-o.a -o test-Card
$ test-Card
2c (two of clubs) -> 2c
Td (ten of diamonds) -> Td
Kh (king of hearts) -> Kh
As (ace of spades) -> As
-1 -> -1
 0 ->  0
 1 ->  1
VOIR AUSSI

Hand

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