Init commit
This commit is contained in:
commit
495a7cce20
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
.vscode/**
|
3
bin/.gitignore
vendored
Normal file
3
bin/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
*
|
||||
|
||||
!.gitignore
|
54
cmd/gol/gol.go
Normal file
54
cmd/gol/gol.go
Normal file
@ -0,0 +1,54 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"gol/gol"
|
||||
"gol/term"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
front := gol.New(20, 40)
|
||||
back := gol.New(20, 40)
|
||||
|
||||
// glider
|
||||
front[0][3] = true
|
||||
front[1][4] = true
|
||||
front[2][2] = true
|
||||
front[2][3] = true
|
||||
front[2][4] = true
|
||||
|
||||
// cross
|
||||
|
||||
front[16][21] = true
|
||||
front[17][21] = true
|
||||
front[18][21] = true
|
||||
|
||||
sigs := make(chan os.Signal, 1)
|
||||
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
|
||||
|
||||
term.StartFullscreen()
|
||||
term.TurnCursor(term.CursorOff)
|
||||
|
||||
loop := func() {
|
||||
ticker := time.NewTicker(250 * time.Millisecond)
|
||||
for {
|
||||
term.GoHome()
|
||||
front.PrintMe()
|
||||
front.NextGen(back)
|
||||
front, back = back, front
|
||||
select {
|
||||
case <-sigs: // przerwanie
|
||||
return
|
||||
case <-ticker.C: // upłynął czas do kolejnej generacji
|
||||
}
|
||||
}
|
||||
}
|
||||
defer func() {
|
||||
term.FinishFullscreen()
|
||||
term.TurnCursor(term.CursorOn)
|
||||
}()
|
||||
loop()
|
||||
}
|
95
gol/types.go
Normal file
95
gol/types.go
Normal file
@ -0,0 +1,95 @@
|
||||
package gol
|
||||
|
||||
import "fmt"
|
||||
|
||||
type Arena [][]bool
|
||||
|
||||
func New(ysize, xsize int) Arena {
|
||||
var arena = make([][]bool, ysize)
|
||||
for i := 0; i < ysize; i++ {
|
||||
arena[i] = make([]bool, xsize)
|
||||
}
|
||||
return arena
|
||||
}
|
||||
|
||||
func (a Arena) PrintMe() {
|
||||
for i := 0; i < len(a); i++ {
|
||||
for j := 0; j < len(a[0]); j++ {
|
||||
if a[i][j] {
|
||||
fmt.Print("\ue0b6\ue0b4")
|
||||
} else {
|
||||
//fmt.Print("\ue0b7\ue0b5")
|
||||
fmt.Print("\u2022\u2022")
|
||||
}
|
||||
}
|
||||
fmt.Println()
|
||||
}
|
||||
}
|
||||
|
||||
func (a Arena) NextGen(to Arena) {
|
||||
for y := 0; y < len(a); y++ {
|
||||
for x := 0; x < len(a[0]); x++ {
|
||||
to[y][x] = a.Life(x, y)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (a Arena) Life(x, y int) bool {
|
||||
count := a.countN(x, y)
|
||||
current := a[y][x]
|
||||
if !current && count == 3 {
|
||||
return true
|
||||
}
|
||||
if current && (count == 2 || count == 3) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type pair struct {
|
||||
x int
|
||||
y int
|
||||
}
|
||||
|
||||
func (a Arena) countN(x, y int) int {
|
||||
ysize := len(a)
|
||||
xsize := len(a[0])
|
||||
|
||||
xb := x - 1
|
||||
if xb < 0 {
|
||||
xb = xsize - 1
|
||||
}
|
||||
xa := x + 1
|
||||
if xa == xsize {
|
||||
xa = 0
|
||||
}
|
||||
|
||||
yb := y - 1
|
||||
if yb < 0 {
|
||||
yb = ysize - 1
|
||||
}
|
||||
|
||||
ya := y + 1
|
||||
if ya == ysize {
|
||||
ya = 0
|
||||
}
|
||||
|
||||
neigh := [8]pair{
|
||||
{xb, yb},
|
||||
{x, yb},
|
||||
{xa, yb},
|
||||
{xb, y},
|
||||
{xa, y},
|
||||
{xb, ya},
|
||||
{x, ya},
|
||||
{xa, ya},
|
||||
}
|
||||
|
||||
count := 0
|
||||
for _, p := range neigh {
|
||||
if a[p.y][p.x] {
|
||||
count++
|
||||
}
|
||||
}
|
||||
return count
|
||||
}
|
57
term/term.go
Normal file
57
term/term.go
Normal file
@ -0,0 +1,57 @@
|
||||
package term
|
||||
|
||||
import "fmt"
|
||||
|
||||
type CursorFlag bool
|
||||
|
||||
const (
|
||||
CursorOn CursorFlag = true
|
||||
CursorOff CursorFlag = false
|
||||
)
|
||||
|
||||
func TurnCursor(onOff CursorFlag) {
|
||||
if onOff == CursorOn {
|
||||
fmt.Printf("\033[?25h")
|
||||
} else {
|
||||
fmt.Printf("\033[?25l")
|
||||
}
|
||||
}
|
||||
|
||||
func ClearScreen() {
|
||||
fmt.Printf("\033[2J")
|
||||
}
|
||||
|
||||
func ResetTerminal() {
|
||||
fmt.Printf("\033c")
|
||||
}
|
||||
|
||||
func GoHome() {
|
||||
fmt.Printf("\033[H")
|
||||
}
|
||||
|
||||
func SaveCursor() {
|
||||
fmt.Printf("\033[s")
|
||||
}
|
||||
|
||||
func RestoreCursor() {
|
||||
fmt.Printf("\033[u")
|
||||
}
|
||||
|
||||
func EnableAlternateScreen() {
|
||||
fmt.Printf("\033[?1049h")
|
||||
}
|
||||
|
||||
func DisableAlternateScreen() {
|
||||
fmt.Printf("\033[?1049l")
|
||||
}
|
||||
|
||||
func StartFullscreen() {
|
||||
SaveCursor()
|
||||
EnableAlternateScreen()
|
||||
ClearScreen()
|
||||
}
|
||||
|
||||
func FinishFullscreen() {
|
||||
DisableAlternateScreen()
|
||||
RestoreCursor()
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user