Vary the behaviour of Mines's solve function depending on whether the

user is already in the 'dead' state when they press it. If so, we
reveal the rest of the mines in the grid as if it were the Windows
Minesweeper 'you lose' display, which provides information showing
what the user got wrong. (Otherwise they have to repeatedly flick back
and forth between Solve and Undo if they want to work out which flag
they placed wrongly.)

If you press Solve while alive, however, the existing behaviour
remains unchanged.

(This feature was suggested by Clive Jones a couple of weeks after I
first wrote Mines, and I've finally got round to doing it!)

[originally from svn r9561]
This commit is contained in:
Simon Tatham
2012-06-10 07:20:18 +00:00
parent 48e9767a20
commit 6567260eb0

33
mines.c
View File

@ -2596,13 +2596,15 @@ static game_state *execute_move(game_state *from, char *move)
game_state *ret; game_state *ret;
if (!strcmp(move, "S")) { if (!strcmp(move, "S")) {
/*
* Simply expose the entire grid as if it were a completed
* solution.
*/
int yy, xx; int yy, xx;
ret = dup_game(from); ret = dup_game(from);
if (!ret->dead) {
/*
* If the player is still alive at the moment of pressing
* Solve, expose the entire grid as if it were a completed
* solution.
*/
for (yy = 0; yy < ret->h; yy++) for (yy = 0; yy < ret->h; yy++)
for (xx = 0; xx < ret->w; xx++) { for (xx = 0; xx < ret->w; xx++) {
@ -2623,8 +2625,29 @@ static game_state *execute_move(game_state *from, char *move)
ret->grid[yy*ret->w+xx] = v; ret->grid[yy*ret->w+xx] = v;
} }
} }
} else {
/*
* If the player pressed Solve _after dying_, show a full
* corrections grid in the style of standard Minesweeper.
* Players who don't like Mines's behaviour on death of
* only showing the mine that killed you (so that in case
* of a typo you can undo and carry on without the rest of
* the grid being spoiled) can use this to get the display
* that ordinary Minesweeper would have given them.
*/
for (yy = 0; yy < ret->h; yy++)
for (xx = 0; xx < ret->w; xx++) {
int pos = yy*ret->w+xx;
if ((ret->grid[pos] == -2 || ret->grid[pos] == -3) &&
ret->layout->mines[pos]) {
ret->grid[pos] = 64;
} else if (ret->grid[pos] == -1 &&
!ret->layout->mines[pos]) {
ret->grid[pos] = 66;
}
}
}
ret->used_solve = TRUE; ret->used_solve = TRUE;
ret->won = TRUE;
return ret; return ret;
} else { } else {