Une carte à jouer
- #include "OL.h"
- extern class Card;
- extern void defclassCard();
- #define TWO 0
- #define THREE 1
- #define FOUR 2
- #define FIVE 3
- #define SIX 4
- #define SEVEN 5
- #define EIGHT 6
- #define NINE 7
- #define TEN 8
- #define JACK 9
- #define QUEEN 10
- #define KING 11
- #define ACE 12
- #define CLUBS 0
- #define DIAMONDS 1
- #define HEARTS 2
- #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.
- #include "So-o.h"
- #include "Card.h"
- class Card;
Inclut les signatures des fonctions de So-o. Inclut les déclarations de la classe Card. Définit la classe Card.
- static instance i_init(instance self, va_list va) {
- int rank = va_arg(va, int);
- int suit = va_arg(va, int);
- supersend(Card, self, "init");
- sendmsg(self, "set", "rank", rank);
- sendmsg(self, "set", "suit", suit);
- return self;
- }
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
.
- static int i_rank(instance self) {
- return sendmsg(self, "get", "rank").i;
- }
rank
retourne la propriété rank de self
.
- static int i_suit(instance self) {
- return sendmsg(self, "get", "suit").i;
- }
suit
retourne la propriété suit de self
.
- static int i_compare(instance self, va_list va) {
- instance card = va_arg(va, instance);
- int rank1 = sendmsg(self, "get", "rank").i;
- int rank2 = sendmsg(card, "get", "rank").i;
- return rank1 == rank2 ? 0 : rank1 > rank2 ? 1 : -1;
- }
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.
- static char *i_toString(instance self) {
- static char srank[] = { '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A' };
- static char ssuit[] = { 'c', 'd', 'h', 's' };
- static char s[2+1];
- int rank = sendmsg(self, "get", "rank").i;
- int suit = sendmsg(self, "get", "suit").i;
- sprintf(s, "%c%c", srank[rank], ssuit[suit]);
- return s;
- }
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.
- void defclassCard() {
- property _i_properties[] = {
- "rank",
- "suit",
- 0, 0
- };
- selector _i_messages[] = {
- "init", METHOD(i_init),
- "rank", METHOD(i_rank),
- "suit", METHOD(i_suit),
- "compare", METHOD(i_compare),
- "toString", METHOD(i_toString),
- 0, 0
- };
- Card = defclass("Card", 0, 1, 0, _i_properties, 0, _i_messages);
- }
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
Commentaires