🎯 基础接口

"""
你的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回合

狭小空间里的激烈对抗,蛇很容易撞墙或相撞,节奏快、容错率低。

提示:不同场景对算法的要求不同。迷你竞技中生存优先,迷宫决斗中路径规划是关键,宽广战场则更考验长期策略。建议针对不同场景调整算法参数。

💡 优化技巧

🚀 性能优化

  • 使用集合而非列表查找
  • 缓存重复计算
  • 限制搜索深度
  • 使用迭代而非递归

🎯 策略优化

  • 优先考虑存活而非吃食物
  • 预留逃生路线
  • 预测对手移动
  • 控制蛇身长度