rules

package module
v1.0.32 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 11, 2022 License: AGPL-3.0 Imports: 4 Imported by: 14

README

BattlesnakeOfficial/rules

codecov

Battlesnake rules and game logic, implemented as a Go module. This code is used in production at play.battlesnake.com. Issues and contributions welcome!

CLI for Running Battlesnake Games Locally

This repo provides a simple CLI tool to run games locally against your dev environment.

Installation

Download precompiled binaries here:
https://github.com/BattlesnakeOfficial/rules/releases

Install as a Go package. Requires Go 1.17 or higher. [Download]

go get github.com/BattlesnakeOfficial/rules/cli/battlesnake

Compile from source. Also requires Go 1.17 or higher.

git clone git@github.com:BattlesnakeOfficial/rules.git
cd rules
go build -o battlesnake ./cli/battlesnake/main.go
Usage

Example command to run a game locally:

battlesnake play -W 11 -H 11 --name <SNAKE_NAME> --url <SNAKE_URL> -g solo -v

For more details, see the CLI README.

FAQ

Can I run games locally?

Yes! See the included CLI.

How is this different from the old Battlesnake engine?

The old game engine was re-written in early 2020 to handle a higher volume of concurrent games. As part of that rebuild we moved the game logic into a separate Go module that gets compiled into the production engine.

This provides two benefits: it makes it much simpler/easier to build new game modes, and it allows the community to get more involved in game development (without the maintenance overhead of the entire game engine).

Feedback
  • Do you have an issue or suggestions for this repository? Head over to our Feedback Repository today and let us know!

Documentation

Index

Constants

View Source
const (
	MoveUp    = "up"
	MoveDown  = "down"
	MoveRight = "right"
	MoveLeft  = "left"

	BoardSizeSmall  = 7
	BoardSizeMedium = 11
	BoardSizeLarge  = 19

	SnakeMaxHealth = 100
	SnakeStartSize = 3

	// bvanvugt - TODO: Just return formatted strings instead of codes?
	NotEliminated                   = ""
	EliminatedByCollision           = "snake-collision"
	EliminatedBySelfCollision       = "snake-self-collision"
	EliminatedByOutOfHealth         = "out-of-health"
	EliminatedByHeadToHeadCollision = "head-collision"
	EliminatedByOutOfBounds         = "wall-collision"
	EliminatedBySquad               = "squad-eliminated"

	// TODO - Error consts
	ErrorTooManySnakes   = RulesetError("too many snakes for fixed start positions")
	ErrorNoRoomForSnake  = RulesetError("not enough space to place snake")
	ErrorNoRoomForFood   = RulesetError("not enough space to place food")
	ErrorNoMoveFound     = RulesetError("move not provided for snake")
	ErrorZeroLengthSnake = RulesetError("snake is length zero")

	// Ruleset / game type names
	GameTypeConstrictor = "constrictor"
	GameTypeRoyale      = "royale"
	GameTypeSolo        = "solo"
	GameTypeSquad       = "squad"
	GameTypeStandard    = "standard"
	GameTypeWrapped     = "wrapped"

	// Game creation parameter names
	ParamGameType            = "name"
	ParamFoodSpawnChance     = "foodSpawnChance"
	ParamMinimumFood         = "minimumFood"
	ParamHazardDamagePerTurn = "damagePerTurn"
	ParamHazardMap           = "hazardMap"
	ParamHazardMapAuthor     = "hazardMapAuthor"
	ParamShrinkEveryNTurns   = "shrinkEveryNTurns"
	ParamAllowBodyCollisions = "allowBodyCollisions"
	ParamSharedElimination   = "sharedElimination"
	ParamSharedHealth        = "sharedHealth"
	ParamSharedLength        = "sharedLength"
)

Variables

This section is empty.

Functions

func DamageHazardsStandard added in v1.0.28

func DamageHazardsStandard(b *BoardState, settings Settings, moves []SnakeMove) (bool, error)

func EliminateSnakesStandard added in v1.0.28

func EliminateSnakesStandard(b *BoardState, settings Settings, moves []SnakeMove) (bool, error)

func FeedSnakesStandard added in v1.0.28

func FeedSnakesStandard(b *BoardState, settings Settings, moves []SnakeMove) (bool, error)

func GameOverSolo added in v1.0.28

func GameOverSolo(b *BoardState, settings Settings, moves []SnakeMove) (bool, error)

func GameOverSquad added in v1.0.28

func GameOverSquad(b *BoardState, settings Settings, moves []SnakeMove) (bool, error)

func GameOverStandard added in v1.0.28

func GameOverStandard(b *BoardState, settings Settings, moves []SnakeMove) (bool, error)

func GrowSnakesConstrictor added in v1.0.28

func GrowSnakesConstrictor(b *BoardState, settings Settings, moves []SnakeMove) (bool, error)

func MoveSnakesStandard added in v1.0.28

func MoveSnakesStandard(b *BoardState, settings Settings, moves []SnakeMove) (bool, error)

func MoveSnakesWrapped added in v1.0.28

func MoveSnakesWrapped(b *BoardState, settings Settings, moves []SnakeMove) (bool, error)

func NewRulesetBuilder added in v1.0.28

func NewRulesetBuilder() *rulesetBuilder

NewRulesetBuilder returns an instance of a builder for the Ruleset types.

func PlaceFoodAutomatically added in v1.0.21

func PlaceFoodAutomatically(b *BoardState) error

PlaceFoodAutomatically initializes the array of food based on the size of the board and the number of snakes.

func PlaceFoodFixed added in v1.0.21

func PlaceFoodFixed(b *BoardState) error

func PlaceFoodRandomly added in v1.0.21

func PlaceFoodRandomly(b *BoardState, n int32) error

PlaceFoodRandomly adds up to n new food to the board in random unoccupied squares

func PlaceSnake added in v1.0.21

func PlaceSnake(b *BoardState, snakeID string, body []Point) error

PlaceSnake adds a snake to the board with the given ID and body coordinates.

func PlaceSnakesAutomatically added in v1.0.21

func PlaceSnakesAutomatically(b *BoardState, snakeIDs []string) error

PlaceSnakesAutomatically initializes the array of snakes based on the provided snake IDs and the size of the board.

func PlaceSnakesFixed added in v1.0.21

func PlaceSnakesFixed(b *BoardState, snakeIDs []string) error

func PlaceSnakesRandomly added in v1.0.21

func PlaceSnakesRandomly(b *BoardState, snakeIDs []string) error

func PopulateHazardsRoyale added in v1.0.28

func PopulateHazardsRoyale(b *BoardState, settings Settings, moves []SnakeMove) (bool, error)

func ReduceSnakeHealthStandard added in v1.0.28

func ReduceSnakeHealthStandard(b *BoardState, settings Settings, moves []SnakeMove) (bool, error)

func RemoveFoodConstrictor added in v1.0.28

func RemoveFoodConstrictor(b *BoardState, settings Settings, moves []SnakeMove) (bool, error)

func ResurrectSnakesSquad added in v1.0.28

func ResurrectSnakesSquad(b *BoardState, settings Settings, moves []SnakeMove) (bool, error)

func ShareAttributesSquad added in v1.0.28

func ShareAttributesSquad(b *BoardState, settings Settings, moves []SnakeMove) (bool, error)

func SpawnFoodStandard added in v1.0.28

func SpawnFoodStandard(b *BoardState, settings Settings, moves []SnakeMove) (bool, error)

Types

type BoardState

type BoardState struct {
	Turn    int32
	Height  int32
	Width   int32
	Food    []Point
	Snakes  []Snake
	Hazards []Point
}

func CreateDefaultBoardState added in v1.0.21

func CreateDefaultBoardState(width int32, height int32, snakeIDs []string) (*BoardState, error)

CreateDefaultBoardState is a convenience function for fully initializing a "default" board state with snakes and food. In a real game, the engine may generate the board without calling this function, or customize the results based on game-specific settings.

func NewBoardState added in v1.0.21

func NewBoardState(width, height int32) *BoardState

NewBoardState returns an empty but fully initialized BoardState

func (*BoardState) Clone added in v1.0.21

func (prevState *BoardState) Clone() *BoardState

Clone returns a deep copy of prevState that can be safely modified inside Ruleset.CreateNextBoardState

type ConstrictorRuleset added in v1.0.17

type ConstrictorRuleset struct {
	StandardRuleset
}

func (*ConstrictorRuleset) CreateNextBoardState added in v1.0.17

func (r *ConstrictorRuleset) CreateNextBoardState(prevState *BoardState, moves []SnakeMove) (*BoardState, error)

func (*ConstrictorRuleset) ModifyInitialBoardState added in v1.0.21

func (r *ConstrictorRuleset) ModifyInitialBoardState(initialBoardState *BoardState) (*BoardState, error)

func (*ConstrictorRuleset) Name added in v1.0.26

func (r *ConstrictorRuleset) Name() string

type Point

type Point struct {
	X int32
	Y int32
}

type RoyaleRuleset added in v1.0.9

type RoyaleRuleset struct {
	StandardRuleset

	Seed int64

	ShrinkEveryNTurns int32
}

func (*RoyaleRuleset) CreateNextBoardState added in v1.0.9

func (r *RoyaleRuleset) CreateNextBoardState(prevState *BoardState, moves []SnakeMove) (*BoardState, error)

func (*RoyaleRuleset) Name added in v1.0.18

func (r *RoyaleRuleset) Name() string

func (RoyaleRuleset) Settings added in v1.0.28

func (r RoyaleRuleset) Settings() Settings

type RoyaleSettings added in v1.0.28

type RoyaleSettings struct {
	ShrinkEveryNTurns int32 `json:"shrinkEveryNTurns"`
	// contains filtered or unexported fields
}

RoyaleSettings contains settings that are specific to the "royale" game mode

type Ruleset

type Ruleset interface {
	Name() string
	ModifyInitialBoardState(initialState *BoardState) (*BoardState, error)
	CreateNextBoardState(prevState *BoardState, moves []SnakeMove) (*BoardState, error)
	IsGameOver(state *BoardState) (bool, error)
	// Settings provides the game settings that are relevant to the ruleset.
	Settings() Settings
}

type RulesetError added in v1.0.17

type RulesetError string

func (RulesetError) Error added in v1.0.17

func (err RulesetError) Error() string

type Settings added in v1.0.28

type Settings struct {
	FoodSpawnChance     int32          `json:"foodSpawnChance"`
	MinimumFood         int32          `json:"minimumFood"`
	HazardDamagePerTurn int32          `json:"hazardDamagePerTurn"`
	HazardMap           string         `json:"hazardMap"`
	HazardMapAuthor     string         `json:"hazardMapAuthor"`
	RoyaleSettings      RoyaleSettings `json:"royale"`
	SquadSettings       SquadSettings  `json:"squad"`
}

Settings contains all settings relevant to a game. It is used by game logic to take a previous game state and produce a next game state.

type Snake

type Snake struct {
	ID               string
	Body             []Point
	Health           int32
	EliminatedCause  string
	EliminatedOnTurn int32
	EliminatedBy     string
}

type SnakeMove

type SnakeMove struct {
	ID   string
	Move string
}

type SoloRuleset added in v1.0.4

type SoloRuleset struct {
	StandardRuleset
}

func (*SoloRuleset) IsGameOver added in v1.0.4

func (r *SoloRuleset) IsGameOver(b *BoardState) (bool, error)

func (*SoloRuleset) Name added in v1.0.18

func (r *SoloRuleset) Name() string

type SquadRuleset added in v1.0.8

type SquadRuleset struct {
	StandardRuleset

	SquadMap map[string]string

	// These are intentionally designed so that they default to a standard game.
	AllowBodyCollisions bool
	SharedElimination   bool
	SharedHealth        bool
	SharedLength        bool
}

func (*SquadRuleset) CreateNextBoardState added in v1.0.8

func (r *SquadRuleset) CreateNextBoardState(prevState *BoardState, moves []SnakeMove) (*BoardState, error)

func (*SquadRuleset) IsGameOver added in v1.0.8

func (r *SquadRuleset) IsGameOver(b *BoardState) (bool, error)

func (*SquadRuleset) Name added in v1.0.18

func (r *SquadRuleset) Name() string

func (SquadRuleset) Settings added in v1.0.28

func (r SquadRuleset) Settings() Settings

type SquadSettings added in v1.0.28

type SquadSettings struct {
	AllowBodyCollisions bool `json:"allowBodyCollisions"`
	SharedElimination   bool `json:"sharedElimination"`
	SharedHealth        bool `json:"sharedHealth"`
	SharedLength        bool `json:"sharedLength"`
	// contains filtered or unexported fields
}

SquadSettings contains settings that are specific to the "squad" game mode

type StageFunc added in v1.0.28

type StageFunc func(*BoardState, Settings, []SnakeMove) (bool, error)

StageFunc represents a single stage of an ordered pipeline and applies custom logic to the board state each turn. It is expected to modify the boardState directly. The return values are a boolean (to indicate whether the game has ended as a result of the stage) and an error if any errors occurred during the stage.

Errors should be treated as meaning the stage failed and the board state is now invalid.

type StandardRuleset

type StandardRuleset struct {
	FoodSpawnChance     int32 // [0, 100]
	MinimumFood         int32
	HazardDamagePerTurn int32
	HazardMap           string // optional
	HazardMapAuthor     string // optional
}

func (*StandardRuleset) CreateNextBoardState added in v1.0.4

func (r *StandardRuleset) CreateNextBoardState(prevState *BoardState, moves []SnakeMove) (*BoardState, error)

func (*StandardRuleset) IsGameOver added in v1.0.4

func (r *StandardRuleset) IsGameOver(b *BoardState) (bool, error)

func (*StandardRuleset) ModifyInitialBoardState added in v1.0.21

func (r *StandardRuleset) ModifyInitialBoardState(initialState *BoardState) (*BoardState, error)

func (*StandardRuleset) Name added in v1.0.18

func (r *StandardRuleset) Name() string

func (StandardRuleset) Settings added in v1.0.28

func (r StandardRuleset) Settings() Settings

type WrappedRuleset added in v1.0.21

type WrappedRuleset struct {
	StandardRuleset
}

func (*WrappedRuleset) CreateNextBoardState added in v1.0.21

func (r *WrappedRuleset) CreateNextBoardState(prevState *BoardState, moves []SnakeMove) (*BoardState, error)

func (*WrappedRuleset) Name added in v1.0.26

func (r *WrappedRuleset) Name() string

Directories

Path Synopsis
cli
battlesnake command

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL