Update Best Battle Snake Logic
Build and Push Docker Container / build-and-push (push) Successful in 1m21s

This commit is contained in:
2026-04-04 20:50:01 +02:00
parent 6c68f412d2
commit 79f23b8be6
2 changed files with 20 additions and 3 deletions
+18 -1
View File
@@ -864,6 +864,15 @@ class BestBattleSnake(TemplateSnake):
if self._is_tail_stacked(snake["body"]): if self._is_tail_stacked(snake["body"]):
continue continue
snake_id = snake.get("id")
enemy_can_grow = None
if enemy_can_grow_cache is not None and snake_id is not None:
enemy_can_grow = enemy_can_grow_cache.get(snake_id)
if enemy_can_grow is None:
enemy_can_grow = self._enemy_can_grow_this_turn(snake, food_set)
if enemy_can_grow:
continue
enemy_tail = snake["body"][-1] enemy_tail = snake["body"][-1]
blocked.discard((enemy_tail["x"], enemy_tail["y"])) blocked.discard((enemy_tail["x"], enemy_tail["y"]))
@@ -881,6 +890,12 @@ class BestBattleSnake(TemplateSnake):
enemy_len = enemy.get("length", len(enemy["body"])) enemy_len = enemy.get("length", len(enemy["body"]))
enemy_tail = (enemy["body"][-1]["x"], enemy["body"][-1]["y"]) enemy_tail = (enemy["body"][-1]["x"], enemy["body"][-1]["y"])
enemy_tail_stacked = self._is_tail_stacked(enemy["body"]) enemy_tail_stacked = self._is_tail_stacked(enemy["body"])
enemy_id = enemy.get("id")
enemy_can_grow = None
if enemy_can_grow_cache is not None and enemy_id is not None:
enemy_can_grow = enemy_can_grow_cache.get(enemy_id)
if enemy_can_grow is None:
enemy_can_grow = self._enemy_can_grow_this_turn(enemy, food_set)
enemy_head = enemy["head"] enemy_head = enemy["head"]
for dx, dy in self.DIRECTIONS.values(): for dx, dy in self.DIRECTIONS.values():
point = (enemy_head["x"] + dx, enemy_head["y"] + dy) point = (enemy_head["x"] + dx, enemy_head["y"] + dy)
@@ -891,6 +906,7 @@ class BestBattleSnake(TemplateSnake):
not is_constrictor not is_constrictor
and point == enemy_tail and point == enemy_tail
and not enemy_tail_stacked and not enemy_tail_stacked
and not enemy_can_grow
) )
can_contest_my_tail = (not is_constrictor and point == my_tail and not my_tail_stacked) can_contest_my_tail = (not is_constrictor and point == my_tail and not my_tail_stacked)
@@ -988,7 +1004,8 @@ class BestBattleSnake(TemplateSnake):
if self._time_exceeded(deadline) or self._remaining_ms(deadline) < self.future_planning_min_time_ms: if self._time_exceeded(deadline) or self._remaining_ms(deadline) < self.future_planning_min_time_ms:
return random.choice(top_moves) return random.choice(top_moves)
candidate_moves = sorted(top_moves, key=lambda move: scores[move], reverse=True)[:3] candidate_limit = max(1, self.future_planning_branch)
candidate_moves = sorted(top_moves, key=lambda move: scores[move], reverse=True)[:candidate_limit]
lookahead_bonus:dict[str, float] = {} lookahead_bonus:dict[str, float] = {}
for move in candidate_moves: for move in candidate_moves:
if self._time_exceeded(deadline): if self._time_exceeded(deadline):
+2 -2
View File
@@ -905,7 +905,7 @@ class TestBestBattleSnake(unittest.TestCase):
enemy_can_grow_cache={"enemy": True}, enemy_can_grow_cache={"enemy": True},
) )
self.assertNotIn((0, 1), blocked) self.assertIn((0, 1), blocked)
def test_enemy_attack_map_allows_enemy_tail_move_when_enemy_can_grow(self): def test_enemy_attack_map_allows_enemy_tail_move_when_enemy_can_grow(self):
snake = BestBattleSnake() snake = BestBattleSnake()
@@ -948,7 +948,7 @@ class TestBestBattleSnake(unittest.TestCase):
enemy_can_grow_cache={"enemy": True}, enemy_can_grow_cache={"enemy": True},
) )
self.assertEqual(attack_map.get((2, 3)), 4) self.assertIsNone(attack_map.get((2, 3)))
def test_future_planning_prefers_non_trap_path(self): def test_future_planning_prefers_non_trap_path(self):
snake = BestBattleSnake() snake = BestBattleSnake()