X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=kub.c;h=e11b87ecf29b117f30ff398c7632e9f89fea832c;hb=20d9914a4be7a6cb0336576fefa8a40e411d4438;hp=aec86bee557348ae318c7614bf8a7fa6dc6a9889;hpb=de58f6c53ee85cf0db3bbed62101901f651db108;p=kub diff --git a/kub.c b/kub.c index aec86be..e11b87e 100644 --- a/kub.c +++ b/kub.c @@ -2,6 +2,11 @@ #include #include #include +#include +#include + +#define FATAL_ERROR(msg) \ + do { fprintf (stderr, "Error: %s\n", msg); exit (1); } while (0) char *colors[] = {"Black", "Blue", "Red", "Yellow"}; @@ -46,6 +51,7 @@ typedef struct game { int num_players; board_t board; deck_t deck; + RsvgHandle *blanktile; } game_t; static void card_print(card_t card) @@ -75,29 +81,62 @@ static void player_init(player_t *player) } +/* If card_one < card_two, then return value will be negative + if they are equal, 0 will be returned, + if card_one > card_two, then return value will be positive */ static int card_compare(card_t *card_one, card_t *card_two) { return card_one->number - card_two->number; } -static int card_group_is_run(card_group_t *card_group) +static int card_group_is_run_one(card_group_t *card_group) +{ + int i; + qsort (&card_group->cards[0], card_group->num_cards, + sizeof (card_t), card_compare); + + if (card_group->num_cards > 13 || card_group->num_cards < 3) + { + return 0; + } + for (i = 0; i < card_group->num_cards - 1; ++i) + if(card_group->cards[i].color != card_group->cards[i + 1].color) + { + return 0; + } + if(card_group->cards[i].number != card_group->cards[i + 1].number -1) + { + return 0; + } + return 1; +} + + +static int card_group_is_run_two(card_group_t *card_group) { int i; int lowest = 14, highest = 0; color_t run_color; - if (card_group->num_cards > 13 || card_group->num_cards < 3) + /* By definition, a run must have at least 3 cards. Also, it's + * impossible for any group of cards with more than 13 cards to be + * a run, (there are only 13 unique numbers so a group with more + * than 13 cards must have some duplicates). + */ + if (card_group->num_cards < 3 || card_group->num_cards > 13) { return 0; } - run_color = card_group->cards[i].color; + /* Loop through all cards in the group, ensuring that they are all + * the same color and finding the highest and lowest number in the + * group. */ + run_color = card_group->cards[0].color; for (i = 0; i < card_group->num_cards; i++) { if (card_group->cards[i].color != run_color) return 0; - if (card_group->cards[i].number > highest) { highest = card_group->cards[i].number; @@ -107,10 +146,31 @@ static int card_group_is_run(card_group_t *card_group) lowest = card_group->cards[i].number; } } + + /* For a run, the difference between the highest and lowest cards + * will always be one less than the number of cards in the + * group. If not then we know it's not a run. + */ if (highest - lowest != card_group->num_cards - 1) { return 0; } + + /* XXX: There's a bug here. We're guessing that at this point + * anything we're looking at must be a run. This would be correct + * if there were no duplicate cards, but since there are + * duplicates this us quite broken. For example consider two + * sequences of entirely red cards: + * + * This is a run: 1, 2, 3, 4 + * But this is not: 1, 3, 4, 4 + * + * As currently written, this function will consider both of these + * groups to be a run. One possible fix is to throw away the + * highest - lowest heuristic and instead simply sort the cards up + * front and ensure the difference between each adjacent pair is + * exactly 1. + */ return 1; } @@ -234,6 +294,8 @@ static void hand_print(game_t *game) static void game_init(game_t *game) { int i; + GError *error = NULL; + game->num_players = 0; for (i = 0; i < GAME_MAX_PLAYERS; ++i) @@ -245,11 +307,21 @@ static void game_init(game_t *game) board_init(&game->board); deck_init(&game->deck); deck_shuffle(&game->deck); + + game->blanktile = rsvg_handle_new_from_file ("tiles/blanktile.svg", &error); + if (error) + FATAL_ERROR (error->message); } static gboolean on_expose_event (GtkWidget *widget, GdkEventExpose *event, game_t *game) { - printf ("I should be drawing something here\n"); + cairo_t *cr; + + cr = gdk_cairo_create (widget->window); + + rsvg_handle_render_cairo (game->blanktile, cr); + + cairo_destroy (cr); return TRUE; } @@ -281,6 +353,8 @@ int main(int argc, char *argv[]) game_t game; srand(time(NULL)); + + gtk_init (&argc, &argv); game_init(&game); deck_print(&game.deck); @@ -288,8 +362,6 @@ int main(int argc, char *argv[]) hand_print(&game); deck_print(&game.deck); - gtk_init (&argc, &argv); - /* Create a new window */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size (GTK_WINDOW (window),