add versions to snakes and read it in server class
This commit is contained in:
@@ -17,6 +17,7 @@ class Server:
|
|||||||
'color': '#888888',
|
'color': '#888888',
|
||||||
'head': 'default',
|
'head': 'default',
|
||||||
'tail': 'default',
|
'tail': 'default',
|
||||||
|
'version': '1.0.0',
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, data_path:str, snake_type:str, storage_type:str, debug:bool=False, check_tls_security:bool=False):
|
def __init__(self, data_path:str, snake_type:str, storage_type:str, debug:bool=False, check_tls_security:bool=False):
|
||||||
@@ -42,6 +43,7 @@ class Server:
|
|||||||
'max_turn': 0,
|
'max_turn': 0,
|
||||||
}
|
}
|
||||||
self.logger = build_logger('Battlesnake', debug_env_var='DEBUG_SERVER')
|
self.logger = build_logger('Battlesnake', debug_env_var='DEBUG_SERVER')
|
||||||
|
self.snake_version = self._get_snake_version()
|
||||||
|
|
||||||
self.app = Quart('Battlesnake')
|
self.app = Quart('Battlesnake')
|
||||||
|
|
||||||
@@ -134,12 +136,36 @@ class Server:
|
|||||||
return await self._override_snake_config_with_environment_variables(snake_config)
|
return await self._override_snake_config_with_environment_variables(snake_config)
|
||||||
|
|
||||||
async def _override_snake_config_with_environment_variables(self, config:dict[str, str]) -> dict[str, str]:
|
async def _override_snake_config_with_environment_variables(self, config:dict[str, str]) -> dict[str, str]:
|
||||||
|
config['version'] = self.snake_version
|
||||||
|
|
||||||
for key in ('author', 'color', 'head', 'tail'):
|
for key in ('author', 'color', 'head', 'tail'):
|
||||||
value = os.environ.get(f'SNAKE_{key.upper()}')
|
value = os.environ.get(f'SNAKE_{key.upper()}')
|
||||||
if value is not None:
|
if value is not None:
|
||||||
config[key] = value
|
config[key] = value
|
||||||
|
|
||||||
|
version_override = os.environ.get('SNAKE_VERSION')
|
||||||
|
if version_override is not None:
|
||||||
|
config['version'] = version_override
|
||||||
|
|
||||||
return config
|
return config
|
||||||
|
|
||||||
|
def _get_snake_version(self) -> str:
|
||||||
|
configured_version = SnakeBuilder.get_version(self.snake_type)
|
||||||
|
if configured_version:
|
||||||
|
return configured_version
|
||||||
|
|
||||||
|
try:
|
||||||
|
snake = SnakeBuilder.build(self.snake_type)
|
||||||
|
except Exception:
|
||||||
|
return self.default_snake_config['version']
|
||||||
|
|
||||||
|
version = getattr(snake, 'version', None)
|
||||||
|
if version is None:
|
||||||
|
version = getattr(snake, 'VERSION', None)
|
||||||
|
if not version:
|
||||||
|
return self.default_snake_config['version']
|
||||||
|
return str(version)
|
||||||
|
|
||||||
async def _create_game_board(self, game_state:dict):
|
async def _create_game_board(self, game_state:dict):
|
||||||
game_id = game_state['game']['id']
|
game_id = game_state['game']['id']
|
||||||
new_game_board = GameBoard(
|
new_game_board = GameBoard(
|
||||||
|
|||||||
+14
-2
@@ -1,7 +1,19 @@
|
|||||||
|
|
||||||
class SnakeBuilder:
|
class SnakeBuilder:
|
||||||
|
SNAKE_VERSIONS = {
|
||||||
|
"TemplateSnake": "1.0.0",
|
||||||
|
"DummSnake": "1.0.0",
|
||||||
|
"LogicSnake": "1.1.0",
|
||||||
|
"MasterSnake": "1.2.0",
|
||||||
|
"BetterMasterSnake": "1.3.0",
|
||||||
|
"BestBattleSnake": "2.5.0",
|
||||||
|
}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def build(self, selected_snake:str):
|
def build(self, selected_snake:str):
|
||||||
snake_module = __import__(f'snakes.{selected_snake}', fromlist=[selected_snake])
|
snake_module = __import__(f"snakes.{selected_snake}", fromlist=[selected_snake])
|
||||||
snake_class = getattr(snake_module, selected_snake)
|
snake_class = getattr(snake_module, selected_snake)
|
||||||
return snake_class()
|
return snake_class()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_version(self, selected_snake:str) -> str | None:
|
||||||
|
return self.SNAKE_VERSIONS.get(selected_snake)
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import os
|
|||||||
from snakes.TemplateSnake import TemplateSnake
|
from snakes.TemplateSnake import TemplateSnake
|
||||||
|
|
||||||
class BestBattleSnake(TemplateSnake):
|
class BestBattleSnake(TemplateSnake):
|
||||||
|
VERSION = "2.5.0"
|
||||||
|
|
||||||
DIRECTIONS = {
|
DIRECTIONS = {
|
||||||
"up": (0, 1),
|
"up": (0, 1),
|
||||||
"down": (0, -1),
|
"down": (0, -1),
|
||||||
@@ -23,6 +25,7 @@ class BestBattleSnake(TemplateSnake):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.name = "BestBattleSnake"
|
self.name = "BestBattleSnake"
|
||||||
|
self.version = self.VERSION
|
||||||
self.recent_heads = deque(maxlen=14)
|
self.recent_heads = deque(maxlen=14)
|
||||||
self.last_move = None
|
self.last_move = None
|
||||||
self.last_game_id = None
|
self.last_game_id = None
|
||||||
|
|||||||
@@ -3,9 +3,12 @@ from server.GameBoard import GameBoard
|
|||||||
from collections import deque
|
from collections import deque
|
||||||
|
|
||||||
class BetterMasterSnake(TemplateSnake):
|
class BetterMasterSnake(TemplateSnake):
|
||||||
|
VERSION = "1.3.0"
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.name = "BetterMasterSnake"
|
self.name = "BetterMasterSnake"
|
||||||
|
self.version = self.VERSION
|
||||||
# Definiere die möglichen Bewegungsrichtungen
|
# Definiere die möglichen Bewegungsrichtungen
|
||||||
self.min_safe_area = 2
|
self.min_safe_area = 2
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ from snakes.TemplateSnake import TemplateSnake
|
|||||||
import random
|
import random
|
||||||
|
|
||||||
class DummSnake(TemplateSnake):
|
class DummSnake(TemplateSnake):
|
||||||
|
VERSION = "1.0.0"
|
||||||
|
|
||||||
def choose_move(self, data: dict) -> str:
|
def choose_move(self, data: dict) -> str:
|
||||||
is_move_safe = {"up": True, "down": True, "left": True, "right": True}
|
is_move_safe = {"up": True, "down": True, "left": True, "right": True}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import random
|
|||||||
from scipy import spatial
|
from scipy import spatial
|
||||||
|
|
||||||
class LogicSnake(TemplateSnake):
|
class LogicSnake(TemplateSnake):
|
||||||
|
VERSION = "1.1.0"
|
||||||
|
|
||||||
def avoid_my_body(self, my_body, possible_moves: dict) -> list:
|
def avoid_my_body(self, my_body, possible_moves: dict) -> list:
|
||||||
"""
|
"""
|
||||||
my_body: List of dictionaries of x/y coordinates for every segment of a Battlesnake.
|
my_body: List of dictionaries of x/y coordinates for every segment of a Battlesnake.
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
from snakes.TemplateSnake import TemplateSnake
|
from snakes.TemplateSnake import TemplateSnake
|
||||||
|
|
||||||
class MasterSnake(TemplateSnake):
|
class MasterSnake(TemplateSnake):
|
||||||
|
VERSION = "1.2.0"
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.name = "MasterSnake"
|
self.name = "MasterSnake"
|
||||||
|
self.version = self.VERSION
|
||||||
self.disabled_find_near_by_food = True
|
self.disabled_find_near_by_food = True
|
||||||
|
|
||||||
def is_food_nearby(self, head, food_positions):
|
def is_food_nearby(self, head, food_positions):
|
||||||
|
|||||||
@@ -2,9 +2,13 @@ from server.GameBoard import GameBoard
|
|||||||
import random
|
import random
|
||||||
|
|
||||||
class TemplateSnake:
|
class TemplateSnake:
|
||||||
|
VERSION = "1.0.0"
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.history = []
|
self.history = []
|
||||||
self.target_food = None
|
self.target_food = None
|
||||||
|
self.name = self.__class__.__name__
|
||||||
|
self.version = getattr(self, "VERSION", "1.0.0")
|
||||||
|
|
||||||
def clear_history(self):
|
def clear_history(self):
|
||||||
self.history = []
|
self.history = []
|
||||||
|
|||||||
Reference in New Issue
Block a user