bugfix and added text mode

This commit is contained in:
ston1th 2021-06-03 20:34:33 +02:00
commit 50d5af714d

148
main.go
View file

@ -1,6 +1,7 @@
package main package main
import ( import (
"flag"
"fmt" "fmt"
"image" "image"
"image/color" "image/color"
@ -114,8 +115,7 @@ func max(i int) int {
return i return i
} }
func (g *GOL) check(x, y int) { func (g *GOL) n(x, y int) (n int) {
n := 0
for i := min(x - 1); i <= max(x+1); i++ { for i := min(x - 1); i <= max(x+1); i++ {
for j := min(y - 1); j <= max(y+1); j++ { for j := min(y - 1); j <= max(y+1); j++ {
if g.grid1.G[i][j] { if g.grid1.G[i][j] {
@ -123,6 +123,11 @@ func (g *GOL) check(x, y int) {
} }
} }
} }
return
}
func (g *GOL) check(x, y int) {
n := g.n(x, y)
if g.grid1.G[x][y] { if g.grid1.G[x][y] {
n-- n--
switch n { switch n {
@ -136,6 +141,8 @@ func (g *GOL) check(x, y int) {
} else { } else {
if n == 3 { if n == 3 {
g.grid2.G[x][y] = true g.grid2.G[x][y] = true
} else {
g.grid2.G[x][y] = false
} }
} }
} }
@ -158,57 +165,108 @@ func (g *GOL) Calc() (gr *Grid) {
g.Gen++ g.Gen++
return g.grid() return g.grid()
} }
var text bool
func main() { func main() {
flag.BoolVar(&text, "text", false, "text mode")
flag.Parse()
gol := NewGOL() gol := NewGOL()
gc := make(chan *Grid, 10) gc := make(chan *Grid, 10)
ic := make(chan image.Image, 10) if text {
go func() { go func() {
o := jpeg.Options{100} buf := make([]byte, (size*size)+size*6)
img := <-ic for {
for { buf[0] = '+'
select { c := 1
case img = <-ic: for ; c < size+1; c++ {
default: buf[c] = '-'
}
if jpeg.Encode(os.Stdout, img, &o) == nil {
os.Stdout.Sync()
}
time.Sleep(time.Millisecond * 16)
}
}()
go func() {
s := size * zoom
r := image.Rect(0, 0, s, s)
for {
img := image.NewGray(r)
grid := <-gc
x := 0
y := 0
var c color.Color
for i := 0; i < size; i++ {
for j := 0; j < size; j++ {
if grid.G[i][j] {
c = color.Black
} else {
c = color.White
}
for a := 0; a < zoom; a++ {
for b := 0; b < zoom; b++ {
img.Set(x+a, y+b, c)
}
}
y += zoom
} }
x += zoom buf[c] = '+'
y = 0 c++
buf[c] = '\n'
c++
grid := <-gc
for i := 0; i < size; i++ {
buf[c] = '|'
c++
for j := 0; j < size; j++ {
if grid.G[j][i] {
buf[c] = '#'
} else {
buf[c] = ' '
}
c++
}
buf[c] = '|'
c++
buf[c] = '\n'
c++
}
buf[c] = '+'
c++
for i := 0; i < size; i++ {
buf[c] = '-'
c++
}
buf[c] = '+'
c++
buf[c] = '\n'
fmt.Printf("\r%s", string(buf))
} }
ic <- img }()
} } else {
}() ic := make(chan image.Image, 10)
go func() {
o := jpeg.Options{100}
img := <-ic
for {
select {
case img = <-ic:
default:
}
if jpeg.Encode(os.Stdout, img, &o) == nil {
os.Stdout.Sync()
}
time.Sleep(time.Millisecond * 16)
}
}()
go func() {
s := size * zoom
r := image.Rect(0, 0, s, s)
for {
img := image.NewGray(r)
grid := <-gc
x := 0
y := 0
var c color.Color
for i := 0; i < size; i++ {
for j := 0; j < size; j++ {
if grid.G[i][j] {
c = color.Black
} else {
c = color.White
}
for a := 0; a < zoom; a++ {
for b := 0; b < zoom; b++ {
img.Set(x+a, y+b, c)
}
}
y += zoom
}
x += zoom
y = 0
}
ic <- img
}
}()
}
for { for {
gc <- gol.Calc() gc <- gol.Calc()
fmt.Fprintf(os.Stderr, "\rGeneration: %d", gol.Gen) if !text {
fmt.Fprintf(os.Stderr, "\rGeneration: %d", gol.Gen)
}
time.Sleep(time.Second / gps) time.Sleep(time.Second / gps)
} }
} }