Init commit

This commit is contained in:
Arek 2025-02-11 22:30:13 +01:00
commit 495a7cce20
6 changed files with 213 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.vscode/**

3
bin/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
*
!.gitignore

54
cmd/gol/gol.go Normal file
View 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()
}

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module gol
go 1.19

95
gol/types.go Normal file
View 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
View 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()
}