}
static loa_bool_t
-loa_game_move (loa_game_t *game, const char * peer,
- int x1, int y1, int x2, int y2)
+loa_game_move (loa_game_t *game, const char * peer, loa_move_t *move)
{
char *error;
- if (! loa_board_move (&game->board, x1, y1, x2, y2, &error)) {
- loudgame_sendf (&game->lg, peer, "Illegal move: %c%d%c%d: %s",
- 'a' + x1, LOA_BOARD_SIZE - y1,
- 'a' + x2, LOA_BOARD_SIZE - y2,
- error);
+ if (! loa_board_move (&game->board, move, &error)) {
+ loudgame_sendf (&game->lg, peer, "Illegal move: %s: %s",
+ loa_move_to_string (move), error);
return FALSE;
}
static void
loa_game_handle_move (loa_game_t *game,
const char *peer,
- const char *move)
+ const char *move_string)
{
- char xc1, xc2;
- int x1, y1, x2, y2;
- int matched;
+ loa_move_t move;
- matched = sscanf (move, " %c %d %c %d ", &xc1, &y1, &xc2, &y2);
- if (matched != 4) {
+ if (! loa_move_init_from_string (&move, move_string)) {
loudgame_sendf (&game->lg, peer,
- "Error: The 'move' command requires a move of the form 'b1d3'");
+ "Error: The 'move' command requires a move of the form 'b1-d3'");
return;
}
- x1 = tolower (xc1) - 'a';
- x2 = tolower (xc2) - 'a';
- /* We use an upper-left origin internally. */
- y1 = LOA_BOARD_SIZE - y1;
- y2 = LOA_BOARD_SIZE - y2;
- if (! loa_game_move (game, peer, x1, y1, x2, y2))
+ if (! loa_game_move (game, peer, &move))
return;
- loudgame_broadcastf (&game->lg, "%c%d%c%d",
- 'a' + x1, LOA_BOARD_SIZE - y1,
- 'a' + x2, LOA_BOARD_SIZE - y2);
+ loudgame_broadcastf (&game->lg, "%s", loa_move_to_string (&move));
- if (loa_board_is_won (&game->board, x2, y2))
+ if (loa_board_is_won (&game->board, move.x2, move.y2))
loudgame_broadcastf (&game->lg, "%s wins", peer);
}
move->y2 = 0;
move->is_capture = 0;
- matched = sscanf (string, "%c%d%c%c%d", &xc1, &y1, &sep, &xc2, &y2);
- if (matched != 5)
+ matched = sscanf (string, " %c%d%c%c%d", &xc1, &y1, &sep, &xc2, &y2);
+ if (matched != 5) {
+ printf ("Matched only %d fields of %s\n", matched, string);
return FALSE;
+ }
x1 = tolower (xc1) - 'a';
x2 = tolower (xc2) - 'a';
int
loa_board_move (loa_board_t *board,
- int x1, int y1,
- int x2, int y2,
+ loa_move_t *move,
char **error)
{
loa_cell_t cell;
- loa_move_t move;
-
- move.x1 = x1;
- move.y1 = y1;
- move.x2 = x2;
- move.y2 = y2;
- if (! loa_board_move_legal (board, &move, error))
+ if (! loa_board_move_legal (board, move, error))
return FALSE;
- cell = loa_board_remove_piece (board, x1, y1);
+ cell = loa_board_remove_piece (board, move->x1, move->y1);
assert (cell == board->player);
- cell = loa_board_remove_piece (board, x2, y2);
+ cell = loa_board_remove_piece (board, move->x2, move->y2);
if (cell == LOA_CELL_EMPTY) {
- move.is_capture = FALSE;
+ move->is_capture = FALSE;
} else {
assert (cell != board->player);
- move.is_capture = TRUE;
+ move->is_capture = TRUE;
}
- loa_board_add_piece (board, x2, y2, board->player);
+ loa_board_add_piece (board,
+ move->x2, move->y2,
+ board->player);
- loa_board_add_move_to_history (board, &move);
+ loa_board_add_move_to_history (board, move);
loa_board_next_player (board);