gpt-5.6-sol 在「实现贪吃蛇游戏引擎」的评测结果

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

基本信息

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

系统提示词(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() 函数能正常运行并输出可读的蛇身状态,验证移动和吃食物流程的正确性。

评测结果

综合得分

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

基础难度评测结果

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

模型生成产物

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

下面给出一个纯逻辑层的贪吃蛇核心引擎,使用 `collections.deque` 保存蛇身,不依赖任何 GUI 库。 ```python from __future__ import annotations import random from collections import deque from dataclasses import dataclass, field from typing import Deque, Optional, Tuple # 坐标类型:(x, y) Position = Tuple[int, int] # 方向常量 UP: Position = (0, -1) DOWN: Position = (0, 1) LEFT: Position = (-1, 0) RIGHT: Position = (1, 0) def generate_food( snake: Deque[Position], grid_size: int, rng: Optional[random.Random] = None, ) -> Optional[Position]: """ 在网格中随机生成一个不与蛇身重叠的食物坐标。 Args: snake: 蛇身坐标,头部位于 deque 左端。 grid_size: 正方形网格边长。 rng: 可选随机数生成器,便于测试时固定随机种子。 Returns: 可用的食物坐标。如果网格已被蛇完全占满,则返回 None。 """ if grid_size None: if self.grid_size Position: """返回当前蛇头坐标。""" return self.snake[0] def move(self, direction: Optional[Position] = None) -> bool: """ 让蛇移动一格。 Args: direction: 本次移动方向。如果为 None,则继续沿当前方向移动。 Returns: 如果本次移动吃到食物则返回 True,否则返回 False。 注意: 按题目要求,本实现不处理越界、自身碰撞、反向移动限制等逻辑。 """ if direction is not None: self._validate_direction(direction) self.direction = direction dx, dy = self.direction head_x, head_y = self.head new_head = (head_x + dx, head_y + dy) # 先计算新头是否位于食物格。 ate_food = self.food is not None and new_head == self.food # 新头始终加入 deque 左端。 self.snake.appendleft(new_head) if ate_food: # 吃到食物时不移除尾部,因此蛇身增长一格。 self.food = generate_food(self.snake, self.grid_size, self.rng) else: # 未吃到食物时移除尾部,蛇身长度保持不变。 self.snake.pop() return ate_food @staticmethod def _validate_direction(direction: Position) -> None: """检查方向是否为已定义的四个方向之一。""" if direction not in (UP, DOWN, LEFT, RIGHT): raise ValueError( f"无效方向 {direction},方向必须是 UP、DOWN、LEFT 或 RIGHT" ) def demo() -> None: """ 命令行演示: 模拟蛇移动 10 步,并在第 3 步人为将食物放到蛇的下一格, 以确保演示中包含一次吃食物和增长场景。 """ engine = SnakeEngine(grid_size=20, rng=random.Random(42)) # 路径保持在网格内。第 3 步向右移动时会吃到食物。 directions = [ RIGHT, RIGHT, RIGHT, DOWN, DOWN, DOWN, LEFT, LEFT, LEFT, UP, ] direction_names = { UP: "UP", DOWN: "DOWN", LEFT: "LEFT", RIGHT: "RIGHT", } print("初始状态") print(f"蛇身: {list(engine.snake)}") print(f"食物:...

AI 评审点评

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

【CLAUDE】这是一份高质量的贪吃蛇核心逻辑引擎实现。代码结构清晰,逻辑正确,数据结构选型合理,注释详尽,类型注解完整。核心逻辑(移动、增长、食物生成)均实现正确,边界情况(网格占满、无效方向)也有处理。使用dataclass和可选rng参数体现了良好的工程实践。demo函数通过人为设置食物位置来确保演示包含吃食物场景,虽略显刻意但有效验证了核心逻辑。整体而言是一份接近满分的实现。 【GEMINI】这是一份极高质量的贪吃蛇核心逻辑引擎实现。代码不仅完全满足了所有的功能和非功能性要求,而且在代码规范、类型安全、边界情况处理(如食物生成的死循环规避)以及演示脚本的设计上都展现出了极高的专业水准。 【KIMI】该实现是一份高质量的贪吃蛇核心引擎代码,逻辑严谨、结构清晰、可扩展性强。在完全符合题目基本要求的基础上,额外增加了rng注入、方向校验、网格占满处理等健壮性设计。唯一与题目字面要求的细微差异在于move()函数的Optional方向参数设计,这使得API比要求的更灵活,但不影响核心逻辑的正确性验证。整体属于优秀水平。

进阶难度评测结果

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

模型生成产物

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

下面给出一个可直接运行的 Python 实现。引擎完全独立于终端、Web 或 GUI 框架,前端只需要调用公开 API 并读取不可变快照即可。 核心设计: - `SnakeGameEngine`:协调游戏流程,对外提供 API。 - `GameStateMachine`:只负责状态转换与守卫条件。 - `Snake`:只负责蛇身数据。 - `CollisionDetector`:只负责移动前的墙壁和自身碰撞检测。 - `FoodSpawner`:食物生成策略,可注入以便测试。 - `GameSnapshot`:提供给表现层的不可变游戏状态。 - 对公开操作使用显式异常处理。 - 使用 `RLock`,避免前端计时器与输入线程并发调用时破坏状态。 ```python from __future__ import annotations import random import threading from collections import deque from dataclasses import dataclass from enum import Enum from typing import Deque, Iterable, Optional, Protocol, Sequence # ============================================================ # 异常定义 # ============================================================ class SnakeGameError(Exception): """贪吃蛇引擎基础异常。""" class InvalidStateError(SnakeGameError): """当前状态不允许执行指定操作。""" class InvalidDirectionError(SnakeGameError): """方向输入无法识别。""" class InvalidConfigurationError(SnakeGameError): """游戏配置不合法。""" class FoodSpawnError(SnakeGameError): """食物生成器返回了不合法的位置。""" # ============================================================ # 基础值对象与枚举 # ============================================================ @dataclass(frozen=True, slots=True) class Point: """不可变网格坐标,原点位于左上角。""" x: int y: int def moved(self, direction: "Direction") -> "Point": """返回沿指定方向移动一格后的新坐标。""" dx, dy = direction.delta return Point(self.x + dx, self.y + dy) class Direction(Enum): UP = (0, -1) DOWN = (0, 1) LEFT = (-1, 0) RIGHT = (1, 0) @property def delta(self) -> tuple[int, int]: return self.value def is_opposite(self, other: "Direction") -> bool: """判断两个方向是否互为 180° 反向。""" dx1, dy1 = self.delta dx2, dy2 = other.delta return dx1 + dx2 == 0 and dy1 + dy2 == 0 @classmethod def parse(cls, value: "Direction | str") -> "Direction": """ 将 Direction 或字符串转换为 Direction。 参数: value: Direction 实例,或 UP/DOWN/LEFT/RIGHT 字符串。 返回: 解析后的 Direction。 异常: InvalidDirectionError: 输入无法识别时抛出。 """ if isinstance(value, cls): return value if isinstance(value, str): normalized = value.strip().upper() try: return...

AI 评审点评

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

【CLAUDE】这是一个设计精良、实现完整的贪吃蛇游戏引擎。代码严格遵循面向对象原则,类职责单一,逻辑层与表现层完全分离。状态机实现规范,碰撞检测逻辑正确(包括蛇尾离开的边界情况处理),方向防护健壮。数据结构选择合理(deque、frozen dataclass、Protocol接口),线程安全设计到位。内置测试覆盖全面,可直接运行验证。文档注释清晰,前端接入示例实用。是一个接近生产级别的游戏引擎实现。 【GEMINI】这是一份教科书级别的贪吃蛇游戏引擎实现。代码不仅完全满足了所有功能和非功能性需求,而且在架构设计、并发安全、边界条件处理(如单tick内双击转向Bug、蛇尾碰撞判定)以及测试覆盖率上都达到了极高的专业水准,非常适合作为生产级逻辑层引擎供各种前端框架接入。 【KIMI】这是一个非常优秀的贪吃蛇游戏引擎实现,严格遵循面向对象设计原则,逻辑层与表现层完全分离。状态机、碰撞检测、食物生成策略等模块职责清晰,API设计完善且文档化。核心游戏逻辑正确严谨,特别是碰撞检测在移动前完成、180°反向防护、蛇尾移动时的自身碰撞处理等细节处理到位。代码可直接运行并通过全部内置测试,具备生产环境接入的质量。 minor优化空间在于性能(大网格时的食物生成和碰撞检测开销)和部分计算逻辑的复用。

困难难度评测结果

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

模型生成产物

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

下面给出一个完整的纯逻辑层实现。代码仅依赖 Python 标准库,采用模块化设计,并包含: - 经典、穿墙、双人对战三种模式 - A* AI 寻路与安全检查 - `deque + set` 蛇身碰撞结构 - 三种持续型道具 - 观察者模式事件总线 - 增量回放记录与回放生成器 - JSON 序列化与反序列化 - 排行榜文件持久化 - 使用示例和单元测试片段 ```python from __future__ import annotations import copy import heapq import json import random import unittest from collections import deque from dataclasses import dataclass, field from enum import Enum from pathlib import Path from typing import ( Any, Callable, Deque, Dict, Generator, Iterable, List, Optional, Sequence, Set, Tuple, ) # ============================================================ # 1. 枚举与数据类定义 # ============================================================ class GameMode(str, Enum): """游戏模式。""" CLASSIC = "classic" WRAP = "wrap" VERSUS = "versus" class Direction(str, Enum): """蛇的移动方向。""" UP = "up" DOWN = "down" LEFT = "left" RIGHT = "right" @property def vector(self) -> Tuple[int, int]: """返回方向向量。""" vectors = { Direction.UP: (-1, 0), Direction.DOWN: (1, 0), Direction.LEFT: (0, -1), Direction.RIGHT: (0, 1), } return vectors[self] @property 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(str, Enum): """道具类型。""" SPEED = "speed" SLOW = "slow" GHOST = "ghost" class EventType(str, Enum): """事件类型。""" ON_FOOD_EATEN = "on_food_eaten" ON_SNAKE_DIED = "on_snake_died" ON_GAME_OVER = "on_game_over" ON_POWERUP_COLLECTED = "on_powerup_collected" ON_SCORE_CHANGED = "on_score_changed" @dataclass(frozen=True, order=True) class Position: """二维网格坐标。""" row: int col: int def moved(self, direction: Direction) -> "Position": """根据方向返回新坐标。""" dr, dc = direction.vector return Position(self.row + dr, self.col + dc) def to_list(self) -> List[int]: """转换为 JSON 友好的列表。""" return [self.row, self.col] @staticmethod def from_value(value: Sequence[int]) -> "Position": """从列表或元组构造坐标。""" if len(value) != 2: raise...

AI 评审点评

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

【CLAUDE】候选实现整体质量较高,达到生产级代码的基本标准。架构设计清晰,观察者模式、A* 寻路、回放系统、序列化等核心功能均已实现且逻辑正确。代码风格统一,类型注解和 docstring 覆盖率高。主要不足在于:缺少 PAUSED 状态机、道具生成时机与需求描述略有偏差、移动冷却机制引入了额外复杂度、部分方法过长。与参考答案相比,整体功能覆盖率约为 90%,代码质量略优于参考答案(更好的异常处理和边界防护),但在功能完整性上略有欠缺。 【GEMINI】这是一份极其优秀的生产级贪吃蛇游戏引擎实现。代码不仅完全满足了所有复杂的核心架构要求(三种模式、A* 寻路、道具系统、增量回放、序列化、排行榜、事件总线),而且在细节处理上(如双人同帧对撞判定、180° 转向防护、不增长时移动到尾部格子的合法性判定)表现出了极高的专业度。代码结构清晰、算法高效、测试充分,堪称典范。 【KIMI】该实现整体达到生产级代码的基本要求,架构清晰、模块化程度较高,核心功能基本覆盖。但存在若干关键逻辑缺陷:双人模式结束条件与需求不符、道具穿墙效果在经典模式下的碰撞检测存在漏洞、A*寻路的安全检查未完全覆盖对手蛇身。回放系统的delta压缩粒度较粗,测试用例对道具系统和复杂边界条件的覆盖不足。建议在模式策略抽象、道具效果与碰撞系统的整合、以及测试覆盖率方面进行改进。

相关链接

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

加载中...