aboutsummaryrefslogtreecommitdiff
path: root/mines.c
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2005-05-31 18:24:39 +0000
committerSimon Tatham <anakin@pobox.com>2005-05-31 18:24:39 +0000
commit4a9db8a002dd858a5ae482b4151a3c1c2cec28c4 (patch)
tree67fe15efc847dc5e4462200640ed1f39e906a29c /mines.c
parent739609cec2262017aaabb7e34ce75af784fd683c (diff)
downloadpuzzles-4a9db8a002dd858a5ae482b4151a3c1c2cec28c4.zip
puzzles-4a9db8a002dd858a5ae482b4151a3c1c2cec28c4.tar.gz
puzzles-4a9db8a002dd858a5ae482b4151a3c1c2cec28c4.tar.bz2
puzzles-4a9db8a002dd858a5ae482b4151a3c1c2cec28c4.tar.xz
Now _this_ is what Undo ought to be doing in a Minesweeper clone.
Rather than revealing the entire mine layout when you die, we now only reveal the one mine that killed you. You can then Undo and continue playing, without having spoiled the rest of the grid for yourself. The number of times you've died is counted in the status line (and is not reduced by Undo :-). Amusingly, I think this in itself is quite a good way of dealing with ambiguous sections in a Minesweeper grid: they no longer _completely_ spoil your enjoyment of the game, because you can still play the remainder of the grid even if you haven't got a completely clean sweep. Just my luck that I should invent the idea when I've already arranged for ambiguous sections to be absent :-) [originally from svn r5886]
Diffstat (limited to 'mines.c')
-rw-r--r--mines.c30
1 files changed, 14 insertions, 16 deletions
diff --git a/mines.c b/mines.c
index 42543cc..6ecdc95 100644
--- a/mines.c
+++ b/mines.c
@@ -2142,22 +2142,11 @@ static int open_square(game_state *state, int x, int y)
if (state->layout->mines[y*w+x]) {
/*
- * The player has landed on a mine. Bad luck. Expose all
- * the mines.
+ * The player has landed on a mine. Bad luck. Expose the
+ * mine that killed them, but not the rest (in case they
+ * want to Undo and carry on playing).
*/
state->dead = TRUE;
- for (yy = 0; yy < h; yy++)
- for (xx = 0; xx < w; xx++) {
- if (state->layout->mines[yy*w+xx] &&
- (state->grid[yy*w+xx] == -2 ||
- state->grid[yy*w+xx] == -3)) {
- state->grid[yy*w+xx] = 64;
- }
- if (!state->layout->mines[yy*w+xx] &&
- state->grid[yy*w+xx] == -1) {
- state->grid[yy*w+xx] = 66;
- }
- }
state->grid[y*w+x] = 65;
return -1;
}
@@ -2439,6 +2428,7 @@ static char *game_text_format(game_state *state)
struct game_ui {
int hx, hy, hradius; /* for mouse-down highlights */
int flash_is_death;
+ int deaths;
};
static game_ui *new_ui(game_state *state)
@@ -2446,6 +2436,7 @@ static game_ui *new_ui(game_state *state)
game_ui *ui = snew(game_ui);
ui->hx = ui->hy = -1;
ui->hradius = 0;
+ ui->deaths = 0;
ui->flash_is_death = FALSE; /* *shrug* */
return ui;
}
@@ -2522,6 +2513,8 @@ static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds,
ret = dup_game(from);
ret->just_used_solve = FALSE;
open_square(ret, cx, cy);
+ if (ret->dead)
+ ui->deaths++;
return ret;
}
@@ -2554,6 +2547,8 @@ static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds,
(ret->grid[(cy+dy)*ret->w+(cx+dx)] == -2 ||
ret->grid[(cy+dy)*ret->w+(cx+dx)] == -3))
open_square(ret, cx+dx, cy+dy);
+ if (ret->dead)
+ ui->deaths++;
return ret;
}
}
@@ -2931,15 +2926,18 @@ static void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate,
{
char statusbar[512];
if (state->dead) {
- sprintf(statusbar, "GAME OVER!");
+ sprintf(statusbar, "DEAD!");
} else if (state->won) {
if (state->used_solve)
sprintf(statusbar, "Auto-solved.");
else
sprintf(statusbar, "COMPLETED!");
} else {
- sprintf(statusbar, "Mines marked: %d / %d", markers, mines);
+ sprintf(statusbar, "Marked: %d / %d", markers, mines);
}
+ if (ui->deaths)
+ sprintf(statusbar + strlen(statusbar),
+ " Deaths: %d", ui->deaths);
status_bar(fe, statusbar);
}
}