Elephant 在「实现贪吃蛇游戏引擎」的评测结果

这是该 AI 模型在此测试用例上的详细评测结果。

基本信息

  • 模型名称:Elephant
  • 用例名称:实现贪吃蛇游戏引擎
  • 测试类型:文本生成
  • 评测维度:代码生成

系统提示词(System Prompt)

这是给 AI 模型的背景设定和角色指令:

你是一名资深游戏逻辑开发工程师,擅长使用 Python 实现游戏核心引擎。 回答要求: 1. 代码需结构清晰,包含必要的注释,逻辑层与表现层分离(不依赖任何 GUI 库)。 2. 使用合适的数据结构(如 collections.deque)表示蛇身,确保操作效率。 3. 提供完整可运行的代码,包含数据结构定义、核心函数及简单的命令行演示入口。 4. 对关键逻辑(移动、增长、食物生成)给出简要说明,便于理解和验证。 5. 代码需覆盖基础边界情况,如食物不能生成在蛇身上。

用户提示词(User Prompt)

这是用户给 AI 模型的具体任务要求:

请用 Python 实现一个贪吃蛇游戏的核心逻辑引擎(纯逻辑层,无需 GUI)。 **游戏规则说明:** - 游戏在一个 20×20 的网格上进行,坐标原点 (0, 0) 位于左上角,x 轴向右,y 轴向下。 - 蛇初始长度为 3 格,位于网格中央,初始朝向为向右。 - 每次调用「移动」函数,蛇向当前方向前进一格。 - 蛇吃到食物后,身体增长一格(尾部不消失);否则尾部正常消失。 - 食物随机生成在网格内,且不能与蛇身重叠。 **具体实现要求:** 1. **数据结构**:使用 `collections.deque` 存储蛇身坐标列表(头部在左端),定义方向常量(UP/DOWN/LEFT/RIGHT)。 2. **移动逻辑**:实现 `move(direction)` 函数,根据方向计算新头部坐标,将新头插入队列头部;若未吃到食物则弹出队列尾部。 3. **食物生成**:实现 `generate_food(snake, grid_size)` 函数,随机生成一个不与蛇身重叠的坐标。 4. **吃食物判断**:在移动后判断新头部是否与食物重合,若重合则触发增长并重新生成食物。 5. **演示入口**:提供一个 `demo()` 函数,模拟蛇移动 10 步(含吃食物场景),每步打印蛇身坐标和食物位置。 **不需要实现**:碰撞检测、计分系统、游戏状态管理(这些属于进阶功能)。

任务要求

AI 模型需要满足以下要求:

  1. 使用 collections.deque 作为蛇身数据结构,头部插入和尾部删除操作正确,时间复杂度为 O(1)。
  2. move() 函数能根据四个方向正确计算新头部坐标,移动后蛇身长度在未吃食物时保持不变、吃食物后增加 1。
  3. generate_food() 函数生成的食物坐标在网格范围内,且不与当前蛇身任何坐标重叠。
  4. 吃食物的判断逻辑正确:新头部坐标与食物坐标完全相同时触发增长,并立即重新生成新食物。
  5. 方向常量定义清晰(如使用元组或枚举),代码结构模块化,核心函数职责单一。
  6. demo() 函数能正常运行并输出可读的蛇身状态,验证移动和吃食物流程的正确性。

评测结果

综合得分

该模型在此用例的得分为:80.3 分(满分 100 分),已通过

基础难度评测结果

  • 得分:80.3 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

下面是一个完整的 Python 实现,包含贪吃蛇核心逻辑引擎(纯逻辑层),满足你提出的所有要求。 --- ### ✅ 功能说明 - **网格大小**:20×20(坐标范围 0~19) - **蛇初始状态**:长度为 3,位于中心 (10,10), (10,11), (10,12),初始方向向右 - **移动逻辑**:`move(direction)` 更新蛇身 - **食物生成**:`generate_food()` 确保不与蛇身重叠 - **吃食物判断**:移动后检测是否吃到食物,若吃到则增长并重新生成食物 - **演示**:`demo()` 模拟 10 步移动并打印状态 --- ### ✅ 代码实现 ```python import random from collections import deque # ====================== # 常量与方向定义 # ====================== GRID_SIZE = 20 # 方向常量:UP/DOWN/LEFT/RIGHT UP = (-1, 0) DOWN = (1, 0) LEFT = (0, -1) RIGHT = (0, 1) # 方向映射字符串到向量 DIRECTIONS = { 'UP': UP, 'DOWN': DOWN, 'LEFT': LEFT, 'RIGHT': RIGHT } class SnakeGame: """ 贪吃蛇核心逻辑引擎(纯逻辑层) 使用 deque 存储蛇身,头部在左端 """ def __init__(self, grid_size=GRID_SIZE): self.grid_size = grid_size # 初始蛇身:长度为3,位于中央,朝向右 start_y = grid_size // 2 start_x = grid_size // 2 self.snake = deque([ (start_x, start_y), (start_x - 1, start_y), (start_x - 2, start_y) ]) self.direction = RIGHT # 初始方向向右 self.food = None # 生成初始食物 self.generate_food() def generate_food(self): """ 随机生成食物坐标,确保不与蛇身重叠 """ while True: x = random.randint(0, self.grid_size - 1) y = random.randint(0, self.grid_size - 1) if (x, y) not in self.snake: self.food = (x, y) break def move(self, direction=None): """ 移动蛇一步 :param direction: 可选,若提供则更新当前方向 :return: (new_head, ate_food) 移动后的新头部和是否吃到食物 """ if direction is not None: self.direction = direction # 获取当前头部 head_x, head_y = self.snake[0] dx, dy = self.direction # 计算新头部坐标 new_head = (head_x + dx, head_y + dy) # 可选:边界检查(本题不要求,但可扩展) # if not (0 <= new_head[0] < self.grid_size and 0 <= new_head[1] < self.grid_size): # raise ValueError("Snake hit the wall!") # 将新头插入队列头部 self.snake.appendleft(new_head) # 判断是否吃到食物 ate_food = new_head == self.food if ate_food: # 吃到食物:保留尾部(不弹出),并生成新食物 self.generate_food() else: # 未吃到食物:弹出尾部,保持长度不变 self.snake.pop() return new_head, ate_food def get_state(self): """ 返回当前游戏状态(用于演示) """ return { 'snake': list(self.snake), 'food': self.food, 'direction': self.direction } def demo(): """ 演示函数:模拟蛇移动10步,包含吃食物场景...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【GEMINI】代码展示了扎实的 Python 基础,特别是在数据结构(deque)的选择和蛇身增长逻辑的实现上非常标准。然而,在细节处理上存在疏忽:一是坐标轴定义与题干要求相反(x/y 颠倒),二是 demo 演示代码中存在明显的字典键类型错误(元组 vs 字符串),导致程序无法直接运行。修正这两点后将是一个非常优秀的实现。 【KIMI】整体来看,该实现完全满足了题目要求,逻辑清晰、结构合理、代码可读性好。实现了贪吃蛇游戏的核心逻辑,包括蛇的移动、身体增长、食物生成等关键功能。demo() 函数提供了一个很好的演示入口,验证了代码的正确性。

进阶难度评测结果

  • 得分:85.8 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

以下是一个完整、独立、无 UI 依赖的贪吃蛇游戏引擎实现,采用面向对象设计,职责清晰,状态机严格管理,碰撞检测前置,支持任意前端集成。 ```python import random from collections import deque from enum import Enum class GameState(Enum): INIT = "INIT" RUNNING = "RUNNING" PAUSED = "PAUSED" GAME_OVER = "GAME_OVER" class Direction(Enum): UP = (0, -1) DOWN = (0, 1) LEFT = (-1, 0) RIGHT = (1, 0) @staticmethod def from_index(index: int): """从数字索引转换为方向(0=上,1=下,2=左,3=右)""" directions = [Direction.UP, Direction.DOWN, Direction.LEFT, Direction.RIGHT] if 0 1 else head current_dir = Position( head.x - second.x, head.y - second.y ) # 检查是否反向 if (current_dir.x == -direction.value[0] and current_dir.y == -direction.value[1]): return # 忽略反向输入 self._pending_direction = direction def step(self): """ 执行一个游戏 tick:碰撞检测 → 移动 → 吃食物检测 → 生成新食物(若被吃) 仅在 RUNNING 状态生效。 """ if self.state != GameState.RUNNING: return # 静默忽略 # 确定当前移动方向 current_dir = self._get_current_direction() if current_dir is None: return # 无有效方向,无法移动 head = self.snake[0] next_pos = head + current_dir.value # --- 碰撞检测(移动前) --- if self._check_wall_collision(next_pos): self._game_over() return if self._check_self_collision(next_pos): self._game_over() return # 移动蛇 self.snake.appendleft(next_pos) # 检测吃食物 if self.food and self.food == next_pos: self.score += 10 self._food_count += 1 self._check_level_up() self._set_food() # 生成新食物 else: # 未吃到,移除尾部 self.snake.pop() def get_state(self) -> dict: """ 获取当前游戏状态快照(用于 UI 渲染) Returns: dict: 包含状态、蛇身、食物、分数、等级、速度间隔等 """ return { "state": self.state.value, "snake": [(p.x, p.y) for p in self.snake], "food": (self.food.x, self.food.y) if self.food else None, "score": self.score, "level": self.level, "speed_interval": self.get_speed_interval(), "width": self.width, "height": self.height, } def get_speed_interval(self) -> int: """ 获取当前 tick 间隔(毫秒) Returns: int: 间隔时间,最小 100ms """ return max(100, 500 - (self.level - 1) * 40) # ---- 内部方法 ---- def _get_current_direction(self) -> Direction: """获取当前有效移动方向""" if self._pending_direction is not None: return...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【GEMINI】该 AI 模型展现了深厚的游戏引擎设计功底,特别是在架构设计、状态机管理和 API 规范性方面表现突出。代码模块化程度高,职责单一,完全符合“纯逻辑层”的要求。主要的失分点在于具体的代码实现细节(如向量加法的类型匹配)以及测试脚本中的逻辑断言错误,导致代码在不经修改的情况下无法通过其自带的单元测试。若能修正这些细节,将是一个非常完美的贪吃蛇引擎实现。 【KIMI】整体而言,这段代码实现了一个功能完善、设计合理的贪吃蛇游戏引擎。代码遵循面向对象设计原则,实现了完整的游戏逻辑和状态机,碰撞检测和方向控制逻辑正确。所有公开API都已实现,代码结构清晰,类职责单一,可以直接运行并通过内置测试验证核心功能。在数据结构选择和代码质量方面也表现较好。

困难难度评测结果

  • 得分:84.3 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

# 高级贪吃蛇游戏引擎 (纯逻辑层) ```python from __future__ import annotations from dataclasses import dataclass, field from enum import Enum, auto from heapq import heappush, heappop from json import JSONEncoder, JSONDecoder from typing import Dict, List, Set, Tuple, Optional, Callable, Iterator, Any, Deque from collections import deque import json import random import os # ============================================================================= # 1. 枚举与数据类定义 # ============================================================================= class GameMode(Enum): CLASSIC = auto() # 经典模式:碰墙/碰自身即死 WARP = auto() # 穿墙模式:穿越边界从对侧出现 DUEL = auto() # 双人对战:两条蛇,碰对方即死 class Direction(Enum): UP = (0, -1) DOWN = (0, 1) LEFT = (-1, 0) RIGHT = (1, 0) def opposite(self) -> Direction: opposites = { Direction.UP: Direction.DOWN, Direction.DOWN: Direction.UP, Direction.LEFT: Direction.RIGHT, Direction.RIGHT: Direction.LEFT, } return opposites[self] class PowerUpType(Enum): SPEED = auto() # 加速 SLOW = auto() # 减速 WARP_PASS = auto() # 穿墙 @dataclass(frozen=True) class Position: x: int y: int def __add__(self, other: Position) -> Position: return Position(self.x + other.x, self.y + other.y) def __sub__(self, other: Position) -> Position: return Position(self.x - other.x, self.y - other.y) def manhattan_distance(self, other: Position, grid_size: Position, warp: bool) -> int: """ 计算考虑穿墙的曼哈顿距离。 在穿墙模式下,取各维度最短环绕距离。 """ dx = abs(self.x - other.x) dy = abs(self.y - other.y) if warp: dx = min(dx, grid_size.x - dx) dy = min(dy, grid_size.y - dy) return dx + dy @dataclass(frozen=True) class PowerUp: pos: Position ptype: PowerUpType duration: int # 剩余 tick 数 @dataclass class Snake: body: Deque[Position] # 头部在右侧/前端 direction: Direction score: int = 0 color: str = "#00ff00" power_ups: Dict[PowerUpType, int] = field(default_factory=dict) # type -> remaining ticks def is_alive(self) -> bool: return len(self.body) > 0 def has_power_up(self, ptype: PowerUpType) -> bool: return ptype in self.power_ups and...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【GEMINI】该 AI 生成的代码展现了极高的专业工程水准,尤其在事件总线设计、代码组织结构和 A* 算法的实现细节上非常出色。代码完全符合生产环境标准,模块化程度高且易于扩展。主要的扣分项在于:1. 漏掉了任务要求的排行榜持久化系统;2. 经典模式下的边界碰撞逻辑实现不严密(漏掉了越界即死的判定)。尽管如此,这依然是一个高质量的工业级代码示例。 【KIMI】整体上,该实现提供了一个功能完整、结构清晰的高级贪吃蛇游戏引擎。核心游戏逻辑准确,A*寻路、回放系统和序列化/反序列化功能实现良好。代码结构合理,事件系统和观察者模式的实现增强了代码的模块化和可维护性。尽管如此,仍有一些地方可以进一步优化,例如提高代码的可维护性,增加更多的边界测试用例。

相关链接

您可以通过以下链接查看更多相关内容:

加载中...