]> git.cworth.org Git - ttt/blobdiff - kub/kub.c
Add kub program
[ttt] / kub / kub.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;
+