Working minefield init and neighbour count
This commit is contained in:
commit
53beca5d3d
80
main.go
Normal file
80
main.go
Normal 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()
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user