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  }