From 067cd364b6918e0441c88122d0dd8d0563bead36 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 25 Jun 2025 15:15:37 -0700 Subject: [PATCH] feat: minesweeper autoreveal now cascades --- frontend/src/app/live/draw/page.tsx | 4 +-- frontend/src/app/minesweeper/page.tsx | 6 ++--- frontend/src/hooks/useMinesweeper.ts | 36 +++++++++++---------------- 3 files changed, 19 insertions(+), 27 deletions(-) diff --git a/frontend/src/app/live/draw/page.tsx b/frontend/src/app/live/draw/page.tsx index 1fc8079..d084bee 100644 --- a/frontend/src/app/live/draw/page.tsx +++ b/frontend/src/app/live/draw/page.tsx @@ -200,8 +200,8 @@ export default function DrawPage() {

Draw

Draw with others in the room!

-

- ctl+drag/middle drag to pan

-

- 2 finger to pan

+

• ctl+drag/middle drag to pan

+

• 2 finger to pan

diff --git a/frontend/src/app/minesweeper/page.tsx b/frontend/src/app/minesweeper/page.tsx index d4903e4..fa283f9 100644 --- a/frontend/src/app/minesweeper/page.tsx +++ b/frontend/src/app/minesweeper/page.tsx @@ -22,9 +22,9 @@ export default function MinesweeperPage() {

Minesweeper

Normal Minesweeper rules

-

- Left click to reveal cells

-

- Right click to place flags

-

- Reveal all non-mine cells to win

+

• Left click to reveal cells

+

• Right click to place flags

+

• Reveal all non-mine cells to win

diff --git a/frontend/src/hooks/useMinesweeper.ts b/frontend/src/hooks/useMinesweeper.ts index 3fac4e2..746885d 100644 --- a/frontend/src/hooks/useMinesweeper.ts +++ b/frontend/src/hooks/useMinesweeper.ts @@ -69,23 +69,16 @@ const generateMines = (state: GameStatus, mines: number, startRow: number, start } const revealCascade = (state: GameStatus, row: number, col: number) => { - if (row < 0 || row >= state.board.length || col < 0 || col >= state.board[0].length) return; - if (state.board[row][col].state !== 'hidden') return; - state.board[row][col].state = 'revealed' - state.revealed++; - if (state.board[row][col].adj !== 0) return; - for (let r = -1; r <= 1; r++) - for (let c = -1; c <= 1; c++) - revealCascade(state, row + r, col + c); -} - -const revealHelper = (state: GameStatus, row: number, col: number) => { if (row < 0 || row >= state.board.length || col < 0 || col >= state.board[0].length) return; if (state.board[row][col].state !== 'hidden') return; state.board[row][col].state = 'revealed' state.revealed++; if (state.board[row][col].hasMine) state.status = 'lost'; else if (state.revealed === state.revealNeeded) state.status = 'won'; + else if (state.board[row][col].adj === 0) + for (let r = -1; r <= 1; r++) + for (let c = -1; c <= 1; c++) + revealCascade(state, row + r, col + c); } export default function useMinesweeper(props: MineProps) { @@ -107,17 +100,16 @@ export default function useMinesweeper(props: MineProps) { if (gameState.board[row][col].state === 'revealed') setState(produce(state => { let flags = 0; - for (let r = -1; r <= 1; r++) { - for (let c = -1; c <= 1; c++) { - if (row + r < 0 || row + r >= state.board.length - || col + c < 0 || col + c >= state.board[0].length) continue; - if (state.board[row + r][col + c].state === 'flagged') flags++; - } - } - if (flags === state.board[row][col].adj) - for (let r = -1; r <= 1; r++) - for (let c = -1; c <= 1; c++) - revealHelper(state, row + r, col + c); + for (let r = -1; r <= 1; r++) + for (let c = -1; c <= 1; c++) + if (row + r >= 0 && row + r < state.board.length + && col + c >= 0 && col + c < state.board[0].length + && state.board[row + r][col + c].state === 'flagged') flags++; + + if (flags !== state.board[row][col].adj) return; + for (let r = -1; r <= 1; r++) + for (let c = -1; c <= 1; c++) + revealCascade(state, row + r, col + c); })) //manual reveal else setState(produce(state => {