]> git.cworth.org Git - kub/blob - kub.c
Added beginnings of card_compare and added to card_group_is_run(still incomplete)
[kub] / kub.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4
5 char *colors[] = {"Black", "Blue", "Red", "Yellow"};
6
7 typedef enum {BLACK, BLUE, RED, YELLOW} color_t;
8
9 typedef struct card {
10     color_t color;
11     int number;
12 } card_t;
13
14 #define DECK_MAX_CARDS 104
15
16 typedef struct deck {
17     card_t cards[DECK_MAX_CARDS];
18     int num_cards;
19 } deck_t;
20
21 #define CARD_GROUP_MAX_CARDS DECK_MAX_CARDS
22
23 typedef struct card_group {
24     card_t cards[CARD_GROUP_MAX_CARDS];
25     int num_cards;
26 } card_group_t;
27
28 #define BOARD_MAX_CARD_GROUPS (DECK_MAX_CARDS / 3)
29
30 typedef struct board {
31     card_group_t groups[BOARD_MAX_CARD_GROUPS];
32     int num_groups;
33 } board_t;
34
35 typedef struct player {
36     card_group_t hand;
37 } player_t;
38
39 #define GAME_MAX_PLAYERS 4
40
41 typedef struct game {
42     player_t players[GAME_MAX_PLAYERS];
43     int num_players;
44     board_t board;
45     deck_t deck;
46 } game_t;
47
48 static void card_print(card_t card)
49 {
50     printf("%6s %2d\n", colors[card.color], card.number + 1);
51 }
52
53 static void card_group_init(card_group_t *card_group)
54 {
55     card_group->num_cards = 0;
56 }
57
58 static void board_init(board_t *board)
59 {
60     int i;
61     board->num_groups = 0;
62     
63     for (i = 0; i <= BOARD_MAX_CARD_GROUPS; ++i) 
64     {
65         card_group_init(&board->groups[i]);
66     }
67 }
68
69 static void player_init(player_t *player)
70 {
71     card_group_init(&player->hand);
72 }
73
74
75 static int card_compare(card_t *card_one, card_t *card_two)
76 {
77     if (card_one.number < card_two.number)
78         return -1;
79     if (card_one.number == card_two.number)
80         return 0;
81     if (card_one.number > card_two.number)
82         return 1;
83 }
84
85 static int card_group_is_run(card_group_t *card_group)
86 {
87     if (card_group->num_cards > 13 || card_group->num_cards < 3)
88     {
89         return 0;
90     }
91     for (i = 0; i < card_group->num_cards - 1; ++i)
92         if(card_group->cards[i].color != card_group->cards[i + 1].color)
93         {
94             return 0;
95         }    
96     for (i = 0; i < card_group->num_cards - 1; ++i)
97         if(card_group->cards[i].number != card_group->cards[i + 1].number -1)
98         {
99             return 0;
100         }
101     return 1;    
102 }
103
104 static int card_group_is_run(card_group_t *card_group)
105 {
106     int i;
107     int lowest = 14, highest = 0;
108     if (card_group->num_cards > 13 || card_group->num_cards < 3)
109     {
110         return 0;
111     }
112     for (i = 0; i < card_group->num_cards - 1; ++i)
113     {
114         if (card_group->cards[i].color != card_group->cards[i + 1].color)
115         {
116             return 0;
117         }
118         if (card_group->cards[i].number > highest)
119         {
120             highest = card_group->cards[i].number;
121         }
122         if (card_group->cards[i].number < lowest)
123         {
124             lowest = card_group->cards[i].number;
125         }
126     }
127     if (highest - lowest != card_group->num_cards - 1)
128     {
129         return 0;
130     }
131     return 1;
132 }
133
134 static int card_group_is_set(card_group_t *card_group)
135 {
136     int i;
137     color_t seen_color[card_group->num_cards];
138     
139     if (card_group->num_cards > 4 || card_group->num_cards < 3)
140     {
141         return 0;
142     }
143     for (i = 0; i < card_group->num_cards - 1; ++i) 
144     {
145         if (card_group->cards[i].number != card_group->cards[i + 1].number)
146         {
147             return 0;
148         }
149     }
150     seen_color[i] = card_group->cards[i].color;
151     for (i = 0; i < card_group->num_cards; ++i)
152     {
153         seen_color[card_group->cards[i].color]++;
154         if (seen_color[card_group->cards[i].color] > 1)
155         {
156             return 0;
157         }
158     }
159     return 1;
160 }
161
162 static void deck_deal(game_t *game, deck_t *deck)
163 {
164     card_t temp;
165     int rand_card;
166     int i, j, newline;
167     
168     printf ("How many players(1-4) should I deal in? ");
169     game->num_players = getchar();
170     if (game->num_players == EOF)
171     {
172         printf ("\nGoodbye.\n");
173         exit (1);
174     }
175     newline = getchar();   
176     game->num_players -= '0';
177     
178     for (i = 0; i < game->num_players; ++i)
179     {
180         for (j = 0; j < 14; ++j)
181         {
182             rand_card = ((deck->num_cards + 1.0) * rand()) / (RAND_MAX + 1.0);
183             temp = deck->cards[rand_card];
184             deck->cards[rand_card] = deck->cards[deck->num_cards - 1];
185             game->players[i].hand.cards[j] = temp;
186             deck->num_cards -= 1;
187             game->players[i].hand.num_cards += 1;
188         }
189     }
190     printf ("Game dealt for %d player(s)\n", game->num_players);
191 }
192
193 static void deck_init(deck_t *deck)
194 {
195     int h, i, j;  
196     deck->num_cards = 0;
197     for (h = 0; h <= 1; ++h)
198     {
199         for (i = 0; i <= 3; ++i) 
200         {
201             for (j = 0; j <= 12; ++j) 
202             {
203                 deck->cards[j + (i * 13) + (h * 52)].color = i;
204                 deck->cards[j + (i * 13) + (h * 52)].number = j;
205                 deck->num_cards += 1;
206                 printf ("There are %d tiles in the deck\n", deck->num_cards);
207             }
208         }
209     }
210
211
212 static void deck_shuffle(deck_t *deck)
213 {
214     card_t temp;
215     int rand_card;
216     int last;
217     for (last = deck->num_cards; last > 0; --last)
218     {
219         rand_card = ((last + 1.0) * rand()) / (RAND_MAX + 1.0);
220         temp = deck->cards[rand_card];
221         deck->cards[rand_card] = deck->cards[last - 1];
222         deck->cards[last - 1] = temp;
223     }
224 }
225
226 static void deck_print(deck_t *deck)
227 {
228     int h, i, j;  
229     for (h = 0; h <= 1; ++h)
230     {
231         for (i = 0; i <= 3; ++i)
232         {
233             for (j = 0; j <= 12; ++j)
234             {
235                 card_print(deck->cards[j + (i * 13) + (h * 52)]);
236             }
237         }
238     }
239     printf ("There are %d tiles in the deck\n" , deck->num_cards);
240 }
241
242 static void hand_print(game_t *game)
243 {
244     int i;
245     for (i = 0; i < game->players[0].hand.num_cards; ++i)
246     {
247         card_print(game->players[0].hand.cards[i]);
248     }
249 }
250
251 static void game_init(game_t *game)
252 {
253     int i;
254     game->num_players = 0;
255     
256     for (i = 0; i < GAME_MAX_PLAYERS; ++i)
257     {
258         player_init(&game->players[i]);
259         game->num_players += 1;
260     }
261     
262     board_init(&game->board);
263     deck_init(&game->deck);
264     deck_shuffle(&game->deck);
265 }
266
267 int main(void)
268 {
269     game_t game;
270     
271     srand(time(NULL));
272     
273     game_init(&game);
274     deck_print(&game.deck);
275     deck_deal(&game, &game.deck);
276     hand_print(&game);
277     deck_print(&game.deck);
278     return 0;
279     
280 }