Working minefield init and neighbour count

This commit is contained in:
bdnugget 2025-03-15 20:59:24 +01:00
commit 53beca5d3d
2 changed files with 83 additions and 0 deletions

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module gitea.boner.be/bdnugget/minesweeper
go 1.24.1

80
main.go Normal file
View File

@ -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()
}