DEV 1283: Arcade maze map (#77)
* add "namcap" map * adjust hazards and starting food positions * add food randomly, not on top of hazards * add exits on the top and bottom * rename to arcade_maze * add maps README * test for ArcadeMazeMap * adjustments to hazards in arcade_maze
This commit is contained in:
parent
fff551599a
commit
aa38bcd0eb
3 changed files with 404 additions and 0 deletions
297
maps/arcade_maze.go
Normal file
297
maps/arcade_maze.go
Normal file
|
|
@ -0,0 +1,297 @@
|
|||
package maps
|
||||
|
||||
import (
|
||||
"github.com/BattlesnakeOfficial/rules"
|
||||
)
|
||||
|
||||
type ArcadeMazeMap struct{}
|
||||
|
||||
func init() {
|
||||
globalRegistry.RegisterMap("arcade_maze", ArcadeMazeMap{})
|
||||
}
|
||||
|
||||
func (m ArcadeMazeMap) ID() string {
|
||||
return "arcade_maze"
|
||||
}
|
||||
|
||||
func (m ArcadeMazeMap) Meta() Metadata {
|
||||
return Metadata{
|
||||
Name: "Arcade Maze",
|
||||
Description: "Generic arcade maze map with hazard walls",
|
||||
Author: "Battlesnake",
|
||||
}
|
||||
}
|
||||
|
||||
func (m ArcadeMazeMap) SetupBoard(initialBoardState *rules.BoardState, settings rules.Settings, editor Editor) error {
|
||||
rand := settings.GetRand(0)
|
||||
|
||||
if initialBoardState.Width != 19 || initialBoardState.Height != 21 {
|
||||
return rules.RulesetError("This map can only be played on a 19X21 board")
|
||||
}
|
||||
|
||||
snakePositions := []rules.Point{
|
||||
{X: 4, Y: 7},
|
||||
{X: 14, Y: 7},
|
||||
{X: 4, Y: 17},
|
||||
{X: 14, Y: 17},
|
||||
}
|
||||
|
||||
if len(initialBoardState.Snakes) > len(snakePositions) {
|
||||
return rules.ErrorTooManySnakes
|
||||
}
|
||||
|
||||
rand.Shuffle(len(snakePositions), func(i int, j int) {
|
||||
snakePositions[i], snakePositions[j] = snakePositions[j], snakePositions[i]
|
||||
})
|
||||
|
||||
for index, snake := range initialBoardState.Snakes {
|
||||
head := snakePositions[index]
|
||||
editor.PlaceSnake(snake.ID, []rules.Point{head, head, head}, snake.Health)
|
||||
}
|
||||
|
||||
for _, hazard := range ArcadeMazeHazards {
|
||||
editor.AddHazard(hazard)
|
||||
}
|
||||
|
||||
// Add food in center
|
||||
editor.AddFood(rules.Point{X: 9, Y: 11})
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m ArcadeMazeMap) UpdateBoard(lastBoardState *rules.BoardState, settings rules.Settings, editor Editor) error {
|
||||
rand := settings.GetRand(lastBoardState.Turn)
|
||||
|
||||
// Respect FoodSpawnChance setting
|
||||
if rand.Intn(100) > settings.FoodSpawnChance {
|
||||
return nil
|
||||
}
|
||||
|
||||
foodPositions := []rules.Point{
|
||||
{X: 3, Y: 11},
|
||||
{X: 9, Y: 11},
|
||||
{X: 15, Y: 11},
|
||||
}
|
||||
|
||||
rand.Shuffle(len(foodPositions), func(i int, j int) {
|
||||
foodPositions[i], foodPositions[j] = foodPositions[j], foodPositions[i]
|
||||
})
|
||||
|
||||
for _, food := range foodPositions {
|
||||
tileIsOccupied := false
|
||||
|
||||
snakeLoop:
|
||||
for _, snake := range lastBoardState.Snakes {
|
||||
for _, point := range snake.Body {
|
||||
if point.X == food.X && point.Y == food.Y {
|
||||
tileIsOccupied = true
|
||||
break snakeLoop
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for _, existingFood := range lastBoardState.Food {
|
||||
if existingFood.X == food.X && existingFood.Y == food.Y {
|
||||
tileIsOccupied = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !tileIsOccupied {
|
||||
editor.AddFood(food)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
var ArcadeMazeHazards []rules.Point = []rules.Point{
|
||||
{X: 0, Y: 20},
|
||||
{X: 2, Y: 20},
|
||||
{X: 3, Y: 20},
|
||||
{X: 4, Y: 20},
|
||||
{X: 5, Y: 20},
|
||||
{X: 6, Y: 20},
|
||||
{X: 7, Y: 20},
|
||||
{X: 8, Y: 20},
|
||||
{X: 9, Y: 20},
|
||||
{X: 10, Y: 20},
|
||||
{X: 11, Y: 20},
|
||||
{X: 12, Y: 20},
|
||||
{X: 13, Y: 20},
|
||||
{X: 14, Y: 20},
|
||||
{X: 15, Y: 20},
|
||||
{X: 16, Y: 20},
|
||||
{X: 18, Y: 20},
|
||||
{X: 0, Y: 19},
|
||||
{X: 9, Y: 19},
|
||||
{X: 18, Y: 19},
|
||||
{X: 0, Y: 18},
|
||||
{X: 2, Y: 18},
|
||||
{X: 3, Y: 18},
|
||||
{X: 5, Y: 18},
|
||||
{X: 6, Y: 18},
|
||||
{X: 7, Y: 18},
|
||||
{X: 9, Y: 18},
|
||||
{X: 11, Y: 18},
|
||||
{X: 12, Y: 18},
|
||||
{X: 13, Y: 18},
|
||||
{X: 15, Y: 18},
|
||||
{X: 16, Y: 18},
|
||||
{X: 18, Y: 18},
|
||||
{X: 0, Y: 17},
|
||||
{X: 18, Y: 17},
|
||||
{X: 0, Y: 16},
|
||||
{X: 2, Y: 16},
|
||||
{X: 3, Y: 16},
|
||||
{X: 5, Y: 16},
|
||||
{X: 7, Y: 16},
|
||||
{X: 8, Y: 16},
|
||||
{X: 9, Y: 16},
|
||||
{X: 10, Y: 16},
|
||||
{X: 11, Y: 16},
|
||||
{X: 13, Y: 16},
|
||||
{X: 15, Y: 16},
|
||||
{X: 16, Y: 16},
|
||||
{X: 18, Y: 16},
|
||||
{X: 0, Y: 15},
|
||||
{X: 5, Y: 15},
|
||||
{X: 9, Y: 15},
|
||||
{X: 13, Y: 15},
|
||||
{X: 18, Y: 15},
|
||||
{X: 0, Y: 14},
|
||||
{X: 3, Y: 14},
|
||||
{X: 5, Y: 14},
|
||||
{X: 6, Y: 14},
|
||||
{X: 7, Y: 14},
|
||||
{X: 9, Y: 14},
|
||||
{X: 11, Y: 14},
|
||||
{X: 12, Y: 14},
|
||||
{X: 13, Y: 14},
|
||||
{X: 15, Y: 14},
|
||||
{X: 18, Y: 14},
|
||||
{X: 0, Y: 13},
|
||||
{X: 3, Y: 13},
|
||||
{X: 5, Y: 13},
|
||||
{X: 13, Y: 13},
|
||||
{X: 15, Y: 13},
|
||||
{X: 18, Y: 13},
|
||||
{X: 0, Y: 12},
|
||||
{X: 1, Y: 12},
|
||||
{X: 2, Y: 12},
|
||||
{X: 3, Y: 12},
|
||||
{X: 5, Y: 12},
|
||||
{X: 7, Y: 12},
|
||||
{X: 9, Y: 12},
|
||||
{X: 11, Y: 12},
|
||||
{X: 13, Y: 12},
|
||||
{X: 15, Y: 12},
|
||||
{X: 16, Y: 12},
|
||||
{X: 17, Y: 12},
|
||||
{X: 18, Y: 12},
|
||||
{X: 7, Y: 11},
|
||||
{X: 11, Y: 11},
|
||||
{X: 0, Y: 10},
|
||||
{X: 1, Y: 10},
|
||||
{X: 2, Y: 10},
|
||||
{X: 3, Y: 10},
|
||||
{X: 5, Y: 10},
|
||||
{X: 7, Y: 10},
|
||||
{X: 9, Y: 10},
|
||||
{X: 11, Y: 10},
|
||||
{X: 13, Y: 10},
|
||||
{X: 15, Y: 10},
|
||||
{X: 16, Y: 10},
|
||||
{X: 17, Y: 10},
|
||||
{X: 18, Y: 10},
|
||||
{X: 0, Y: 9},
|
||||
{X: 3, Y: 9},
|
||||
{X: 5, Y: 9},
|
||||
{X: 13, Y: 9},
|
||||
{X: 15, Y: 9},
|
||||
{X: 18, Y: 9},
|
||||
{X: 0, Y: 8},
|
||||
{X: 3, Y: 8},
|
||||
{X: 5, Y: 8},
|
||||
{X: 7, Y: 8},
|
||||
{X: 8, Y: 8},
|
||||
{X: 9, Y: 8},
|
||||
{X: 10, Y: 8},
|
||||
{X: 11, Y: 8},
|
||||
{X: 13, Y: 8},
|
||||
{X: 15, Y: 8},
|
||||
{X: 18, Y: 8},
|
||||
{X: 0, Y: 7},
|
||||
{X: 9, Y: 7},
|
||||
{X: 18, Y: 7},
|
||||
{X: 0, Y: 6},
|
||||
{X: 2, Y: 6},
|
||||
{X: 3, Y: 6},
|
||||
{X: 5, Y: 6},
|
||||
{X: 6, Y: 6},
|
||||
{X: 7, Y: 6},
|
||||
{X: 9, Y: 6},
|
||||
{X: 11, Y: 6},
|
||||
{X: 12, Y: 6},
|
||||
{X: 13, Y: 6},
|
||||
{X: 15, Y: 6},
|
||||
{X: 16, Y: 6},
|
||||
{X: 18, Y: 6},
|
||||
{X: 0, Y: 5},
|
||||
{X: 3, Y: 5},
|
||||
{X: 15, Y: 5},
|
||||
{X: 18, Y: 5},
|
||||
{X: 0, Y: 4},
|
||||
{X: 1, Y: 4},
|
||||
{X: 3, Y: 4},
|
||||
{X: 5, Y: 4},
|
||||
{X: 7, Y: 4},
|
||||
{X: 8, Y: 4},
|
||||
{X: 9, Y: 4},
|
||||
{X: 10, Y: 4},
|
||||
{X: 11, Y: 4},
|
||||
{X: 13, Y: 4},
|
||||
{X: 15, Y: 4},
|
||||
{X: 17, Y: 4},
|
||||
{X: 18, Y: 4},
|
||||
{X: 0, Y: 3},
|
||||
{X: 5, Y: 3},
|
||||
{X: 9, Y: 3},
|
||||
{X: 13, Y: 3},
|
||||
{X: 18, Y: 3},
|
||||
{X: 0, Y: 2},
|
||||
{X: 2, Y: 2},
|
||||
{X: 3, Y: 2},
|
||||
{X: 4, Y: 2},
|
||||
{X: 5, Y: 2},
|
||||
{X: 6, Y: 2},
|
||||
{X: 7, Y: 2},
|
||||
{X: 9, Y: 2},
|
||||
{X: 11, Y: 2},
|
||||
{X: 12, Y: 2},
|
||||
{X: 13, Y: 2},
|
||||
{X: 14, Y: 2},
|
||||
{X: 15, Y: 2},
|
||||
{X: 16, Y: 2},
|
||||
{X: 18, Y: 2},
|
||||
{X: 0, Y: 1},
|
||||
{X: 18, Y: 1},
|
||||
{X: 0, Y: 0},
|
||||
{X: 2, Y: 0},
|
||||
{X: 3, Y: 0},
|
||||
{X: 4, Y: 0},
|
||||
{X: 5, Y: 0},
|
||||
{X: 6, Y: 0},
|
||||
{X: 7, Y: 0},
|
||||
{X: 8, Y: 0},
|
||||
{X: 9, Y: 0},
|
||||
{X: 10, Y: 0},
|
||||
{X: 11, Y: 0},
|
||||
{X: 12, Y: 0},
|
||||
{X: 13, Y: 0},
|
||||
{X: 14, Y: 0},
|
||||
{X: 15, Y: 0},
|
||||
{X: 16, Y: 0},
|
||||
{X: 18, Y: 0},
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue