Source code for hisss.game.encoding
from dataclasses import dataclass, field
[docs]
@dataclass(kw_only=True)
class BattleSnakeEncodingConfig:
"""
Configuration for encoding a BattleSnake game state into a NumPy tensor.
This dataclass defines which specific spatial layers and global features
should be included when translating the JSON-like game state into a numerical
tensor representation, typically used as an observation space for reinforcement
learning agents or neural networks.
"""
#: bool: Includes a spatial layer representing the current locations of food on the board.
include_current_food: bool
#: bool: Includes a layer for predicted or upcoming food spawns, if supported by the environment.
include_next_food: bool
#: bool: Includes a base layer representing the playable board area (useful for identifying boundaries).
include_board: bool
#: bool: Includes the current turn number of the game as a feature.
include_number_of_turns: bool
#: bool: If True, all enemy snakes share the same encoding layers. If False, enemies are separated into individual layers.
compress_enemies: bool
#: bool: Encodes snake body segments using a one-hot representation to differentiate the order of body parts.
include_snake_body_as_one_hot: bool
#: bool: Includes a standard spatial layer showing the occupied positions of all snake bodies.
include_snake_body: bool
#: bool: Includes a specific spatial layer indicating the positions of snake heads.
include_snake_head: bool
#: bool: Includes a specific spatial layer indicating the positions of snake tails.
include_snake_tail: bool
#: bool: Includes a feature or layer representing the current health (starvation countdown) of the snakes.
include_snake_health: bool
#: bool: Includes a feature or layer representing the current length of the snakes.
include_snake_length: bool
#: bool: Includes a spatial distance map (e.g., Manhattan distance from the ego snake's head to other tiles).
include_distance_map: bool
#: bool: If True, flattens the multi-dimensional spatial tensor into a 1D array before returning.
flatten: bool
#: bool: Centers the spatial observation tensor around the ego snake's head (egocentric view) rather than using an absolute board (allocentric view).
centered: bool
#: bool: Includes a layer detailing area control metrics, such as a Voronoi partition showing which snake is closest to which tiles.
include_area_control: bool
#: bool: Includes a feature or gradient layer representing the distance to the nearest food item.
include_food_distance: bool
#: bool: Includes a spatial layer mapping hazard zones (e.g., the shrinking hazard sauce in Royale mode).
include_hazards: bool
#: bool: Includes a feature representing the distance from the ego snake's head to its own tail.
include_tail_distance: bool
#: bool: Includes a global feature representing the total number of food items currently spawned on the board.
include_num_food_on_board: bool = False
#: bool: Includes an environment temperature input feature, often used for modulating exploration or custom game modes.
temperature_input: bool = False
#: bool: If True, represents the temperature input as a single global scalar value.
single_temperature_input: bool = True
#: float: Sets a fixed probability for food spawning. A value of `-1` indicates that the default game rules for food spawn chance should be used.
fixed_food_spawn_chance: float = -1.0
#: bool: Includes a mask layer representing the limited field of view of the snake, useful for partially observable training environments.
include_view_mask: bool = False
def num_layers_general(cfg: BattleSnakeEncodingConfig) -> int:
result = (
cfg.include_current_food
+ cfg.include_next_food
+ cfg.include_board
+ cfg.include_number_of_turns
+ cfg.include_distance_map
+ cfg.include_hazards
+ cfg.include_num_food_on_board
)
if cfg.temperature_input and cfg.single_temperature_input:
result += 1
return result
def layers_per_player(cfg: BattleSnakeEncodingConfig) -> int:
result = (
cfg.include_snake_body
+ cfg.include_snake_head
+ cfg.include_snake_tail
+ cfg.include_snake_health
+ cfg.include_snake_length
+ cfg.include_area_control
+ cfg.include_food_distance
+ cfg.include_tail_distance
+ cfg.include_snake_body_as_one_hot
)
return result
def layers_per_enemy(cfg: BattleSnakeEncodingConfig) -> int:
result = layers_per_player(cfg)
if cfg.temperature_input and not cfg.single_temperature_input:
result += 1
return result
# Standard Mode #####################################################
@dataclass
class SimpleBattleSnakeEncodingConfig(BattleSnakeEncodingConfig):
include_current_food: bool = field(default=True)
include_next_food: bool = field(default=False)
include_board: bool = field(default=True)
include_number_of_turns: bool = field(default=False)
compress_enemies: bool = field(default=True)
include_snake_body_as_one_hot: bool = field(default=False)
include_snake_body: bool = field(default=True)
include_snake_head: bool = field(default=True)
include_snake_tail: bool = field(default=False)
include_snake_health: bool = field(default=False)
include_snake_length: bool = field(default=False)
include_distance_map: bool = field(default=False)
flatten: bool = field(default=False)
centered: bool = field(default=False)
include_area_control: bool = field(default=False)
include_food_distance: bool = field(default=False)
include_hazards: bool = field(default=False)
include_tail_distance: bool = field(default=False)
include_num_food_on_board: bool = field(default=False)
fixed_food_spawn_chance: float = field(default=-1)
@dataclass
class VanillaBattleSnakeEncodingConfig(BattleSnakeEncodingConfig):
include_current_food: bool = field(default=True)
include_next_food: bool = field(default=False)
include_board: bool = field(default=True)
include_number_of_turns: bool = field(default=False)
compress_enemies: bool = field(default=True)
include_snake_body_as_one_hot: bool = field(default=True)
include_snake_body: bool = field(default=True)
include_snake_head: bool = field(default=True)
include_snake_tail: bool = field(default=True)
include_snake_health: bool = field(default=True)
include_snake_length: bool = field(default=True)
include_distance_map: bool = field(default=True)
flatten: bool = field(default=False)
centered: bool = field(default=True)
include_area_control: bool = field(default=False)
include_food_distance: bool = field(default=False)
include_hazards: bool = field(default=False)
include_tail_distance: bool = field(default=False)
include_num_food_on_board: bool = field(default=False)
fixed_food_spawn_chance: float = field(default=-1)
@dataclass
class BestBattleSnakeEncodingConfig(BattleSnakeEncodingConfig):
include_current_food: bool = field(default=True)
include_next_food: bool = field(default=False)
include_board: bool = field(default=True)
include_number_of_turns: bool = field(default=False)
compress_enemies: bool = field(default=True)
include_snake_body_as_one_hot: bool = field(default=True)
include_snake_body: bool = field(default=True)
include_snake_head: bool = field(default=True)
include_snake_tail: bool = field(default=True)
include_snake_health: bool = field(default=True)
include_snake_length: bool = field(default=True)
include_distance_map: bool = field(default=True)
flatten: bool = field(default=False)
centered: bool = field(default=True)
include_area_control: bool = field(default=True)
include_food_distance: bool = field(default=True)
include_hazards: bool = field(default=False)
include_tail_distance: bool = field(default=True)
include_num_food_on_board: bool = field(default=True)
fixed_food_spawn_chance: float = field(default=-1)
# Constrictor Mode #####################################################
@dataclass
class SimpleConstrictorEncodingConfig(BattleSnakeEncodingConfig):
include_current_food: bool = field(default=False)
include_next_food: bool = field(default=False)
include_board: bool = field(default=True)
include_number_of_turns: bool = field(default=False)
compress_enemies: bool = field(default=True)
include_snake_body_as_one_hot: bool = field(default=True)
include_snake_body: bool = field(default=False)
include_snake_head: bool = field(default=True)
include_snake_tail: bool = field(default=False)
include_snake_health: bool = field(default=False)
include_snake_length: bool = field(default=False)
include_distance_map: bool = field(default=False)
flatten: bool = field(default=False)
centered: bool = field(default=True)
include_area_control: bool = field(default=False)
include_food_distance: bool = field(default=False)
include_hazards: bool = field(default=False)
include_tail_distance: bool = field(default=False)
include_num_food_on_board: bool = field(default=False)
fixed_food_spawn_chance: float = field(default=-1)
@dataclass
class BestConstrictorEncodingConfig(BattleSnakeEncodingConfig):
include_current_food: bool = field(default=False)
include_next_food: bool = field(default=False)
include_board: bool = field(default=True)
include_number_of_turns: bool = field(default=False)
compress_enemies: bool = field(default=True)
include_snake_body_as_one_hot: bool = field(default=True)
include_snake_body: bool = field(default=False)
include_snake_head: bool = field(default=True)
include_snake_tail: bool = field(default=False)
include_snake_health: bool = field(default=False)
include_snake_length: bool = field(default=False)
include_distance_map: bool = field(default=True)
flatten: bool = field(default=False)
centered: bool = field(default=True)
include_area_control: bool = field(default=False)
include_food_distance: bool = field(default=False)
include_hazards: bool = field(default=False)
include_tail_distance: bool = field(default=False)
include_num_food_on_board: bool = field(default=False)
fixed_food_spawn_chance: float = field(default=-1)
# Restricted Mode #####################################################
@dataclass
class BestRestrictedEncodingConfig(BattleSnakeEncodingConfig):
include_current_food: bool = field(default=True)
include_next_food: bool = field(default=False)
include_board: bool = field(default=True)
include_number_of_turns: bool = field(default=True)
compress_enemies: bool = field(default=True)
include_snake_body_as_one_hot: bool = field(default=True)
include_snake_body: bool = field(default=True)
include_snake_head: bool = field(default=True)
include_snake_tail: bool = field(default=True)
include_snake_health: bool = field(default=True)
include_snake_length: bool = field(default=True)
include_distance_map: bool = field(default=True)
flatten: bool = field(default=False)
centered: bool = field(default=True)
include_area_control: bool = field(default=False)
include_food_distance: bool = field(default=False)
include_hazards: bool = field(default=False)
include_tail_distance: bool = field(default=False)
include_num_food_on_board: bool = field(default=False)
fixed_food_spawn_chance: float = field(default=-1)
include_view_mask: bool = field(default=True)