From 6394dcb8190b1c5b7d46041ccf1e95a3ceac426b Mon Sep 17 00:00:00 2001 From: Camden Dixie O'Brien Date: Thu, 6 Mar 2025 22:05:03 +0000 Subject: [PATCH] Probe known-safe tiles --- main.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/main.c b/main.c index e1d0ecd..b2ac62b 100644 --- a/main.c +++ b/main.c @@ -5,6 +5,7 @@ #include "puzz.h" +#include #include #include #include @@ -26,6 +27,23 @@ static void setadj(puzz_t field, int x, int y, uint8_t from, uint8_t to) } } +static void getadj(puzz_t field, int *x, int *y, uint8_t val) +{ + for (int yp = *y - 1; yp < *y + 2; ++yp) { + for (int xp = *x - 1; xp < *x + 2; ++xp) { + if (xp < 0 || xp >= WIDTH || yp < 0 || yp >= HEIGHT + || (xp == *x && yp == *y)) + continue; + if (field[xp][yp] == val) { + *x = xp; + *y = yp; + return; + } + } + } + assert(false); +} + int main(void) { struct timeval tv; @@ -46,6 +64,7 @@ int main(void) int x = rand() % WIDTH; int y = rand() % HEIGHT; + probe: if (probe(x, y, field) == DEAD) { field[x][y] = KILLER; break; @@ -58,9 +77,16 @@ int main(void) const int mines = countadj(field, x, y, MINE); const int unknowns = countadj(field, x, y, UNKNOWN); + if (unknowns == 0) + continue; - if (unknowns > 0 && mines + unknowns == field[x][y]) + if (mines + unknowns == field[x][y]) setadj(field, x, y, UNKNOWN, MINE); + + if (mines == field[x][y]) { + getadj(field, &x, &y, UNKNOWN); + goto probe; + } } }