From 295f19e88a7a7ebd1de019b091a362324a369809 Mon Sep 17 00:00:00 2001 From: Joop Kiefte Date: Mon, 7 Sep 2020 01:34:57 +0200 Subject: Working demo --- main.go | 34 ++++++++++++++++++++-------------- tris/core.go | 39 ++++++++++++++++++++++----------------- 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/main.go b/main.go index d55e031..4f910be 100644 --- a/main.go +++ b/main.go @@ -13,7 +13,7 @@ func GetKey() []byte { t, _ := term.Open("/dev/tty") term.RawMode(t) key := make([]byte, 3) - t.SetReadTimeout(time.Second / 60) + t.SetReadTimeout(time.Second / 1000) t.Read(key) t.Restore() t.Close() @@ -24,27 +24,37 @@ func main() { var f tris.Field fmt.Print("\033[2J") // Clear screen b := tris.NewBag() - p := b.Pick() + b, p := b.Pick() + t := time.Tick(time.Second / 60) + ds := time.NewTicker(time.Second / 10) for { -// fmt.Print("\033[2J") // Clear screen - if p.Lock <= 0 { - f = f.Add(p) - p = b.Pick() - } + fmt.Print("\033[2J") // Clear screen fmt.Print("\033[0;0H") // Position to 0,0 fmt.Println(f.Add(p).String()) - if !p.Drop(f) { - fmt.Println("Should drop one") - p.Lock-- + select { + case <-ds.C: + np, ok := p.Drop(f) + if ok { + p = np + p.Lock = time.Now() + } + if time.Now().Sub(p.Lock) > tris.LockDelay { + f = f.Add(p) + b, p = b.Pick() + } + case <-t: } key := GetKey() switch key[0] { case 27: // Escape, read the arrow key pressed switch key[2] { case 65: // Up + p.Rot = (p.Rot + 1)%4 case 66: // Down case 67: // Right + p.X++ case 68: // Left + p.X-- default: fmt.Println("...escape, escape!") return @@ -55,10 +65,6 @@ func main() { case 'Q': fmt.Println("...never let an engineer pick the name of your software?") return - default: - if key[0] != 0 { - fmt.Print(string(key[0])) - } } } } diff --git a/tris/core.go b/tris/core.go index 3121adf..c5d0ea2 100644 --- a/tris/core.go +++ b/tris/core.go @@ -1,5 +1,10 @@ package tris +import ( + "math/rand" + "time" +) + type Point struct { X, Y int } @@ -32,29 +37,28 @@ type Placement struct { X int Y int Rot Rotation - Lock int + Lock time.Time } -func (p *Placement) Drop(f Field) bool { +func (p Placement) Drop(f Field) (Placement, bool) { newp := p newp.Y++ if !newp.Collide(f) { - p = newp - return true + return newp, true } - return false + return p, false } -func (p Placement) Collide(f Field) bool { +func (p Placement) Collide(f Field) bool { //TODO: Fix first piece collision bug pf, ok := p.Field() for x := 0; x < 9; x++ { for y := 0; y < 19; y++ { if f[y][x] && pf[y][x] { - return false + return true } } } - return ok + return !ok } func (p Placement) Field() (Field, bool) { @@ -88,26 +92,27 @@ func (p Placement) Points() []Point { type Bag []Piece -var LockDelay = 30 +var LockDelay = time.Second/2 var ReferenceBag = Bag{IPiece, JPiece, LPiece, OPiece, SPiece, TPiece, ZPiece} -func NewBag() *Bag { +func NewBag() Bag { b := ReferenceBag.Randomize() - return &b + return b } -func (b Bag) Randomize() Bag { //TODO: implement randomizer +func (b Bag) Randomize() Bag { + rand.Shuffle(len(b), func(i, j int) { b[i], b[j] = b[j], b[i] }) return b } -func (b *Bag) Pick() Placement { - if len(*b) == 0 { +func (b Bag) Pick() (Bag, Placement) { + if len(b) == 0 { b = NewBag() } - piece := Placement{piece: (*b)[0], X: 3, Y: -2, Lock: LockDelay} - *b = (*b)[1:] - return piece + piece := Placement{piece: b[0], X: 3, Y: -2, Lock: time.Now()} + b = b[1:] + return b, piece } type Field [20][10]bool -- cgit v1.2.3-70-g09d2