]> git.cworth.org Git - ttt/commitdiff
Add kub program
authorKevin Worth <kevin@theworths.org>
Sat, 14 Jan 2006 17:01:24 +0000 (17:01 +0000)
committerKevin Worth <kevin@theworths.org>
Sat, 14 Jan 2006 17:01:24 +0000 (17:01 +0000)
kub/kub.c [new file with mode: 0755]
src/test-board.c
src/ttt-board.c

diff --git a/kub/kub.c b/kub/kub.c
new file mode 100755 (executable)
index 0000000..9fc1552
--- /dev/null
+++ b/kub/kub.c
@@ -0,0 +1,192 @@
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <time.h>\r
+
+char *colors[] = {"Black", "Blue", "Red", "Yellow"};
+
+typedef enum {BLACK, BLUE, RED, YELLOW} color_t;
+
+typedef struct card {
+    color_t color;
+    int number;
+} card_t;
+
+#define DECK_MAX_CARDS 104
+
+typedef struct deck {
+    card_t cards[DECK_MAX_CARDS];
+    int num_cards;
+} deck_t;
+
+#define CARD_GROUP_MAX_CARDS 14
+
+typedef struct card_group {
+    card_t cards[HAND_MAX_CARDS];
+    int num_cards;
+} card_group_t;
+
+#define BOARD_MAX_CARD_GROUPS (DECK_MAX_CARDS / 3)
+
+typedef struct board {
+    card_group_t groups[BOARD_MAX_CARD_GROUPS];
+    int num_groups;
+} board_t
+
+typedef struct player {
+    card_group_t hand;
+} player_t;
+
+#define GAME_MAX_PLAYERS 4
+
+typedef struct game {
+    player_t players[GAME_MAX_PLAYERS];
+    int num_players;
+    board_t board;
+    deck_t deck;
+} game_t;
+
+void card_print(card_t card)
+{
+    printf("%6s %2d\n", colors[card.color], card.number + 1);
+}
+
+void card_group_init(card_group_t *card_group)
+{
+    card_group->num_cards = 0;
+}
+
+void board_init(board_t *board)
+{
+    int i;
+    board->num_groups = 0;
+    
+    for (i = 0; i <= BOARD_MAX_CARD_GROUPS; ++i) 
+    {
+       card_group_init(&board->groups[i]);
+    }
+}
+
+void player_init(player_t *player)
+{
+    card_group_init(&player->hand);
+}
+
+void game_init(game_t *game)
+{
+    int i;
+    game->num_players = 0
+       
+       for (i = 0; i < GAME_MAX_PLAYERS; ++i)
+       {
+           player_init(&game->players[i]);
+           game->num_players += 1;
+       }
+    
+    board_init(&game->board);
+    deck_init(&game->deck);
+    deck_shuffle(&game->deck);
+}
+
+int card_group_is_set(card_group_t *card_group)
+{
+    int i, j;
+    color_t seen_color[card_group->num_cards]
+       
+       if (card_group->num_cards > 4 || card_group->num_cards < 3)
+       {
+           return 0;
+       }
+    for (i = 0; i < card_group->num_cards - 1; ++i) 
+    {
+       if (card_group->cards[i].number != card_group->cards[i + 1].number)
+       {
+           return 0;
+       }
+    }
+    seen_color[i] = card_group->cards[i].color;
+    for (i = 0; i < card_group->num_cards; ++i)
+    {
+       color_t color;
+       
+       seen_color[card_group->cards[i].color]++;
+    }
+    return 1;
+}
+
+void deck_deal(deck_t *deck)
+{
+    card_t temp;
+    int rand_card;
+    int i;
+    for (i = 0; i < Players )
+    {
+       rand_card = ((last + 1.0) * rand()) / (RAND_MAX + 1.0);
+       temp = deck->cards[rand_card];
+       deck->cards[rand_card] = deck->cards[last];
+       deck->cards[last] = temp;
+    }
+}
+
+
+void deck_init(deck_t *deck)
+{
+    int h, i, j;  
+    deck->num_cards = 0;
+    for (h = 0; h <= 1; ++h)
+    {
+       for (i = 0; i <= 3; ++i) 
+       {
+           for (j = 0; j <= 12; ++j) 
+           {
+               deck->cards[j + (i * 13) + (h * 52)].color = i;
+               deck->cards[j + (i * 13) + (h * 52)].number = j;
+               deck->num_cards += 1;
+           }
+       }
+    }
+} 
+
+void deck_shuffle(deck_t *deck)
+{
+    card_t temp;
+    int rand_card;
+    int last;
+    for (last = deck->num_cards; last > 0; --last)
+    {
+       rand_card = ((last + 1.0) * rand()) / (RAND_MAX + 1.0);
+       temp = deck->cards[rand_card];
+       deck->cards[rand_card] = deck->cards[last];
+       deck->cards[last] = temp;
+    }
+}
+
+void deck_print(deck_t *deck)
+{
+    int h, i, j;  
+    for (h = 0; h <= 1; ++h)
+    {
+       for (i = 0; i <= 3; ++i)
+       {
+           for (j = 0; j <= 12; ++j)
+           {
+               card_print(deck->cards[j + (i * 13) + (h * 52)]);
+           }
+       }
+    }
+}
+
+int main()
+{
+#define MAX_PLAYERS 4
+#define HANDSIZE 14
+#define PLAYERS 4
+    
+    deck_t deck;
+    
+    srand(time(NULL));
+    
+    game_init(&game);
+    deck_print(&deck);
+    
+    return 0;
+    
index e07e28dd89703821572de93eba4ea730a77fd1f2..4f151bc87908ff5b605397596d199ac62f7cff03 100644 (file)
@@ -8,9 +8,10 @@ main (void)
     ttt_board_t board;
     int m, i, newline;
     ttt_cell_t winner, move_result;
-    
+
     ttt_board_init (&board);
     
+
     i = 0; while (i < 9)
     {
        ttt_board_write (&board, stdout);
@@ -27,9 +28,11 @@ main (void)
        m -= '0';
        move_result = ttt_board_make_move (&board, m);
        if (move_result == TTT_ERROR_NOT_GRID)
+       {
            printf ("Sorry, %c is an invalid move.\n"
                    "Please enter a number between 0 & 8.", m + '0');
-       
+           continue;
+       }
        if (move_result == TTT_ERROR_NOT_VALID_MOVE)
            continue;
        
@@ -53,6 +56,7 @@ main (void)
     }
     
     ttt_board_write (&board, stdout);
+    ttt_board_init_from_string (&board, s);
     printf ("\n");    
     return 0;
 }
index d231ea943ad52d4ddb252c1debe773ea4e79b40a..e55fda1b9bb48cca37578bfef2875127d9b335c2 100644 (file)
@@ -44,9 +44,21 @@ void
 ttt_board_init_from_string (ttt_board_t *board,
                            const char  *s)
 {
-    /* XXX: NYI */
+    int i, j;
+    j = 0;
+    for (i = 0; i < strlen (s); i++)
+    {
+       if ((s[i] == 'X') |
+           (s[i] == 'O') |
+           (s[i] == '_'))
+       {
+           board->cells[j] = s[i];
+           j++;
+       }
+    }
 }
 
+
 /* Return the string representation of a board.
  *
  * The return value is a malloc()ed string that should be free()ed