From: Kevin Worth Date: Sat, 14 Jan 2006 17:01:24 +0000 (+0000) Subject: Add kub program X-Git-Url: https://git.cworth.org/git?p=ttt;a=commitdiff_plain;h=3f50431bd1ad36a1e4cc5a0df7f9f204e8be2b2c Add kub program --- diff --git a/kub/kub.c b/kub/kub.c new file mode 100755 index 0000000..9fc1552 --- /dev/null +++ b/kub/kub.c @@ -0,0 +1,192 @@ +#include +#include +#include + +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; + diff --git a/src/test-board.c b/src/test-board.c index e07e28d..4f151bc 100644 --- a/src/test-board.c +++ b/src/test-board.c @@ -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; } diff --git a/src/ttt-board.c b/src/ttt-board.c index d231ea9..e55fda1 100644 --- a/src/ttt-board.c +++ b/src/ttt-board.c @@ -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