/
arena.go
81 lines (63 loc) · 1.2 KB
/
arena.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package snake
import (
"math/rand"
"time"
)
type arena struct {
food *food
snake *snake
hasFood func(*arena, coord) bool
height int
width int
pointsChan chan (int)
}
func newArena(s *snake, p chan (int), h, w int) *arena {
rand.Seed(time.Now().UnixNano())
a := &arena{
snake: s,
height: h,
width: w,
pointsChan: p,
hasFood: hasFood,
}
a.placeFood()
return a
}
func (a *arena) moveSnake() error {
if err := a.snake.move(); err != nil {
return err
}
if a.snakeLeftArena() {
return a.snake.die()
}
if a.hasFood(a, a.snake.head()) {
go a.addPoints(a.food.points)
a.snake.length++
a.placeFood()
}
return nil
}
func (a *arena) snakeLeftArena() bool {
h := a.snake.head()
return h.x > a.width || h.y > a.height || h.x < 0 || h.y < 0
}
func (a *arena) addPoints(p int) {
a.pointsChan <- p
}
func (a *arena) placeFood() {
var x, y int
for {
x = rand.Intn(a.width)
y = rand.Intn(a.height)
if !a.isOccupied(coord{x: x, y: y}) {
break
}
}
a.food = newFood(x, y)
}
func hasFood(a *arena, c coord) bool {
return c.x == a.food.x && c.y == a.food.y
}
func (a *arena) isOccupied(c coord) bool {
return a.snake.isOnPosition(c)
}