commit 53beca5d3d452fb0d62fac4b59d2ba80936bae98 Author: bdnugget <1001337108312v3@gmail.com> Date: Sat Mar 15 20:59:24 2025 +0100 Working minefield init and neighbour count diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..b0d7e64 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module gitea.boner.be/bdnugget/minesweeper + +go 1.24.1 diff --git a/main.go b/main.go new file mode 100644 index 0000000..00c15ef --- /dev/null +++ b/main.go @@ -0,0 +1,80 @@ +package main + +import ( + "fmt" + "time" + "math/rand/v2" +) + +type gameState struct { + isGameOver bool + rows int + cols int + numMines int + field [][]point + gameStartedAt time.Time +} + +type point struct { + isMine bool + isOpen bool + isMarked bool + numNeighbouringMines int +} + +func (gs *gameState) applyToNeighbours(x, y int, do func(x, y int)) { + dx := []int{-1, -1, -1, 0, 0, 1, 1, 1} + dy := []int{-1, 0, 1, -1, 1, -1, 0, 1} + for i := range dx { + neighbourX := x + dx[i] + neighbourY := y + dy[i] + if neighbourX >= 0 && neighbourY >= 0 && neighbourX < gs.rows && neighbourY < gs.cols { + do(neighbourX, neighbourY) + } + } +} + +func (gs *gameState) printField() { + for _, row := range gs.field { + for _, cell := range row { + if cell.isMine { + fmt.Print("*") + } else { + fmt.Print(cell.numNeighbouringMines) + } + } + fmt.Println() + } +} + +func (gs *gameState) initField() { + gs.field = make([][]point, gs.rows) + for i := range gs.field { + gs.field[i] = make([]point, gs.cols) + } + + for i := range gs.numMines { + ranX := rand.IntN(gs.rows -1) + ranY := rand.IntN(gs.cols-1) + if !gs.field[ranX][ranY].isMine { + gs.field[ranX][ranY].isMine = true + gs.applyToNeighbours(ranX, ranY, func(x, y int) { + gs.field[x][y].numNeighbouringMines++ + }) + } else { + i-- + } + } +} + +func main() { + gs := &gameState{ + rows: 10, + cols: 10, + numMines: 5, + gameStartedAt: time.Now(), + } + + gs.initField() + gs.printField() +}