aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoop Kiefte <ikojba@gmail.com>2020-09-07 01:34:57 +0200
committerJoop Kiefte <ikojba@gmail.com>2020-09-07 01:34:57 +0200
commit295f19e88a7a7ebd1de019b091a362324a369809 (patch)
tree6833e4832e44b6ede9c780c429fa36f28effef02
parent749ecb0e4ed365be186ad3ee65c8a04634ac247b (diff)
Working demov0.0.3
-rw-r--r--main.go34
-rw-r--r--tris/core.go39
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