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