]> git.cworth.org Git - kub/commitdiff
Show Carl the latest
authorKevin Worth <kworth@ibuntu.localdomain>
Tue, 13 Apr 2010 05:07:49 +0000 (01:07 -0400)
committerKevin Worth <kworth@ibuntu.localdomain>
Tue, 13 Apr 2010 05:07:49 +0000 (01:07 -0400)
Selected groups of tiles get moved from the deck into the next open group on the board. The state can be saved by hitting enter, which passes the turn to the next player. If you make some changes, you can revert them by hitting escape. The board gets checked to see if all groups are either valid runs or sets.

kub.c [changed mode: 0755->0644]

diff --git a/kub.c b/kub.c
old mode 100755 (executable)
new mode 100644 (file)
index 223e4ea..f76bb97
--- a/kub.c
+++ b/kub.c
@@ -233,7 +233,12 @@ static int tile_compare(const void *one, const void *two)
 
 static int tile_compare_1(tile_t *tile_one, tile_t *tile_two)
 {
-    return tile_one->number - tile_two->number;
+    return tile_one->number - tile_two->number;                //Sort lowest to highest
+}
+
+static int int_compare(int *x, int *y)
+{
+    return y - x;      //Sort highest to lowest
 }
 
 /*
@@ -367,6 +372,21 @@ static int tile_group_is_set(tile_group_t *tile_group)
     return 1;
 }
 
+static gboolean board_valid(board_t *board)
+{
+    int i;
+    gboolean valid = TRUE;
+    for (i = 0; i < board->num_groups; ++i)
+    {
+       if (!(tile_group_is_run_one(&board->groups[i])) &&
+           !(tile_group_is_set(&board->groups[i])))
+       {
+           valid = FALSE;
+       }
+    }
+    return valid;
+}
+
 static void deck_deal(game_t *game, deck_t *deck)
 {
     tile_t temp;
@@ -468,6 +488,34 @@ static void deck_draw(game_t *game, cairo_t *cr, GdkRegion *region)
     }
 }
 
+static void board_draw(game_t *game, cairo_t *cr, GdkRegion *region)
+{
+    int i, j;
+    for (i = 0; i < game->board.num_groups; i++)
+    {
+       for (j = 0; j < game->board.groups[i].num_tiles; j++)
+       {
+           tile_draw(game, &game->board.groups[i].tiles[j], cr, region);
+           //tile_print(game->board.groups[i].tiles[j]);
+       }
+    }
+}
+
+static void board_print(game_t *game)
+{
+    int i, j;
+    printf("\tBegin board print\n");
+    for (i = 0; i < game->board.num_groups; i++)
+    {
+       printf("\tBegin group %d\n", i);
+       for (j = 0; j < game->board.groups[i].num_tiles; j++)
+       {
+           tile_print(game->board.groups[i].tiles[j]);
+       }
+       printf("\tEnd group %d\n", i);
+    }
+}
+
 static void hand_print(game_t *game, int player)
 {
     int i;
@@ -498,7 +546,6 @@ static void hand_draw(game_t *game, int player, cairo_t *cr, GdkRegion *region,
 
 static void save_state(game_t *game)
 {
-    //DO STUFF HERE
     game->state.board = game->board;
     game->state.deck = game->deck;
     //game->state.players = game->players;
@@ -557,18 +604,29 @@ static gboolean on_expose_event (GtkWidget *widget, GdkEventExpose *event, game_
     cr = gdk_cairo_create (widget->window);
 
     deck_draw(game, cr, event->region);
+    board_draw(game, cr, event->region);
 
     if (game->selection_box.visible)
        selection_box_draw(&game->selection_box, cr);
 
     hand_draw(game, game->current_player, cr, event->region, widget);
-//    hand_draw(game, 0, cr, event->region);
+    //hand_draw(game, 0, cr, event->region);
 
     cairo_destroy (cr);
 
     return TRUE;
 }
+/*
+static gboolean on_configure_event (GtkWidget *widget, GdkEventConfigure *event, game_t *game)
+{
+    cairo_t *cr;
+
+    cr = gdk_cairo_create (event->window);
 
+    hand_draw(game, game->current_player, cr, event->window, widget);
+//    gtk_widget_queue_draw(widget);
+}
+*/
 static gboolean on_key_press_event (GtkWidget *widget, GdkEventKey *event, game_t *game)
 {
     cairo_t *cr;
@@ -595,11 +653,9 @@ static gboolean on_key_press_event (GtkWidget *widget, GdkEventKey *event, game_
        gtk_widget_queue_draw(widget);
     }
 
-    if (event->keyval == 112)          //HIT "P"
+    if (event->keyval == 65474)                //HIT "F5"
     {
-       deck_print(&game->deck);
-       //hand_draw(game, game->current_player, cr, event->region, widget);
-       //on_expose_event(widget, event, game);
+       gtk_widget_queue_draw(widget);
     }
 
 
@@ -712,13 +768,11 @@ static gboolean on_button_release_event (GtkWidget *widget, GdkEventButton *even
        box->visible = 0;       
        gtk_widget_queue_draw_area (widget, x_min, y_min, width, height);
 
-//     tile_group_t group;
-//     group.num_tiles = 0;
-
-       tile_t* group[TILE_GROUP_MAX_TILES];
-       int num_tiles = 0;
+       tile_group_t group;
+       group.num_tiles = 0;
 
        int i, tile_x, tile_y, tile_x2, tile_y2;
+       int tiles_to_remove[game->deck.num_tiles];
        for (i = 0; i < game->deck.num_tiles; i++)
         {
            tile_x = game->deck.tiles[i].x;
@@ -749,46 +803,45 @@ static gboolean on_button_release_event (GtkWidget *widget, GdkEventButton *even
                /*or bottom edge of tile selected*/
                (x_min >= tile_x && x_min <= tile_x2 &&
                 y_min >= tile_y && y_min <= tile_y) )
-            {          
-//             group.tiles[group.num_tiles] = game->deck.tiles[i];
-//             group.num_tiles++;
+            {
+               tiles_to_remove[group.num_tiles] = i;
 
-               group[num_tiles] = &game->deck.tiles[i];
-               num_tiles++;
+               group.tiles[group.num_tiles] = game->deck.tiles[i];
+               group.num_tiles++;
             }
         }
-       //printf("is run %d\n", tile_group_is_run_one(&group) );
-       //printf("is set %d\n", tile_group_is_set(&group) );
+       printf("is run %d\n", tile_group_is_run_one(&group) );
+       printf("is set %d\n", tile_group_is_set(&group) );
 
-//     int matching_y = y_min;
-       
-//     for (i = 0; i < group.num_tiles; i++)
+       qsort (tiles_to_remove, group.num_tiles, sizeof (int), int_compare);
 
-       for (i = 0; i < num_tiles; i++)
+       for (i = 0; i < group.num_tiles; i++)
        {
-//         tile_print(group.tiles[i]);
-           gtk_widget_queue_draw_area (widget, group[i]->x - 1 , group[i]->y - 1, TILE_WIDTH + 1, TILE_HEIGHT + 2);
-           group[i]->x = x_min + (i * (TILE_WIDTH));
-           group[i]->y = y_min;
-           gtk_widget_queue_draw_area (widget, group[i]->x - 1 , group[i]->y - 1, TILE_WIDTH + 1, TILE_HEIGHT + 2);
+           tile_print(group.tiles[i]);
+           gtk_widget_queue_draw_area (widget, group.tiles[i].x - 1,
+                                       group.tiles[i].y - 1, TILE_WIDTH + 1,
+                                       TILE_HEIGHT + 2);
+
+           group.tiles[i].x = x_min + (i * (TILE_WIDTH));
+           group.tiles[i].y = y_min;
+
+           gtk_widget_queue_draw_area (widget, group.tiles[i].x - 1,
+                                       group.tiles[i].y - 1, TILE_WIDTH + 1,
+                                       TILE_HEIGHT + 2);
+
+           //Remove tile from deck
+           if (tiles_to_remove[i] != game->deck.num_tiles - 1)
+               game->deck.tiles[tiles_to_remove[i]] = game->deck.tiles[game->deck.num_tiles-1];
+           game->deck.num_tiles--;
        }    
-/*     int j;
-       int new_x = 0;
-       for (i = 0; i < group.num_tiles; i++)
+
+       if (group.num_tiles > 0)
        {
-           for (j = 0; j < game->deck.num_tiles; j++)
-           {
-               if (group.tiles[i].x == game->deck.tiles[j].x &&
-                   group.tiles[i].y == game->deck.tiles[j].y)
-               {
-                   new_x = x_min + (i * (TILE_WIDTH));
-                   gtk_widget_queue_draw_area (widget, game->deck.tiles[j].x - 1 , game->deck.tiles[j].y - 1, TILE_WIDTH + 1, TILE_HEIGHT + 2);
-                   game->deck.tiles[j].x = new_x;
-                   game->deck.tiles[j].y = matching_y;
-                   gtk_widget_queue_draw_area (widget, new_x - 1 , matching_y - 1, TILE_WIDTH + 1, TILE_HEIGHT + 2);
-               }
-           }
-       }*/
+           game->board.groups[game->board.num_groups] = group;
+           game->board.num_groups++;
+       }
+       board_print(game);
+       printf("\nBut is the board valid?\t\t%s\n", board_valid(&game->board));
     }    
     game->select_mode = 1;
 
@@ -904,6 +957,11 @@ int main(int argc, char *argv[])
     deck_print(&game.deck);
     deck_spread(&game.deck);
     deck_deal(&game, &game.deck);
+
+    game.state.board = game.board;
+    game.state.deck = game.deck;
+    //game->state.players = game.players;
+
     //hand_print(&game, 0); //With Zero being passed, will print hand for player 1(players[0])
     //deck_print(&game.deck);
 
@@ -924,6 +982,8 @@ int main(int argc, char *argv[])
                      G_CALLBACK (gtk_main_quit), NULL);
     g_signal_connect (G_OBJECT (window), "expose_event",
                      G_CALLBACK (on_expose_event), &game);
+//    g_signal_connect (G_OBJECT (window), "configure_event",
+//                   G_CALLBACK (on_configure_event), &game);
     g_signal_connect (G_OBJECT (window), "key_press_event",
                      G_CALLBACK (on_key_press_event), &game);
     g_signal_connect (G_OBJECT (window), "button_press_event",