🎯 基础接口
"""
你的AI必须实现这个函数:
"""
def decide_next_move(game_state):
"""
决定下一步的移动方向
参数:
game_state: 游戏状态字典
返回:
'UP', 'DOWN', 'LEFT', 'RIGHT' 之一
"""
# TODO: 实现你的策略
return 'UP'
⚠️ 重要约束
- 执行时间限制:每回合1秒
- 禁止文件读写操作
- 禁止网络请求
- 系统中已预置
import math, random, collections等,无需自己 import - 如果需要辅助函数,请定义在
decide_next_move函数内部,不要在外部单独定义 - 必须返回四个方向字符串之一
📦 GameState结构
game_state = {
# === 基础信息 ===
"grid_width": int, # 地图宽度
"grid_height": int, # 地图高度
"turn": int, # 当前回合数(从1开始)
"max_turns": int, # 最大回合数
# === 蛇的信息 ===
"snakes": [
{
"id": int, # 蛇的ID
"body": [ # 身体各段位置
{"x": int, "y": int}, # 第0段是头
...
],
"direction": str, # 当前方向
"alive": bool, # 是否存活
"length": int, # 长度
"food_eaten": int, # 已吃食物数
"is_mine": bool # ⭐是否是你的蛇
},
...
],
# === 食物 ===
"foods": [
{"x": int, "y": int},
...
],
# === 障碍物 ===
"obstacles": [
{"x": int, "y": int},
...
],
# === 游戏类型 ===
"game_type": str, # 'level', 'pvp', 'lab'
"level_id": int|null, # 关卡ID
}
📍 坐标系统
(0, 0) 在左上角
x轴向右增长,y轴向下增长
(0,0)
(1,0)
(2,0)
(3,0)
(4,0)
(0,1)
(1,1)
(2,1)
(3,1)
(4,1)
💻 代码示例
1. 获取你的蛇
def decide_next_move(game_state):
# 获取我的蛇
my_snake = None
for snake in game_state['snakes']:
if snake['is_mine']:
my_snake = snake
break
if not my_snake:
return 'UP'
# 获取蛇头位置
head = my_snake['body'][0]
return 'UP'
2. 判断位置是否安全
def is_safe(x, y, game_state):
"""检查位置是否安全"""
# 检查边界
if x < 0 or x >= game_state['grid_width']:
return False
if y < 0 or y >= game_state['grid_height']:
return False
# 检查障碍物
for obs in game_state['obstacles']:
if obs['x'] == x and obs['y'] == y:
return False
# 检查其他蛇
for snake in game_state['snakes']:
if snake['is_mine']:
continue
for segment in snake['body']:
if segment['x'] == x and segment['y'] == y:
return False
return True
3. 贪心算法(直奔食物)
def decide_next_move(game_state):
# 获取我的蛇
my_snake = None
for snake in game_state['snakes']:
if snake['is_mine']:
my_snake = snake
break
if not my_snake or not game_state['foods']:
return 'UP'
head = my_snake['body'][0]
food = game_state['foods'][0]
# 决定方向
dx = food['x'] - head['x']
dy = food['y'] - head['y']
# 优先移动距离更远的轴
if abs(dx) > abs(dy):
return 'RIGHT' if dx > 0 else 'LEFT'
else:
return 'DOWN' if dy > 0 else 'UP'
🧠 算法思路
Level 1-2: 简单搜索
- 直接朝食物移动(贪心)
- BFS寻找最短路径
- 避开障碍物
Level 3-4: 路径规划
- A*算法(启发式搜索)
- 考虑蛇身长度变化
- 预测未来位置
Level 5: 对抗博弈
- Minimax算法
- Alpha-Beta剪枝
- 预测对手移动
- 截断对手策略
📜 规则说明
💀 死亡条件
- 撞墙(超出地图边界)
- 撞到障碍物
- 撞到自己的身体
- 撞到其他蛇的身体
🍎 得分规则
- 吃到食物:长度+1,分数+1
- 初始长度:3格
- PVP模式:吃更多食物获胜
⏱️ 时间限制
- 每回合思考时间:1秒
- 超时则随机移动
- 建议控制计算复杂度
🗺️ 对战场景
对战AI和对战同学模式下,可以选择不同的场景(竞技场)。场景决定了地图大小、障碍物数量、食物数量和最大回合数。
🏟️
经典竞技场
15×15 地图,无障碍物,5个食物,最多200回合
适合新手入门的标准对战环境,地图开阔,考验基本寻路和抢食能力。
🧱
障碍竞技场
15×15 地图,10个障碍物,5个食物,最多200回合
在经典地图基础上增加了随机障碍物,需要绕行避障,考验路径规划能力。
🌾
宽广战场
20×20 地图,无障碍物,7个食物,最多250回合
更大的活动空间和更多食物,适合长蛇缠斗,考验长远策略和生存能力。
🏯
迷宫决斗
20×20 地图,20个障碍物,5个食物,最多300回合
大型迷宫环境,障碍物密集,需要精确的路径规划,适合高级算法展示实力。
⚡
迷你竞技
10×10 地图,3个障碍物,3个食物,最多150回合
狭小空间里的激烈对抗,蛇很容易撞墙或相撞,节奏快、容错率低。
提示:不同场景对算法的要求不同。迷你竞技中生存优先,迷宫决斗中路径规划是关键,宽广战场则更考验长期策略。建议针对不同场景调整算法参数。
💡 优化技巧
🚀 性能优化
- 使用集合而非列表查找
- 缓存重复计算
- 限制搜索深度
- 使用迭代而非递归
🎯 策略优化
- 优先考虑存活而非吃食物
- 预留逃生路线
- 预测对手移动
- 控制蛇身长度