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.
for (y = 0; y < DVONN_BOARD_Y_SIZE; y++) {
board->cells[x][y].type = DVONN_CELL_EMPTY;
board->cells[x][y].height = 0;
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;
+ if (board->moves < 3) {
board->cells[x][y].type = DVONN_CELL_RED;
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;
board->cells[x][y].type = DVONN_CELL_BLACK;
board->cells[x][y].type = DVONN_CELL_WHITE;
board->cells[x][y].type = DVONN_CELL_WHITE;
board->cells[x][y].height = 1;
board->cells[x][y].height = 1;
board->cells[x2][y2].height += board->cells[x1][y1].height;
board->cells[x2][y2].type = board->cells[x1][y1].type;
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].type = DVONN_CELL_EMPTY;
board->cells[x1][y1].height = 0;
+ board->cells[x1][y1].contains_red = FALSE;
dvonn_board_next_player (board);
dvonn_board_next_player (board);
typedef struct {
dvonn_cell_type_t type;
int height;
typedef struct {
dvonn_cell_type_t type;
int height;
+ dvonn_bool_t contains_red;
} dvonn_cell_t;
#define DVONN_BOARD_X_SIZE 11
} dvonn_cell_t;
#define DVONN_BOARD_X_SIZE 11
/* Something like buff */
#define BACKGROUND_COLOR 0.89, 0.70, 0.40
/* 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
/* Relative to a unit square. */
#define RING_OUTER_RADIUS 0.4
#define RING_INNER_RADIUS 0.2
cairo_translate(cr,
x + (y - DVONN_BOARD_Y_SIZE/2) / 2.0,
M_SQRT1_2 * y);
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:
ring_path (cr);
switch (cell.type) {
case DVONN_CELL_WHITE:
cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */
break;
case DVONN_CELL_RED:
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:
break;
case DVONN_CELL_EMPTY:
default:
- if (game->board.cells[x][y].height) {
+ if (game->board.cells[x][y].height > 1) {
PangoLayout *height;
cairo_move_to (cr,
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);
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);