github.com/korsakjakub/snk@v0.0.0-20230625212658-1d6c119c67ee/game.go (about) 1 package main 2 3 import ( 4 "math/rand" 5 "time" 6 ) 7 8 type move rune 9 10 const ( 11 zero move = iota 12 up 13 down 14 left 15 right 16 ) 17 18 type game struct { 19 snake actor 20 fruit actor 21 screen screen 22 points int 23 } 24 25 func (g game) move(move move) game { 26 snake := g.snake.s 27 snake = append(snake[:0], snake[1:]...) 28 direction := coord{x: 0, y: 0} 29 switch move { 30 case up: 31 direction.y = -1 32 case down: 33 direction.y = 1 34 case left: 35 direction.x = -1 36 case right: 37 direction.x = 1 38 } 39 g.snake.s = snake.moduloAdd(direction) 40 snake = g.snake.s 41 if g.snake.s.contains(g.fruit.s[0]) { 42 rand.Seed(time.Now().UnixNano()) 43 g.fruit.s[0] = g.generateNewCoords() 44 g.snake.s = snake.moduloAdd(direction) 45 g.points += 1 46 } 47 g.screen = *g.screen.drawScreen(g.snake, g.fruit) 48 return g 49 } 50 51 func (g game) drawScreen() *screen { 52 return g.screen.drawScreen(g.snake, g.fruit) 53 } 54 55 func (g game) generateNewCoords() coord { 56 i := 1 57 c := coord{} 58 for { 59 i += 1 60 c = coord{x: rand.Int() % g.screen.width, y: rand.Int() % g.screen.height} 61 if !g.snake.s.contains(c) || i == g.screen.width*g.screen.height { 62 break 63 } 64 } 65 return c 66 }