From 1e29ece3252138d372b47499dd4c77f01413c7fc Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Thu, 5 Mar 2009 01:46:55 -0800 Subject: [PATCH] Add visual indication for non-red stacks containing a red piece Also, don't bother displaying the stack-height number until the stack has at least two pieces in it. The game is really close to being possible to play manually, (without the computer enforcing the rules), except that it's not yet possible to eliminate the disconnected pieces. --- dvonn-board.c | 11 ++++++++--- dvonn-board.h | 1 + dvonn.c | 16 +++++++++++++--- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/dvonn-board.c b/dvonn-board.c index f802775..4d09e13 100644 --- a/dvonn-board.c +++ b/dvonn-board.c @@ -63,6 +63,7 @@ dvonn_board_init (dvonn_board_t *board) for (y = 0; y < DVONN_BOARD_Y_SIZE; y++) { board->cells[x][y].type = DVONN_CELL_EMPTY; board->cells[x][y].height = 0; + board->cells[x][y].contains_red = FALSE; } } @@ -140,12 +141,14 @@ dvonn_board_place (dvonn_board_t *board, return FALSE; } - if (board->moves < 3) + if (board->moves < 3) { board->cells[x][y].type = DVONN_CELL_RED; - else if (board->moves % 2) + board->cells[x][y].contains_red = TRUE; + } else if (board->moves % 2) { board->cells[x][y].type = DVONN_CELL_BLACK; - else + } else { board->cells[x][y].type = DVONN_CELL_WHITE; + } board->cells[x][y].height = 1; @@ -175,9 +178,11 @@ dvonn_board_move (dvonn_board_t *board, board->cells[x2][y2].height += board->cells[x1][y1].height; board->cells[x2][y2].type = board->cells[x1][y1].type; + board->cells[x2][y2].contains_red |= board->cells[x1][y1].contains_red; board->cells[x1][y1].type = DVONN_CELL_EMPTY; board->cells[x1][y1].height = 0; + board->cells[x1][y1].contains_red = FALSE; dvonn_board_next_player (board); diff --git a/dvonn-board.h b/dvonn-board.h index b0ee8cc..2971a27 100644 --- a/dvonn-board.h +++ b/dvonn-board.h @@ -45,6 +45,7 @@ typedef enum { typedef struct { dvonn_cell_type_t type; int height; + dvonn_bool_t contains_red; } dvonn_cell_t; #define DVONN_BOARD_X_SIZE 11 diff --git a/dvonn.c b/dvonn.c index 1442923..806a8e6 100644 --- a/dvonn.c +++ b/dvonn.c @@ -72,6 +72,8 @@ on_delete_event_quit (GtkWidget *widget, /* Something like buff */ #define BACKGROUND_COLOR 0.89, 0.70, 0.40 +#define RED_RING_COLOR 0.8, 0.2, 0.2 + /* Relative to a unit square. */ #define RING_OUTER_RADIUS 0.4 #define RING_INNER_RADIUS 0.2 @@ -350,6 +352,14 @@ on_expose_event_draw (GtkWidget *widget, cairo_translate(cr, x + (y - DVONN_BOARD_Y_SIZE/2) / 2.0, M_SQRT1_2 * y); + if (cell.contains_red && cell.type != DVONN_CELL_RED) { + cairo_new_sub_path (cr); + cairo_arc (cr, 0.5, 0.5, + (RING_INNER_RADIUS + RING_OUTER_RADIUS)/2.0, + 0, 2 * M_PI); + cairo_set_source_rgb (cr, RED_RING_COLOR); + cairo_fill (cr); + } ring_path (cr); switch (cell.type) { case DVONN_CELL_WHITE: @@ -359,7 +369,7 @@ on_expose_event_draw (GtkWidget *widget, cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */ break; case DVONN_CELL_RED: - cairo_set_source_rgb (cr, 0.8, 0.2, 0.2); /* red */ + cairo_set_source_rgb (cr, RED_RING_COLOR); break; case DVONN_CELL_EMPTY: default: @@ -375,10 +385,10 @@ on_expose_event_draw (GtkWidget *widget, } cairo_fill (cr); - if (game->board.cells[x][y].height) { + if (game->board.cells[x][y].height > 1) { PangoLayout *height; cairo_move_to (cr, - 0.5 - 0.8 * RING_INNER_RADIUS * cos (M_PI_4), + 0.5 - 0.7 * RING_INNER_RADIUS * cos (M_PI_4), 0.5 - 1.2 * RING_INNER_RADIUS * sin (M_PI_4)); height = _create_layout_printf (cr, game->font, "%d", game->board.cells[x][y].height); -- 2.43.0