--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+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;
+