package rules type RulesetError string func (err RulesetError) Error() string { return string(err) } 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" // 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") ) type Point struct { X int32 Y int32 } type Snake struct { ID string Body []Point Health int32 EliminatedCause string EliminatedBy string } type BoardState struct { Height int32 Width int32 Food []Point Snakes []Snake Hazards []Point } type SnakeMove struct { ID string Move string } type Ruleset interface { Name() string CreateInitialBoardState(width int32, height int32, snakeIDs []string) (*BoardState, error) CreateNextBoardState(prevState *BoardState, moves []SnakeMove) (*BoardState, error) IsGameOver(state *BoardState) (bool, error) }