Add some snakes

This commit is contained in:
2023-09-07 22:36:08 -05:00
parent 4c6b305aca
commit 6de4111b05
5 changed files with 186 additions and 0 deletions

2
snakes/__init__.py Normal file
View File

@@ -0,0 +1,2 @@
from .snake import Snake
from .starter_snake import StarterSnake

32
snakes/snake.py Normal file
View File

@@ -0,0 +1,32 @@
import typing
class Snake:
SNAKES: typing.Dict[str, typing.Type["Snake"]] = {}
def __init_subclass__(cls) -> None:
cls.SNAKES[cls.__name__] = cls
def info(self) -> typing.Dict:
'''info is called when you create your Battlesnake on play.battlesnake.com
and controls your Battlesnake's appearance
TIP: If you open your Battlesnake URL in a browser you should see this data
'''
raise NotImplementedError()
def start(self, game_state: typing.Dict) -> None:
'''start is called when your Battlesnake begins a game'''
raise NotImplementedError()
def end(self, game_state: typing.Dict) -> None:
'''end is called when your Battlesnake finishes a game'''
raise NotImplementedError()
def move(self, game_state: typing.Dict) -> typing.Dict:
'''move is called on every turn and returns your next move
Valid moves are "up", "down", "left", or "right"
See https://docs.battlesnake.com/api/example-move for available data
'''
raise NotImplementedError()

74
snakes/starter_snake.py Normal file
View File

@@ -0,0 +1,74 @@
import random
import typing
from .snake import Snake
class StarterSnake(Snake):
'''Snake from Battlesnake's starter snake repo'''
def info(self) -> typing.Dict:
print("INFO")
return {
"apiversion": "1",
"author": "", # TODO: Your Battlesnake Username
"color": "#888888", # TODO: Choose color
"head": "default", # TODO: Choose head
"tail": "default", # TODO: Choose tail
}
def start(self, game_state: typing.Dict):
print("GAME START")
def end(self, game_state: typing.Dict):
print("GAME OVER\n")
def move(self, game_state: typing.Dict) -> typing.Dict:
is_move_safe = {"up": True, "down": True, "left": True, "right": True}
# We've included code to prevent your Battlesnake from moving backwards
my_head = game_state["you"]["body"][0] # Coordinates of your head
my_neck = game_state["you"]["body"][1] # Coordinates of your "neck"
if my_neck["x"] < my_head["x"]: # Neck is left of head, don't move left
is_move_safe["left"] = False
elif my_neck["x"] > my_head["x"]: # Neck is right of head, don't move right
is_move_safe["right"] = False
elif my_neck["y"] < my_head["y"]: # Neck is below head, don't move down
is_move_safe["down"] = False
elif my_neck["y"] > my_head["y"]: # Neck is above head, don't move up
is_move_safe["up"] = False
# TODO: Step 1 - Prevent your Battlesnake from moving out of bounds
# board_width = game_state['board']['width']
# board_height = game_state['board']['height']
# TODO: Step 2 - Prevent your Battlesnake from colliding with itself
# my_body = game_state['you']['body']
# TODO: Step 3 - Prevent your Battlesnake from colliding with other Battlesnakes
# opponents = game_state['board']['snakes']
# Are there any safe moves left?
safe_moves = []
for move, isSafe in is_move_safe.items():
if isSafe:
safe_moves.append(move)
if len(safe_moves) == 0:
print(f"MOVE {game_state['turn']}: No safe moves detected! Moving down")
return {"move": "down"}
# Choose a random move from the safe ones
next_move = random.choice(safe_moves)
# TODO: Step 4 - Move towards food instead of random, to regain health and survive longer
# food = game_state['board']['food']
print(f"MOVE {game_state['turn']}: {next_move}")
return {"move": next_move}