flag & reveal bombs with m2 & m3
This commit is contained in:
		
							parent
							
								
									1225f8da24
								
							
						
					
					
						commit
						70fa950721
					
				| @ -1,4 +1,4 @@ | ||||
| var board = []; | ||||
| const board = []; | ||||
| 
 | ||||
| const canvas = document.getElementById("minesweeper"); | ||||
| 
 | ||||
| @ -49,6 +49,13 @@ function draw() { | ||||
|             context.fillRect(x * CELL_SIZE + CELL_SIZE - STROKE_SIZE, y * CELL_SIZE + STROKE_SIZE, STROKE_SIZE, CELL_SIZE - STROKE_SIZE); | ||||
|             context.fillRect(x * CELL_SIZE + STROKE_SIZE, y * CELL_SIZE + CELL_SIZE - STROKE_SIZE, CELL_SIZE - STROKE_SIZE, STROKE_SIZE); | ||||
| 
 | ||||
|             if (cell.isFlagged) { | ||||
|                 context.fillStyle = "red"; | ||||
|                 context.beginPath(); | ||||
|                 context.arc(x * CELL_SIZE + CELL_SIZE / 2, y * CELL_SIZE + CELL_SIZE / 2, CELL_SIZE / 3, 0, 2 * Math.PI); | ||||
|                 context.fill(); | ||||
|             } | ||||
| 
 | ||||
|             if (cell.isRevealed) { | ||||
|                 if (cell.isMine) { | ||||
|                     context.fillStyle = "black"; | ||||
| @ -144,6 +151,9 @@ function getCellNumber(x, y) { | ||||
| } | ||||
| 
 | ||||
| function revealCell(x, y) { | ||||
|     if (board[x][y].isFlagged) { | ||||
|         return; | ||||
|     } | ||||
|     board[x][y].isRevealed = true; | ||||
| 
 | ||||
|     if (getCellNumber(x, y) === 0) { | ||||
| @ -156,10 +166,60 @@ function revealCell(x, y) { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| function cellMarkedAsMine(cell) { | ||||
|     return cell.isFlagged || (cell.isRevealed && cell.isMine); | ||||
| } | ||||
| 
 | ||||
| function revealSafeCell(x, y) { | ||||
|     if (!board[x][y].isRevealed || board[x][y].isMine) { | ||||
|         return; | ||||
|     } | ||||
|     const targetValue = getCellNumber(x, y); | ||||
|     const neighbours = getCellsAround(x, y); | ||||
|     const revealedBombs = neighbours | ||||
|         .map(([x, y]) => board[x][y]) | ||||
|         .map(cellMarkedAsMine) | ||||
|         .reduce((acc, isMine) => acc + (isMine ? 1 : 0), 0); | ||||
|     if (revealedBombs === targetValue) { | ||||
|         neighbours.forEach(([x, y]) => revealCell(x, y)) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| function flagCell(x, y) { | ||||
|     if (board[x][y].isRevealed) { | ||||
|         return; | ||||
|     } | ||||
|     board[x][y].isFlagged = !board[x][y].isFlagged; | ||||
| } | ||||
| 
 | ||||
| window.addEventListener("contextmenu", event => { | ||||
|     event.preventDefault(); | ||||
| }) | ||||
| 
 | ||||
| const MouseButton = Object.freeze({ | ||||
|     Left: 0, | ||||
|     Middle: 1, | ||||
|     Right: 2, | ||||
| }) | ||||
| 
 | ||||
| window.addEventListener("mousedown", event => { | ||||
|     const { x, y } = screenCoordsToBoardCoords(event.pageX + scrollX * 2, event.pageY + scrollY * 2); | ||||
| 
 | ||||
|     revealCell(x, y); | ||||
|     switch (event.button) { | ||||
|         case MouseButton.Left: | ||||
|             revealCell(x, y); | ||||
|             break; | ||||
|         case MouseButton.Middle: | ||||
|             event.preventDefault(); | ||||
|             revealSafeCell(x, y); | ||||
|             break; | ||||
|         case MouseButton.Right: | ||||
|             event.preventDefault(); | ||||
|             flagCell(x, y); | ||||
|             break; | ||||
|         default: | ||||
|             return true; | ||||
|     } | ||||
| 
 | ||||
|     draw(); | ||||
| }); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user