mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 08:01:30 -07:00
Cleaned up execute_move a little
This commit is contained in:

committed by
Simon Tatham

parent
80c1a69329
commit
a614347a3e
27
towers.c
27
towers.c
@ -1391,35 +1391,29 @@ static char *interpret_move(const game_state *state, game_ui *ui,
|
|||||||
static game_state *execute_move(const game_state *from, const char *move)
|
static game_state *execute_move(const game_state *from, const char *move)
|
||||||
{
|
{
|
||||||
int w = from->par.w, a = w*w;
|
int w = from->par.w, a = w*w;
|
||||||
game_state *ret;
|
game_state *ret = dup_game(from);
|
||||||
int x, y, i, n;
|
int x, y, i, n;
|
||||||
|
|
||||||
if (move[0] == 'S') {
|
if (move[0] == 'S') {
|
||||||
ret = dup_game(from);
|
|
||||||
ret->completed = ret->cheated = TRUE;
|
ret->completed = ret->cheated = TRUE;
|
||||||
|
|
||||||
for (i = 0; i < a; i++) {
|
for (i = 0; i < a; i++) {
|
||||||
if (move[i+1] < '1' || move[i+1] > '0'+w) {
|
if (move[i+1] < '1' || move[i+1] > '0'+w)
|
||||||
free_game(ret);
|
goto badmove;
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
ret->grid[i] = move[i+1] - '0';
|
ret->grid[i] = move[i+1] - '0';
|
||||||
ret->pencil[i] = 0;
|
ret->pencil[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (move[a+1] != '\0') {
|
if (move[a+1] != '\0')
|
||||||
free_game(ret);
|
goto badmove;
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
} else if ((move[0] == 'P' || move[0] == 'R') &&
|
} else if ((move[0] == 'P' || move[0] == 'R') &&
|
||||||
sscanf(move+1, "%d,%d,%d", &x, &y, &n) == 3 &&
|
sscanf(move+1, "%d,%d,%d", &x, &y, &n) == 3 &&
|
||||||
x >= 0 && x < w && y >= 0 && y < w && n >= 0 && n <= w) {
|
x >= 0 && x < w && y >= 0 && y < w && n >= 0 && n <= w) {
|
||||||
if (from->clues->immutable[y*w+x])
|
if (from->clues->immutable[y*w+x])
|
||||||
return NULL;
|
goto badmove;
|
||||||
|
|
||||||
ret = dup_game(from);
|
|
||||||
if (move[0] == 'P' && n > 0) {
|
if (move[0] == 'P' && n > 0) {
|
||||||
ret->pencil[y*w+x] ^= 1L << n;
|
ret->pencil[y*w+x] ^= 1L << n;
|
||||||
} else {
|
} else {
|
||||||
@ -1437,14 +1431,17 @@ static game_state *execute_move(const game_state *from, const char *move)
|
|||||||
* starting point when following through a set of
|
* starting point when following through a set of
|
||||||
* diagnostics output by the standalone solver.)
|
* diagnostics output by the standalone solver.)
|
||||||
*/
|
*/
|
||||||
ret = dup_game(from);
|
|
||||||
for (i = 0; i < a; i++) {
|
for (i = 0; i < a; i++) {
|
||||||
if (!ret->grid[i])
|
if (!ret->grid[i])
|
||||||
ret->pencil[i] = (1L << (w+1)) - (1L << 1);
|
ret->pencil[i] = (1L << (w+1)) - (1L << 1);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
} else
|
}
|
||||||
return NULL; /* couldn't parse move string */
|
|
||||||
|
badmove:
|
||||||
|
/* couldn't parse move string */
|
||||||
|
free_game(ret);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user