rules

package module
v1.0.31 Latest Latest
Warning

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

Go to latest
Published: Mar 30, 2022 License: AGPL-3.0 Imports: 4 Imported by: 0

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

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

func EliminateSnakesStandard

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

func FeedSnakesStandard

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

func GameOverSolo

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

func GameOverSquad

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

func GameOverStandard

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

func GrowSnakesConstrictor

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

func MoveSnakesStandard

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

func MoveSnakesWrapped

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

func NewRulesetBuilder

func NewRulesetBuilder() *rulesetBuilder

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

func PlaceFoodAutomatically

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

func PlaceFoodFixed(b *BoardState) error

func PlaceFoodRandomly

func PlaceFoodRandomly(b *BoardState, n int32) error

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

func PlaceSnake

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

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

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

func PlaceSnakesRandomly

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

func PopulateHazardsRoyale

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

func ReduceSnakeHealthStandard

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

func RemoveFoodConstrictor

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

func ResurrectSnakesSquad

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

func ShareAttributesSquad

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

func SpawnFoodStandard

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

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

func NewBoardState(width, height int32) *BoardState

NewBoardState returns an empty but fully initialized BoardState

func (*BoardState) Clone

func (prevState *BoardState) Clone() *BoardState

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

type ConstrictorRuleset

type ConstrictorRuleset struct {
	StandardRuleset
}

func (*ConstrictorRuleset) CreateNextBoardState

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

func (*ConstrictorRuleset) ModifyInitialBoardState

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

func (*ConstrictorRuleset) Name

func (r *ConstrictorRuleset) Name() string

type Point

type Point struct {
	X int32
	Y int32
}

type RoyaleRuleset

type RoyaleRuleset struct {
	StandardRuleset

	Seed int64

	ShrinkEveryNTurns int32
}

func (*RoyaleRuleset) CreateNextBoardState

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

func (*RoyaleRuleset) Name

func (r *RoyaleRuleset) Name() string

func (RoyaleRuleset) Settings

func (r RoyaleRuleset) Settings() Settings

type RoyaleSettings

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

type RulesetError string

func (RulesetError) Error

func (err RulesetError) Error() string

type Settings

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

type SoloRuleset struct {
	StandardRuleset
}

func (*SoloRuleset) IsGameOver

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

func (*SoloRuleset) Name

func (r *SoloRuleset) Name() string

type SquadRuleset

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

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

func (*SquadRuleset) IsGameOver

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

func (*SquadRuleset) Name

func (r *SquadRuleset) Name() string

func (SquadRuleset) Settings

func (r SquadRuleset) Settings() Settings

type SquadSettings

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

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

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

func (*StandardRuleset) IsGameOver

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

func (*StandardRuleset) ModifyInitialBoardState

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

func (*StandardRuleset) Name

func (r *StandardRuleset) Name() string

func (StandardRuleset) Settings

func (r StandardRuleset) Settings() Settings

type WrappedRuleset

type WrappedRuleset struct {
	StandardRuleset
}

func (*WrappedRuleset) CreateNextBoardState

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

func (*WrappedRuleset) Name

func (r *WrappedRuleset) Name() string

Directories

Path Synopsis
cli

Jump to

Keyboard shortcuts

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