using int64 for grid

This commit is contained in:
2024-05-23 17:07:21 +02:00
parent 8241cf83f2
commit 62c38be1df
3 changed files with 21 additions and 50 deletions

49
game.go
View File

@@ -46,8 +46,8 @@ func (game *Game) Layout(outsideWidth, outsideHeight int) (int, int) {
return game.ScreenWidth, game.ScreenHeight return game.ScreenWidth, game.ScreenHeight
} }
func (game *Game) CheckRule(state, neighbors int) int { func (game *Game) CheckRule(state int64, neighbors int64) int64 {
var nextstate int var nextstate int64
// The standard Game of Life is symbolized in rule-string notation // The standard Game of Life is symbolized in rule-string notation
// as B3/S23 (23/3 here). A cell is born if it has exactly three // as B3/S23 (23/3 here). A cell is born if it has exactly three
@@ -56,11 +56,11 @@ func (game *Game) CheckRule(state, neighbors int) int {
// what is required for a dead cell to be born. // what is required for a dead cell to be born.
if state == 0 && Contains(game.Rule.Birth, neighbors) { if state == 0 && Contains(game.Rule.Birth, neighbors) {
nextstate = 1 nextstate = Alive
} else if state == 1 && Contains(game.Rule.Death, neighbors) { } else if state == 1 && Contains(game.Rule.Death, neighbors) {
nextstate = 1 nextstate = Alive
} else { } else {
nextstate = 0 nextstate = Dead
} }
return nextstate return nextstate
@@ -91,8 +91,8 @@ func (game *Game) UpdateCells() {
// change state of current cell in next grid // change state of current cell in next grid
game.Grids[next].Data[y][x] = nextstate game.Grids[next].Data[y][x] = nextstate
if state == 1 { if state == Alive && nextstate == Dead {
game.History.Data[y][x] = 1 game.History.Data[y][x] = game.Generations
} }
} }
} }
@@ -242,7 +242,7 @@ func (game *Game) Update() error {
} }
// set a cell to alive or dead // set a cell to alive or dead
func (game *Game) ToggleCellOnCursorPos(alive int) { func (game *Game) ToggleCellOnCursorPos(alive int64) {
// use cursor pos relative to the world // use cursor pos relative to the world
worldX, worldY := game.Camera.ScreenToWorld(ebiten.CursorPosition()) worldX, worldY := game.Camera.ScreenToWorld(ebiten.CursorPosition())
x := int(worldX) / game.Cellsize x := int(worldX) / game.Cellsize
@@ -363,35 +363,6 @@ func (game *Game) InitGrid(grid *Grid) {
game.History = history game.History = history
} }
func (game *Game) _InitGrid(grid *Grid) {
grida := &Grid{Data: make([][]int, game.Height)}
gridb := &Grid{Data: make([][]int, game.Height)}
history := &Grid{Data: make([][]int, game.Height)}
for y := 0; y < game.Height; y++ {
grida.Data[y] = make([]int, game.Width)
gridb.Data[y] = make([]int, game.Width)
history.Data[y] = make([]int, game.Width)
if !game.Empty {
for x := 0; x < game.Width; x++ {
if rand.Intn(game.Density) == 1 {
history.Data[y][x] = 1
grida.Data[y][x] = 1
}
}
}
}
game.Grids = []*Grid{
grida,
gridb,
}
game.History = history
}
// prepare tile images // prepare tile images
func (game *Game) InitTiles() { func (game *Game) InitTiles() {
game.Black = color.RGBA{0, 0, 0, 0xff} game.Black = color.RGBA{0, 0, 0, 0xff}
@@ -454,8 +425,8 @@ func (game *Game) Init() {
} }
// count the living neighbors of a cell // count the living neighbors of a cell
func (game *Game) CountNeighbors(x, y int) int { func (game *Game) CountNeighbors(x, y int) int64 {
sum := 0 var sum int64
// so we look ad all 8 neighbors surrounding us. In case we are on // so we look ad all 8 neighbors surrounding us. In case we are on
// an edge, then we'll look at the neighbor on the other side of // an edge, then we'll look at the neighbor on the other side of

12
grid.go
View File

@@ -11,7 +11,7 @@ import (
) )
type Grid struct { type Grid struct {
Data [][]int Data [][]int64
Width, Height int Width, Height int
} }
@@ -20,11 +20,11 @@ func NewGrid(width, height int) *Grid {
grid := &Grid{ grid := &Grid{
Height: height, Height: height,
Width: width, Width: width,
Data: make([][]int, height), Data: make([][]int64, height),
} }
for y := 0; y < height; y++ { for y := 0; y < height; y++ {
grid.Data[y] = make([]int, width) grid.Data[y] = make([]int64, width)
} }
return grid return grid
@@ -54,7 +54,7 @@ func (grid *Grid) SaveState(filename string) error {
for y, _ := range grid.Data { for y, _ := range grid.Data {
for _, cell := range grid.Data[y] { for _, cell := range grid.Data[y] {
_, err := file.WriteString(strconv.Itoa(cell)) _, err := file.WriteString(strconv.FormatInt(cell, 10))
if err != nil { if err != nil {
return fmt.Errorf("failed to write to state file: %w", err) return fmt.Errorf("failed to write to state file: %w", err)
} }
@@ -79,10 +79,10 @@ func LoadState(filename string) (*Grid, error) {
for scanner.Scan() { for scanner.Scan() {
items := strings.Split(scanner.Text(), "") items := strings.Split(scanner.Text(), "")
row := make([]int, len(items)) row := make([]int64, len(items))
for idx, item := range items { for idx, item := range items {
num, err := strconv.Atoi(item) num, err := strconv.ParseInt(item, 10, 64)
if err != nil { if err != nil {
return nil, err return nil, err
} }

10
rule.go
View File

@@ -8,17 +8,17 @@ import (
// a GOL rule // a GOL rule
type Rule struct { type Rule struct {
Birth []int Birth []int64
Death []int Death []int64
} }
// parse one part of a GOL rule into rule slice // parse one part of a GOL rule into rule slice
func NumbersToList(numbers string) []int { func NumbersToList(numbers string) []int64 {
list := []int{} list := []int64{}
items := strings.Split(numbers, "") items := strings.Split(numbers, "")
for _, item := range items { for _, item := range items {
num, err := strconv.Atoi(item) num, err := strconv.ParseInt(item, 10, 64)
if err != nil { if err != nil {
log.Fatalf("failed to parse game rule part <%s>: %s", numbers, err) log.Fatalf("failed to parse game rule part <%s>: %s", numbers, err)
} }