More test coverage.

This commit is contained in:
Brad Van Vugt 2020-01-03 12:56:33 -08:00
parent 9f411e097c
commit 72b6d78c93
2 changed files with 187 additions and 35 deletions

View file

@ -22,6 +22,8 @@ const (
EliminatedByStarvation = "starvation"
EliminatedByHeadToHeadCollision = "head-collision"
EliminatedByOutOfBounds = "wall-collision"
// TODO - Error consts
)
func (r *StandardRuleset) CreateInitialBoardState(width int32, height int32, snakeIDs []string) (*BoardState, error) {
@ -95,8 +97,8 @@ func (r *StandardRuleset) placeSnakesFixed(b *BoardState) error {
func (r *StandardRuleset) placeSnakesRandomly(b *BoardState) error {
for i := 0; i < len(b.Snakes); i++ {
unoccupiedPoints := r.getUnoccupiedPoints(b)
if len(unoccupiedPoints) < len(b.Snakes)-i {
return errors.New("not enough empty squares to place snakes")
if len(unoccupiedPoints) <= 0 {
return errors.New("not enough space to place snake")
}
p := unoccupiedPoints[rand.Intn(len(unoccupiedPoints))]
for j := 0; j < SnakeStartSize; j++ {
@ -107,8 +109,7 @@ func (r *StandardRuleset) placeSnakesRandomly(b *BoardState) error {
}
func (r *StandardRuleset) placeFood(b *BoardState) error {
r.spawnFood(b, len(b.Snakes))
return nil
return r.spawnFood(b, len(b.Snakes))
}
func (r *StandardRuleset) isKnownBoardSize(b *BoardState) bool {
@ -188,6 +189,11 @@ func (r *StandardRuleset) moveSnakes(b *BoardState, moves []SnakeMove) error {
}
}
// Do not move eliminated snakes
if snake.EliminatedCause != NotEliminated {
continue
}
var newHead = Point{}
switch move.Move {
case MoveDown:
@ -227,7 +233,9 @@ func (r *StandardRuleset) moveSnakes(b *BoardState, moves []SnakeMove) error {
func (r *StandardRuleset) reduceSnakeHealth(b *BoardState) error {
for i := 0; i < len(b.Snakes); i++ {
b.Snakes[i].Health = b.Snakes[i].Health - 1
if b.Snakes[i].EliminatedCause == NotEliminated {
b.Snakes[i].Health = b.Snakes[i].Health - 1
}
}
return nil
}
@ -313,18 +321,22 @@ func (r *StandardRuleset) snakeHasLostHeadToHead(s *Snake, other *Snake) bool {
}
func (r *StandardRuleset) feedSnakes(b *BoardState) error {
var newFood []Point
var tail Point
newFood := []Point{}
for _, food := range b.Food {
foodHasBeenEaten := false
for _, snake := range b.Snakes {
for i := 0; i < len(b.Snakes); i++ {
snake := &b.Snakes[i]
// Ignore eliminated and zero-length snakes, they can't eat.
if snake.EliminatedCause != NotEliminated || len(snake.Body) == 0 {
continue
}
if snake.Body[0].X == food.X && snake.Body[0].Y == food.Y {
foodHasBeenEaten = true
// Update snake
snake.Body = append(snake.Body, snake.Body[len(snake.Body)-1])
snake.Health = SnakeMaxHealth
tail = snake.Body[len(snake.Body)-1]
snake.Body = append(snake.Body, tail)
}
}
// Persist food to next BoardState if not eaten
@ -339,12 +351,12 @@ func (r *StandardRuleset) feedSnakes(b *BoardState) error {
func (r *StandardRuleset) maybeSpawnFood(b *BoardState, n int) error {
if rand.Float32() <= FoodSpawnChance {
r.spawnFood(b, n)
return r.spawnFood(b, n)
}
return nil
}
func (r *StandardRuleset) spawnFood(b *BoardState, n int) {
func (r *StandardRuleset) spawnFood(b *BoardState, n int) error {
for i := 0; i < n; i++ {
unoccupiedPoints := r.getUnoccupiedPoints(b)
if len(unoccupiedPoints) > 0 {
@ -352,6 +364,7 @@ func (r *StandardRuleset) spawnFood(b *BoardState, n int) {
b.Food = append(b.Food, newFood)
}
}
return nil
}
func (r *StandardRuleset) getUnoccupiedPoints(b *BoardState) []Point {