2 * Copyright (C) 2009 Carl Worth
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see http://www.gnu.org/licenses/ .
17 * Author: Carl Worth <cworth@cworth.org>
26 #include "dvonn-board.h"
28 /* Just a diagram to help start thinking about data structures:
33 * 2 ○ ● ● ○ ○ ○ ○ ○ ○ ○
34 * 3 ○ ● ○ ● ○ ○ ○ ○ ○ ○ ○
35 * 4 ○ ● ● ○ ○ ○ ○ ○ ○ ○ K
36 * 5 ○ ○ ○ ○ ○ ○ ○ ○ ○ J
41 * 1 x x ○ ○ ○ ○ ○ ○ ○ ○ ○
42 * 2 x ○ ● ● ○ ○ ○ ○ ○ ○ ○
43 * 3 ○ ● ○ ● ○ ○ ○ ○ ○ ○ ○
44 * 4 ○ ● ● ○ ○ ○ ○ ○ ○ ○ x
45 * 5 ○ ○ ○ ○ ○ ○ ○ ○ ○ x x
46 * A B C D E F G H I J K
48 * With connections as:
58 dvonn_board_init (dvonn_board_t *board)
62 for (x = 0; x < DVONN_BOARD_X_SIZE; x++) {
63 for (y = 0; y < DVONN_BOARD_Y_SIZE; y++) {
64 board->cells[x][y].type = DVONN_CELL_EMPTY;
65 board->cells[x][y].height = 0;
69 /* Cut out the unplayable "corners" of the board. */
70 for (x = 0; x < DVONN_BOARD_Y_SIZE / 2; x++) {
71 for (y = 0; y < (DVONN_BOARD_Y_SIZE / 2) - x; y++) {
72 board->cells[x][y].type = DVONN_CELL_INVALID;
74 [DVONN_BOARD_X_SIZE-1-x]
75 [DVONN_BOARD_Y_SIZE-1-y].type = DVONN_CELL_INVALID;
79 board->phase = DVONN_PHASE_PLACEMENT;
80 board->player = DVONN_PLAYER_WHITE;
85 dvonn_board_move_legal (dvonn_board_t *board,
90 if (x1 < 0 || x1 >= DVONN_BOARD_X_SIZE ||
91 y1 < 0 || y1 >= DVONN_BOARD_Y_SIZE ||
92 x2 < 0 || x2 >= DVONN_BOARD_X_SIZE ||
93 y2 < 0 || y2 >= DVONN_BOARD_Y_SIZE)
95 *error = "Invalid coordinates (not on board)";
99 if (board->cells[x1][y1].type == DVONN_CELL_INVALID) {
100 *error = "Not a valid board space";
104 if (board->cells[x1][y1].type == DVONN_CELL_EMPTY) {
105 *error = "There is no piece there to move";
109 if (board->cells[x1][y1].type != board->player) {
110 *error = "You cannot move your opponent's piece";
114 /* XXX: Need to code up DVONN-legal move calculation here. */
120 dvonn_board_next_player (dvonn_board_t *board)
122 if (board->player == DVONN_PLAYER_BLACK)
123 board->player = DVONN_PLAYER_WHITE;
125 board->player = DVONN_PLAYER_BLACK;
129 dvonn_board_place (dvonn_board_t *board,
133 if (board->phase != DVONN_PHASE_PLACEMENT) {
134 *error = "Cannot place outside of placement phase";
138 if (board->cells[x][y].type != DVONN_CELL_EMPTY) {
139 *error = "Cannot place on an occupied space";
143 if (board->moves < 3)
144 board->cells[x][y].type = DVONN_CELL_RED;
145 else if (board->moves % 2)
146 board->cells[x][y].type = DVONN_CELL_BLACK;
148 board->cells[x][y].type = DVONN_CELL_WHITE;
152 if (board->moves == 49) {
153 board->phase = DVONN_PHASE_MOVEMENT;
161 dvonn_board_move (dvonn_board_t *board,
166 if (board->phase != DVONN_PHASE_MOVEMENT) {
167 *error = "Cannot move outside of placement phase";
171 if (! dvonn_board_move_legal (board, x1, y1, x2, y2, error))
174 /* XXX: Need to execute the move here. */
176 dvonn_board_next_player (board);