飞算 JavaAI:五步智能引导构建坦克大战游戏
创建项目

# 🎮 坦克大战 - Tank Battle
一个经典坦克游戏克隆,致敬任天堂的《坦克大战》(Battle City)。
## ✨ 功能特性
### 核心玩法
- **玩家坦克** - 使用 WASD 或方向键控制移动,空格键射击
- **AI 敌方坦克** - 自动移动和射击,难度随关卡递增
- **基地保护** - 保护你的金色基地不被敌人摧毁
- **关卡系统** - 通关后自动进入下一关,敌人越来越强
### 地图元素
- **🧱 砖墙** - 可被子弹破坏,提供战术掩护
- **🔩 钢墙** - 不可破坏的坚固障碍物(增强子弹可以破坏)
- **💧 水域** - 坦克无法通过的水域
- **🌲 树林** - 可以隐藏坦克的树林
- **🏠 基地** - 需要保护的核心目标
### 游戏系统
- **分数系统** - 消灭敌人获得分数,通关获得奖励
- **生命系统** - 玩家有 3 条生命
- **爆炸效果** - 炫酷的爆炸动画
- **游戏状态** - 开始界面、游戏界面、结束界面
- **音频系统** - 完整的音效系统,支持开关控制
- **道具系统** - 多种道具增强游戏可玩性
### 道具系统
- **⚡ 速度提升** - 移动速度增加 50%,持续 10 秒
- **🔥 火力提升** - 增加射击频率、子弹速度、伤害,支持穿透钢墙,持续 10 秒
- **🛡️ 护盾** - 提供无敌效果,持续 10 秒
- **❤️ 生命** - 增加 1 条生命
- **💣 炸弹** - 消灭所有敌人
- **❄️ 冻结** - 冻结所有敌人 5 秒
## 🎯 操作说明
| 按键 | 功能 |
|------|------|
| W / ↑ | 向上移动 |
| S / ↓ | 向下移动 |
| A / ← | 向左移动 |
| D / → | 向右移动 |
| 空格键 | 发射子弹 |
| 音效按钮 | 开关游戏音效(开启/关闭) |
一、理解需求


- 需要游戏房间创建功能,支持生成唯一的游戏会话标识,用于管理单局游戏的生命周期
- 需要玩家状态初始化功能,支持在游戏开始时设定玩家的初始生命值为3、初始分数为0及初始坦克属性
- 需要玩家坦克移动逻辑处理功能,支持根据移动指令计算坦克下一帧坐标,并校验与砖墙、钢墙、水域、边界等地图元素的碰撞情况以阻断非法移动
- 需要玩家坦克射击逻辑处理功能,支持根据射击指令生成子弹对象,判定子弹飞行轨迹与地图障碍物、敌方坦克及基地的碰撞结果
- 需要地图数据加载功能,支持根据关卡ID获取对应的地图布局数据,包含砖墙、钢墙、水域、树林、基地等元素的位置坐标信息
- 需要敌方坦克AI控制功能,支持自动控制敌方坦克进行移动路径规划、转向逻辑及自动射击,并实现随关卡递增的难度参数调整
- 需要子弹碰撞判定功能,支持区分子弹击中不同目标(砖墙、钢墙、坦克、基地)后的处理逻辑,包括销毁子弹、扣除目标生命值或销毁目标
- 需要基地保护判定功能,支持监测基地是否被敌方子弹或玩家误伤击中,一旦击中立即触发游戏失败结算流程
- 需要地图元素破坏机制功能,支持普通子弹破坏砖墙、增强子弹破坏钢墙的逻辑,并同步更新地图障碍物状态
- 需要道具生成与掉落功能,支持在特定条件触发下(如消灭敌方坦克)随机生成速度提升、火力提升、护盾、生命、炸弹、冻结等道具实体
- 需要道具拾取生效功能,支持玩家坦克拾取道具后触发对应效果,包括移动速度增益、射击属性增强、无敌状态、生命值增加、全屏敌人清除及敌人冻结状态
- 需要道具效果时效管理功能,支持对速度提升、火力提升、护盾、冻结等具有持续时间的道具效果进行倒计时管理及状态自动清除
- 需要分数结算功能,支持根据消灭敌方坦克的类型、数量及通关奖励计算并累加玩家当前得分
- 需要生命值管理功能,支持玩家坦克被击毁时扣除生命值,并在生命值归零时触发游戏结束流程
- 需要关卡进度管理功能,支持在消灭当前关卡所有敌人后判定通关,并自动切换至下一关卡或触发游戏胜利结算
- 需要游戏状态流转控制功能,支持管理游戏从准备开始、进行中、暂停、结束等状态的切换逻辑
- 需要游戏音效开关控制功能,支持接收客户端音效设置指令,维护当前游戏会话的音效开启或关闭状态
- 需要游戏结算功能,支持在游戏结束或通关时生成包含最终得分、存活状态、通关关卡数等数据的结算报告
二、设计接口


- 游戏房间管理
负责创建新的游戏房间并生成唯一的游戏会话标识,用于管理单局游戏的完整生命周期;支持游戏状态的流转控制,包括准备开始、进行中、暂停、结束等状态的切换逻辑;同时维护游戏会话内的全局设置,如接收客户端指令以开启或关闭游戏音效状态。
- 地图数据服务
负责根据关卡ID获取对应的地图布局数据,提供砖墙、钢墙、水域、树林、基地等元素的位置坐标信息;支持在游戏过程中动态更新地图障碍物状态,处理普通子弹破坏砖墙、增强子弹破坏钢墙后的地形数据同步。
- 玩家状态管理
负责在游戏开始时初始化玩家状态,设定初始生命值为3、初始分数为0及初始坦克属性;支持在游戏过程中对玩家生命值进行增减管理,当玩家坦克被击毁时扣除生命值,并在生命值归零时触发游戏结束流程;支持根据消灭敌人及通关奖励实时计算并累加玩家得分。
- 玩家坦克操控
负责处理玩家坦克的移动与射击逻辑;移动逻辑支持根据指令计算下一帧坐标,并校验与砖墙、钢墙、水域、边界等地图元素的碰撞以阻断非法移动;射击逻辑支持根据指令生成子弹对象,判定子弹飞行轨迹与地图障碍物、敌方坦克及基地的碰撞结果。
- 敌方坦克智能控制
负责自动控制敌方坦克的行为逻辑,包括移动路径规划、转向逻辑及自动射击;支持随关卡递增动态调整敌方坦克的难度参数;配合道具效果,支持在冻结状态下暂停行动逻辑。
- 子弹碰撞判定
负责处理子弹飞行过程中的碰撞检测,区分子弹击中不同目标后的处理逻辑;击中砖墙或钢墙时销毁子弹并根据子弹类型破坏障碍物;击中坦克时扣除目标生命值或销毁目标;击中基地时触发基地保护判定逻辑。
- 基地保护判定
负责监测基地是否被敌方子弹或玩家误伤击中,一旦判定基地受损,立即触发游戏失败结算流程,确保核心目标不被摧毁。
- 道具系统管理
负责道具的全生命周期管理,支持在消灭敌方坦克等特定条件下随机生成速度提升、火力提升、护盾、生命、炸弹、冻结等道具实体;处理玩家坦克拾取道具后的生效逻辑,包括即时效果(如增加生命、全屏清除敌人)和持续性效果(如速度增益、无敌状态、敌人冻结)的触发;支持对具有持续时间的道具效果进行倒计时管理及状态自动清除。
- 关卡进度管理
负责监测当前关卡内敌人的消灭情况,判定是否通关;支持在通关后自动切换至下一关卡并重置场景,或在通过所有关卡后触发游戏胜利结算流程。
- 游戏结算服务
负责在游戏结束(生命值归零或基地被毁)或通关时生成结算报告,统计并输出最终得分、存活状态、通关关卡数等核心数据.
三、表结构设计


CREATE TABLE t_game_room (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
room_code VARCHAR(64) NOT NULL COMMENT '游戏会话标识(唯一)',
game_status TINYINT DEFAULT 0 COMMENT '游戏状态(0:准备开始,1:进行中,2:暂停,3:结束)',
sound_enabled TINYINT DEFAULT 1 COMMENT '音效开关(0:关闭,1:开启)',
create_by VARCHAR(64) COMMENT '创建人',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(64) COMMENT '修改人',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (id),
UNIQUE KEY uk_room_code (room_code)
) ENGINE=InnoDB COMMENT='游戏房间表';
CREATE TABLE t_level_map_config (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
level_id INT NOT NULL COMMENT '关卡ID',
map_data TEXT NOT NULL COMMENT '地图布局数据(JSON格式,包含砖墙、钢墙、水域、树林、基地等元素坐标)',
create_by VARCHAR(64) COMMENT '创建人',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(64) COMMENT '修改人',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (id),
KEY idx_level_id (level_id)
) ENGINE=InnoDB COMMENT='关卡地图配置表';
CREATE TABLE t_player_status (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
room_code VARCHAR(64) NOT NULL COMMENT '游戏会话标识',
player_id VARCHAR(64) NOT NULL COMMENT '玩家标识',
lives INT DEFAULT 3 COMMENT '生命值',
score INT DEFAULT 0 COMMENT '当前得分',
tank_type VARCHAR(32) COMMENT '坦克类型',
create_by VARCHAR(64) COMMENT '创建人',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(64) COMMENT '修改人',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (id),
KEY idx_room_code (room_code)
) ENGINE=InnoDB COMMENT='玩家状态表';
CREATE TABLE t_tank_entity (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
room_code VARCHAR(64) NOT NULL COMMENT '游戏会话标识',
tank_code VARCHAR(64) NOT NULL COMMENT '坦克唯一标识',
tank_type TINYINT NOT NULL COMMENT '坦克类型(1:玩家坦克,2:敌方坦克)',
pos_x INT NOT NULL COMMENT '当前X坐标',
pos_y INT NOT NULL COMMENT '当前Y坐标',
direction TINYINT DEFAULT 0 COMMENT '朝向(0:上,1:下,2:左,3:右)',
speed INT DEFAULT 1 COMMENT '移动速度',
fire_power INT DEFAULT 1 COMMENT '火力等级',
shield_status TINYINT DEFAULT 0 COMMENT '护盾状态(0:无,1:有)',
frozen_status TINYINT DEFAULT 0 COMMENT '冻结状态(0:正常,1:冻结)',
is_alive TINYINT DEFAULT 1 COMMENT '存活状态(0:已销毁,1:存活)',
create_by VARCHAR(64) COMMENT '创建人',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(64) COMMENT '修改人',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (id),
KEY idx_room_code (room_code)
) ENGINE=InnoDB COMMENT='坦克实体表';
CREATE TABLE t_bullet_entity (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
room_code VARCHAR(64) NOT NULL COMMENT '游戏会话标识',
bullet_code VARCHAR(64) NOT NULL COMMENT '子弹唯一标识',
owner_tank_code VARCHAR(64) NOT NULL COMMENT '发射者坦克标识',
pos_x INT NOT NULL COMMENT '当前X坐标',
pos_y INT NOT NULL COMMENT '当前Y坐标',
direction TINYINT NOT NULL COMMENT '飞行方向(0:上,1:下,2:左,3:右)',
bullet_type TINYINT DEFAULT 1 COMMENT '子弹类型(1:普通子弹,2:增强子弹)',
is_active TINYINT DEFAULT 1 COMMENT '是否激活(0:已销毁,1:激活)',
create_by VARCHAR(64) COMMENT '创建人',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(64) COMMENT '修改人',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (id),
KEY idx_room_code (room_code)
) ENGINE=InnoDB COMMENT='子弹实体表';
CREATE TABLE t_map_obstacle (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
room_code VARCHAR(64) NOT NULL COMMENT '游戏会话标识',
obstacle_type TINYINT NOT NULL COMMENT '障碍物类型(1:砖墙,2:钢墙,3:水域,4:树林,5:基地)',
pos_x INT NOT NULL COMMENT 'X坐标',
pos_y INT NOT NULL COMMENT 'Y坐标',
is_destroyed TINYINT DEFAULT 0 COMMENT '是否被破坏(0:否,1:是)',
create_by VARCHAR(64) COMMENT '创建人',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(64) COMMENT '修改人',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (id),
KEY idx_room_code (room_code)
) ENGINE=InnoDB COMMENT='地图障碍物状态表';
CREATE TABLE t_prop_entity (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
room_code VARCHAR(64) NOT NULL COMMENT '游戏会话标识',
prop_code VARCHAR(64) NOT NULL COMMENT '道具唯一标识',
prop_type TINYINT NOT NULL COMMENT '道具类型(1:速度提升,2:火力提升,3:护盾,4:生命,5:炸弹,6:冻结)',
pos_x INT NOT NULL COMMENT 'X坐标',
pos_y INT NOT NULL COMMENT 'Y坐标',
is_picked TINYINT DEFAULT 0 COMMENT '是否被拾取(0:否,1:是)',
create_by VARCHAR(64) COMMENT '创建人',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(64) COMMENT '修改人',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (id),
KEY idx_room_code (room_code)
) ENGINE=InnoDB COMMENT='道具实体表';
CREATE TABLE t_prop_effect (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
room_code VARCHAR(64) NOT NULL COMMENT '游戏会话标识',
tank_code VARCHAR(64) NOT NULL COMMENT '生效坦克标识',
prop_type TINYINT NOT NULL COMMENT '道具类型(1:速度提升,2:火力提升,3:护盾,6:冻结)',
start_time DATETIME NOT NULL COMMENT '生效开始时间',
duration_seconds INT NOT NULL COMMENT '持续时长(秒)',
is_active TINYINT DEFAULT 1 COMMENT '是否生效中(0:已失效,1:生效中)',
create_by VARCHAR(64) COMMENT '创建人',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(64) COMMENT '修改人',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (id),
KEY idx_room_code (room_code)
) ENGINE=InnoDB COMMENT='道具效果记录表';
CREATE TABLE t_level_progress (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
room_code VARCHAR(64) NOT NULL COMMENT '游戏会话标识',
current_level_id INT DEFAULT 1 COMMENT '当前关卡ID',
enemy_total INT DEFAULT 0 COMMENT '敌人总数',
enemy_killed INT DEFAULT 0 COMMENT '已消灭敌人数',
is_passed TINYINT DEFAULT 0 COMMENT '是否通关(0:否,1:是)',
create_by VARCHAR(64) COMMENT '创建人',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(64) COMMENT '修改人',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (id),
KEY idx_room_code (room_code)
) ENGINE=InnoDB COMMENT='关卡进度表';
CREATE TABLE t_game_settlement (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
room_code VARCHAR(64) NOT NULL COMMENT '游戏会话标识',
player_id VARCHAR(64) NOT NULL COMMENT '玩家标识',
final_score INT DEFAULT 0 COMMENT '最终得分',
survive_status TINYINT DEFAULT 0 COMMENT '存活状态(0:阵亡,1:存活)',
passed_level_count INT DEFAULT 0 COMMENT '通关关卡数',
result TINYINT DEFAULT 0 COMMENT '游戏结果(0:失败,1:胜利)',
create_by VARCHAR(64) COMMENT '创建人',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(64) COMMENT '修改人',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (id),
KEY idx_room_code (room_code)
) ENGINE=InnoDB COMMENT='游戏结算记录表';
四、处理逻辑(接口)


- 游戏房间管理
- 创建游戏房间
- 入参对象属性: createBy(创建人,必填)
- 处理逻辑: 生成唯一的游戏会话标识(roomCode)。
- 处理逻辑: 初始化游戏房间信息,游戏状态默认为’准备开始’(0),音效状态默认为’开启’(1)。
- 处理逻辑: 将游戏房间数据保存到t_game_room表。
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:…}
- 修改游戏状态
- 入参对象属性: roomCode(游戏会话标识,必填)、gameStatus(游戏状态,必填)
- 处理逻辑: 根据roomCode查询t_game_room表,如果房间不存在,返回失败信息。
- 返回结果: {“code”:”000001”,”msg”:”游戏房间不存在”,”data”:…}
- 处理逻辑: 校验游戏状态的流转逻辑,例如只有’准备开始’状态才能切换为’进行中’,’进行中’才能切换为’暂停’等。
- 处理逻辑: 如果状态流转校验失败,返回失败信息。
- 返回结果: {“code”:”000001”,”msg”:”游戏状态流转不合法”,”data”:…}
- 处理逻辑: 更新t_game_room表中的gameStatus字段。
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:…}
- 切换游戏音效
- 入参对象属性: roomCode(游戏会话标识,必填)、soundEnabled(音效开关,必填)
- 处理逻辑: 根据roomCode查询t_game_room表,如果房间不存在,返回失败信息。
- 返回结果: {“code”:”000001”,”msg”:”游戏房间不存在”,”data”:…}
- 处理逻辑: 更新t_game_room表中的soundEnabled字段,实现开启或关闭音效状态。
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:…}
- 获取游戏房间信息
- 入参对象属性: roomCode(游戏会话标识,必填)
- 处理逻辑: 根据roomCode查询t_game_room表。
- 处理逻辑: 如果房间不存在,返回失败信息。
- 返回结果: {“code”:”000001”,”msg”:”游戏房间不存在”,”data”:…}
- 处理逻辑: 获取房间详细信息并返回。
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:…}
- 地图数据服务
- 获取关卡地图布局
- 请求入参对象属性: levelId(关卡ID,必填)
- 处理逻辑: 根据关卡ID查询t_level_map_config表获取地图配置信息
- 处理逻辑: 如果未查询到地图配置信息,返回失败信息
- 返回结果: {“code”:”000001”,”msg”:”地图配置不存在”,”data”:…}
- 处理逻辑: 解析mapData字段,获取砖墙、钢墙、水域、树林、基地等元素的坐标信息
- 处理逻辑: 返回地图布局数据
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:…}
- 初始化房间地图障碍物
- 请求入参对象属性: roomCode(游戏会话标识,必填)、levelId(关卡ID,必填)
- 任务1: 校验关卡配置
- 处理逻辑: 根据levelId查询t_level_map_config表确认关卡配置是否存在
- 处理逻辑: 如果关卡配置不存在,返回失败信息
- 返回结果: {“code”:”000001”,”msg”:”关卡配置不存在”,”data”:…}
- 任务2: 初始化障碍物数据
- 处理逻辑: 解析地图配置中的mapData字段
- 处理逻辑: 将解析出的障碍物数据(砖墙、钢墙、水域、树林、基地等)批量插入t_map_obstacle表,状态初始化为未破坏
- 处理逻辑: 返回初始化成功信息
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:…}
- 更新地图障碍物状态
- 请求入参对象属性: roomCode(游戏会话标识,必填)、posX(X坐标,必填)、posY(Y坐标,必填)、bulletType(子弹类型,必填)
- 任务1: 查询障碍物信息
- 处理逻辑: 根据roomCode和坐标查询t_map_obstacle表中的障碍物记录
- 处理逻辑: 如果障碍物不存在或已被破坏,返回调用成功但不做处理
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:…}
- 任务2: 校验破坏逻辑
- 处理逻辑: 判断障碍物类型,若为钢墙且子弹类型不为增强子弹,则无法破坏,直接返回成功
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:…}
- 处理逻辑: 若为水域、树林或基地类型,不执行破坏逻辑,直接返回
- 任务3: 执行破坏更新
- 处理逻辑: 若满足破坏条件(砖墙或可被增强子弹破坏的钢墙),更新t_map_obstacle表中对应该记录的isDestroyed状态为1(已破坏)
- 处理逻辑: 返回更新成功信息
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:…}
- 玩家状态管理
- 初始化玩家状态
- 请求入参对象属性: roomCode(游戏会话标识,必填)、playerId(玩家标识,必填)、tankType(坦克类型)
- 处理逻辑: 根据roomCode查询t_game_room表,校验游戏房间是否存在
- 返回结果:{“code”:”000001”,”msg”:”游戏房间不存在”,”data”:…}
- 处理逻辑: 根据roomCode和playerId查询t_player_status表,校验该玩家是否已初始化
- 返回结果:{“code”:”000001”,”msg”:”玩家状态已存在”,”data”:…}
- 处理逻辑: 构建玩家状态对象,设定初始生命值为3、初始分数为0,保存至t_player_status表
- 处理逻辑: 根据传入的tankType或默认配置,初始化玩家坦克实体数据并保存至t_tank_entity表
- 返回结果:{“code”:”000000”,”msg”:”调用成功”,”data”:…}
- 更新玩家生命值
- 请求入参对象属性: roomCode(游戏会话标识,必填)、playerId(玩家标识,必填)、livesChange(生命值变化量,必填,正数为增加负数为减少)
- 处理逻辑: 根据roomCode和playerId查询t_player_status表,获取当前玩家状态
- 返回结果:{“code”:”000001”,”msg”:”玩家状态不存在”,”data”:…}
- 处理逻辑: 计算更新后的生命值(当前生命值 + livesChange)
- 处理逻辑: 如果更新后的生命值小于等于0,将生命值设置为0,并更新数据库记录
- 处理逻辑: 触发游戏结束流程(调用游戏结算服务相关逻辑),标记游戏失败
- 返回结果:{“code”:”000000”,”msg”:”游戏结束”,”data”:{“lives”:0}}
- 处理逻辑: 如果更新后的生命值大于0,更新t_player_status表中的lives字段
- 返回结果:{“code”:”000000”,”msg”:”调用成功”,”data”:{“lives”:…}}
- 更新玩家得分
- 请求入参对象属性: roomCode(游戏会话标识,必填)、playerId(玩家标识,必填)、scoreChange(得分变化量,必填,正整数)
- 处理逻辑: 根据roomCode和playerId查询t_player_status表,获取当前玩家状态
- 返回结果:{“code”:”000001”,”msg”:”玩家状态不存在”,”data”:…}
- 处理逻辑: 计算累加后的得分(当前得分 + scoreChange),更新t_player_status表中的score字段
- 返回结果:{“code”:”000000”,”msg”:”调用成功”,”data”:{“currentScore”:…}}
- 查询玩家状态
- 请求入参对象属性: roomCode(游戏会话标识,必填)、playerId(玩家标识,必填)
- 处理逻辑: 根据roomCode和playerId查询t_player_status表
- 返回结果:{“code”:”000001”,”msg”:”玩家状态不存在”,”data”:…}
- 处理逻辑: 获取玩家当前生命值、得分及坦克属性信息
- 返回结果:{“code”:”000000”,”msg”:”调用成功”,”data”:…}
- 玩家坦克操控
- 玩家坦克移动
- 请求入参对象属性:roomCode(游戏会话标识,必填)、tankCode(坦克唯一标识,必填)、direction(移动朝向,必填)
- 处理逻辑:根据roomCode查询t_game_room表,校验游戏状态是否为“进行中”,若不是则返回失败信息
- 返回结果:{“code”:”000001”,”msg”:”游戏未开始或已结束”,”data”:…}
- 处理逻辑:根据tankCode查询t_tank_entity表,校验坦克是否存在且存活状态为“存活”,若校验不通过则返回失败信息
- 返回结果:{“code”:”000001”,”msg”:”坦克不存在或已销毁”,”data”:…}
- 处理逻辑:校验坦克的frozen_status是否为“冻结”,若处于冻结状态则返回失败信息
- 返回结果:{“code”:”000001”,”msg”:”坦克处于冻结状态无法移动”,”data”:…}
- 处理逻辑:根据坦克当前坐标、direction和speed计算下一帧的目标坐标
- 处理逻辑:查询t_map_obstacle表获取当前地图障碍物信息,校验目标坐标是否与砖墙、钢墙、水域或边界发生碰撞
- 处理逻辑:若发生碰撞,阻断移动,返回当前位置信息
- 返回结果:{“code”:”000000”,”msg”:”移动受阻”,”data”:…}
- 处理逻辑:若无碰撞,更新t_tank_entity表中的pos_x、pos_y及direction字段
- 返回结果:{“code”:”000000”,”msg”:”移动成功”,”data”:…}
- 玩家坦克射击
- 请求入参对象属性:roomCode(游戏会话标识,必填)、tankCode(坦克唯一标识,必填)
- 处理逻辑:根据roomCode查询t_game_room表,校验游戏状态是否为“进行中”,若不是则返回失败信息
- 返回结果:{“code”:”000001”,”msg”:”游戏未开始或已结束”,”data”:…}
- 处理逻辑:根据tankCode查询t_tank_entity表,校验坦克是否存在、存活状态为“存活”且frozen_status为“正常”,若校验不通过则返回失败信息
- 返回结果:{“code”:”000001”,”msg”:”坦克状态异常无法射击”,”data”:…}
- 处理逻辑:生成子弹唯一标识bulletCode,根据坦克坐标和朝向确定子弹初始坐标
- 处理逻辑:根据坦克的fire_power字段确定bullet_type(普通或增强)
- 处理逻辑:将子弹数据插入t_bullet_entity表,状态设为激活
- 返回结果:{“code”:”000000”,”msg”:”射击成功”,”data”:…}
- 敌方坦克智能控制
- 敌方坦克行为调度
- 请求入参对象属性: roomCode(游戏会话标识,必填)
- 处理逻辑: 根据roomCode查询游戏房间信息,如果房间不存在或游戏状态不为“进行中”,则不执行后续逻辑
- 处理逻辑: 查询关卡进度表t_level_progress,判断当前关卡是否已通关或未开始,若异常则终止调度
- 处理逻辑: 查询道具效果记录表t_prop_effect,检查是否存在类型为“冻结”且状态为“生效中”的记录,若存在则跳过敌方坦克行动逻辑
- 处理逻辑: 查询坦克实体表t_tank_entity,获取所有tank_type为“敌方坦克”且is_alive为“存活”的坦克列表
- 处理逻辑: 遍历敌方坦克列表,根据坦克当前位置和地图障碍物信息进行移动路径规划,计算下一帧坐标并更新posX、posY及direction字段
- 处理逻辑: 在移动逻辑执行后,根据预设的射击频率逻辑判定是否触发射击,若触发则生成子弹实体并保存至t_bullet_entity表
- 返回结果:{“code”:”000000”,”msg”:”调用成功”,”data”:…}
- 更新敌方坦克难度参数
- 请求入参对象属性: roomCode(游戏会话标识,必填)、levelId(关卡ID,必填)
- 处理逻辑: 根据roomCode查询游戏房间信息,校验房间是否存在
- 处理逻辑: 根据levelId查询关卡配置,获取该关卡对应的敌方坦克基础属性(如速度、火力等)
- 处理逻辑: 查询当前房间内所有存活的敌方坦克实体
- 处理逻辑: 根据关卡难度系数动态调整敌方坦克的speed(移动速度)和firePower(火力等级),并更新t_tank_entity表
- 返回结果:{“code”:”000000”,”msg”:”调用成功”,”data”:…}
- 返回结果:{“code”:”000001”,”msg”:”游戏房间不存在”,”data”:…}
- 冻结敌方坦克行动
- 请求入参对象属性: roomCode(游戏会话标识,必填)、durationSeconds(持续时长,必填)
- 处理逻辑: 根据roomCode查询游戏房间信息,校验房间是否存在
- 处理逻辑: 查询当前房间内所有存活的敌方坦克实体
- 处理逻辑: 遍历敌方坦克列表,将frozenStatus更新为“冻结”状态
- 处理逻辑: 在道具效果记录表t_prop_effect中插入一条类型为“冻结”的记录,记录生效开始时间和持续时长
- 返回结果:{“code”:”000000”,”msg”:”调用成功”,”data”:…}
- 解冻敌方坦克行动
- 请求入参对象属性: roomCode(游戏会话标识,必填)
- 处理逻辑: 根据roomCode查询道具效果记录表t_prop_effect,获取类型为“冻结”且状态为“生效中”的记录
- 处理逻辑: 判断当前时间是否超过生效开始时间加上持续时长,若已超时则将is_active更新为“已失效”
- 处理逻辑: 查询当前房间内所有存活的敌方坦克实体,将frozenStatus更新为“正常”状态
- 返回结果:{“code”:”000000”,”msg”:”调用成功”,”data”:…}
- 子弹碰撞判定
- 子弹碰撞检测处理
- 入参对象属性: roomCode(游戏会话标识,必填)、bulletCode(子弹唯一标识,必填)、posX(当前碰撞X坐标,必填)、posY(当前碰撞Y坐标,必填)
- 处理逻辑: 根据roomCode和bulletCode查询t_bullet_entity表,校验子弹是否存在且处于激活状态(is_active=1)。
- 返回结果: {“code”:”000001”,”msg”:”子弹不存在或已销毁”,”data”:…}
- 处理逻辑: 校验游戏房间状态,查询t_game_room表,如果game_status不为1(进行中),则不予处理。
- 返回结果: {“code”:”000001”,”msg”:”游戏非进行中状态”,”data”:…}
- 处理逻辑: 根据posX和posY查询t_map_obstacle表,判断是否存在未破坏(is_destroyed=0)的障碍物。
- 处理逻辑: 如果击中的是砖墙(obstacle_type=1),更新t_map_obstacle表将is_destroyed设为1,更新t_bullet_entity表将is_active设为0,并返回碰撞结果。
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:{“hitType”:”brick”,”destroyed”:true}}
- 处理逻辑: 如果击中的是钢墙(obstacle_type=2),查询子弹类型bullet_type,如果是增强子弹(bullet_type=2),则更新t_map_obstacle表将is_destroyed设为1;如果是普通子弹,则仅销毁子弹。更新t_bullet_entity表将is_active设为0。
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:{“hitType”:”steel”,”destroyed”:false}}
- 处理逻辑: 如果击中的是基地(obstacle_type=5),更新t_map_obstacle表将is_destroyed设为1,更新t_bullet_entity表将is_active设为0,并触发游戏失败逻辑(调用游戏结算服务)。
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:{“hitType”:”base”,”gameOver”:true}}
- 处理逻辑: 如果未击中障碍物,根据posX和posY查询t_tank_entity表,判断是否存在存活(is_alive=1)的坦克。
- 处理逻辑: 如果击中坦克,判断owner_tank_code与被击中坦克的tank_code是否相同,若相同则为误伤自己,仅销毁子弹。
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:{“hitType”:”self”}}
- 处理逻辑: 如果击中敌方坦克(tank_type=2),查询坦克的护盾状态shield_status。如果shield_status=1,则仅销毁子弹;如果shield_status=0,更新t_tank_entity表将is_alive设为0,更新t_bullet_entity表将is_active设为0,并通知敌方坦克智能控制模块移除该坦克。
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:{“hitType”:”enemyTank”,”killed”:true}}
- 处理逻辑: 如果击中玩家坦克(tank_type=1),查询坦克的护盾状态shield_status。如果shield_status=1,则仅销毁子弹;如果shield_status=0,更新t_player_status表减少lives,若lives大于0则重置坦克位置,若lives等于0则更新t_tank_entity表将is_alive设为0并触发游戏结束流程。
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:{“hitType”:”playerTank”,”livesRemaining”:2}}
- 处理逻辑: 如果未击中任何目标,返回未碰撞结果。
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:{“hitType”:”none”}}
- 基地保护判定
- 基地受损判定
- 入参对象属性: roomCode(游戏会话标识,必填)、bulletCode(子弹唯一标识,必填)
- 处理逻辑: 根据roomCode查询游戏房间信息,如果房间不存在或游戏状态不为“进行中”,返回失败信息
- 返回结果:{“code”:”000001”,”msg”:”游戏房间不存在或未开始”,”data”:…}
- 处理逻辑: 根据bulletCode查询子弹实体信息,如果子弹不存在或未激活,返回失败信息
- 返回结果:{“code”:”000001”,”msg”:”子弹信息不存在”,”data”:…}
- 处理逻辑: 根据roomCode和障碍物类型为“基地”查询地图障碍物状态表(t_map_obstacle),获取基地坐标信息
- 处理逻辑: 计算子弹当前坐标与基地坐标是否重叠,如果重叠则判定基地受损
- 处理逻辑: 如果基地未受损,返回判定结果
- 返回结果:{“code”:”000000”,”msg”:”基地安全”,”data”:{“damaged”:false}}
- 处理逻辑: 如果基地受损,更新地图障碍物状态表(t_map_obstacle)中基地的is_destroyed状态为1(已破坏)
- 处理逻辑: 更新子弹实体表(t_bullet_entity)中该子弹的is_active状态为0(已销毁)
- 处理逻辑: 更新游戏房间表(t_game_room)的游戏状态为3(结束)
- 处理逻辑: 查询玩家状态表(t_player_status)获取当前玩家得分
- 处理逻辑: 查询关卡进度表(t_level_progress)获取当前通关关卡数
- 处理逻辑: 在游戏结算记录表(t_game_settlement)中插入结算记录,结果为0(失败),记录最终得分和通关关卡数
- 返回结果:{“code”:”000000”,”msg”:”基地被摧毁,游戏结束”,”data”:{“damaged”:true,”gameResult”:0}}
- 道具系统管理
- 生成道具
- 入参对象属性: roomCode(游戏会话标识,必填)、propType(道具类型,必填)、posX(X坐标,必填)、posY(Y坐标,必填)
- 处理逻辑: 校验游戏房间是否存在且状态为进行中。
- 返回结果: {“code”:”000001”,”msg”:”游戏房间不存在或未开始”,”data”:…}
- 处理逻辑: 构建道具实体对象,生成唯一道具标识。
- 处理逻辑: 将道具信息保存至道具实体表(t_prop_entity)。
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:…}
- 拾取道具
- 入参对象属性: roomCode(游戏会话标识,必填)、tankCode(拾取者坦克标识,必填)、propCode(道具唯一标识,必填)
- 处理逻辑: 校验道具是否存在且未被拾取。
- 返回结果: {“code”:”000001”,”msg”:”道具不存在或已被拾取”,”data”:…}
- 处理逻辑: 校验坦克是否存在且存活。
- 返回结果: {“code”:”000001”,”msg”:”坦克不存在或已阵亡”,”data”:…}
- 处理逻辑: 更新道具实体表(t_prop_entity)中的状态为已拾取。
- 处理逻辑: 根据道具类型执行生效逻辑:
-
- 速度提升(1):更新坦克实体表(t_tank_entity)的速度字段,并在道具效果表(t_prop_effect)记录持续效果。
-
- 火力提升(2):更新坦克实体表(t_tank_entity)的火力等级,并在道具效果表(t_prop_effect)记录持续效果。
-
- 护盾(3):更新坦克实体表(t_tank_entity)的护盾状态,并在道具效果表(t_prop_effect)记录持续效果。
-
- 生命(4):增加玩家状态表(t_player_status)中的生命值。
-
- 炸弹(5):触发全屏敌方坦克销毁逻辑(更新敌方坦克状态为已销毁)。
-
- 冻结(6):更新所有敌方坦克实体表(t_tank_entity)的冻结状态,并在道具效果表(t_prop_effect)记录持续效果。
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:…}
- 清除过期道具效果
- 入参对象属性: roomCode(游戏会话标识,必填)
- 处理逻辑: 查询道具效果表(t_prop_effect)中当前时间已过期的生效记录。
- 处理逻辑: 遍历过期记录,根据道具类型反向操作:
-
- 速度提升:恢复坦克默认速度。
-
- 火力提升:恢复坦克默认火力。
-
- 护盾:清除坦克护盾状态。
-
- 冻结:解除敌方坦克冻结状态。
- 处理逻辑: 更新坦克实体表(t_tank_entity)中对应的状态字段。
- 处理逻辑: 更新道具效果表(t_prop_effect)中的状态为已失效。
- 返回结果: {“code”:”000000”,”msg”:”调用成功”,”data”:…}
- 关卡进度管理
- 消灭敌人进度更新
- 入参对象属性: roomCode(游戏会话标识,必填)、enemyKilledCount(本次消灭敌人数量,必填)
- 处理逻辑:根据roomCode查询t_level_progress表,确认游戏状态是否为进行中
- 处理逻辑:如果进度记录不存在,返回失败信息
- 返回结果:{“code”:”000001”,”msg”:”游戏进度信息不存在”,”data”:…}
- 处理逻辑:更新t_level_progress表中的enemy_killed字段,值为原值加上enemyKilledCount
- 处理逻辑:判断更新后的enemy_killed是否大于等于enemy_total
- 处理逻辑:如果消灭数量达到总数,判定当前关卡通过,更新is_passed状态为1
- 返回结果:{“code”:”000000”,”msg”:”进度更新成功”,”data”:{“currentKilled”:…,”isLevelPassed”:…}}
- 处理逻辑:如果消灭数量未达标,返回当前进度数据
- 返回结果:{“code”:”000000”,”msg”:”进度更新成功”,”data”:{“currentKilled”:…,”isLevelPassed”:false}}
- 关卡结算与切换
- 入参对象属性: roomCode(游戏会话标识,必填)
- 处理逻辑:根据roomCode查询t_level_progress表获取当前关卡信息
- 处理逻辑:校验当前关卡是否已标记为通过(is_passed=1)
- 处理逻辑:如果当前关卡未通过,返回失败信息
- 返回结果:{“code”:”000001”,”msg”:”当前关卡尚未通过”,”data”:…}
- 处理逻辑:计算下一关卡ID(current_level_id + 1)
- 处理逻辑:查询t_level_map_config表,判断下一关卡ID是否存在
- 处理逻辑:如果下一关卡存在,执行关卡切换逻辑
- 处理逻辑:更新t_level_progress表,设置current_level_id为下一关卡ID,重置enemy_killed为0,is_passed为0,并根据新关卡配置更新enemy_total
- 处理逻辑:清理当前房间的残留数据,包括删除t_tank_entity中该房间敌方坦克记录、删除t_bullet_entity中该房间子弹记录、删除t_prop_entity中该房间道具记录、重置t_map_obstacle中该房间的障碍物状态
- 返回结果:{“code”:”000000”,”msg”:”切换至下一关”,”data”:{“nextLevelId”:…}}
- 处理逻辑:如果下一关卡不存在,判定为通关所有关卡,触发游戏胜利结算
- 处理逻辑:更新t_game_room表,将game_status置为3(结束)
- 处理逻辑:查询t_player_status获取最终得分、生命值等信息
- 处理逻辑:组装结算数据并插入t_game_settlement表,result置为1(胜利)
- 返回结果:{“code”:”000000”,”msg”:”游戏通关,正在结算”,”data”:{“result”:1,”finalScore”:…}}
- 查询当前关卡进度
- 入参对象属性: roomCode(游戏会话标识,必填)
- 处理逻辑:根据roomCode查询t_level_progress表
- 处理逻辑:如果记录不存在,返回失败信息
- 返回结果:{“code”:”000001”,”msg”:”进度信息不存在”,”data”:…}
- 处理逻辑:获取current_level_id、enemy_total、enemy_killed等字段
- 返回结果:{“code”:”000000”,”msg”:”调用成功”,”data”:{“levelId”:…,”enemyTotal”:…,”enemyKilled”:…}}
- 游戏结算服务
- 生成游戏结算报告
- 入参对象属性:roomCode(游戏会话标识,必填)、playerId(玩家标识,必填)、settlementType(结算类型,必填,0:失败结算,1:胜利结算)
- 处理逻辑:根据roomCode查询t_game_room表,校验游戏房间是否存在
- 返回结果:{“code”:”000001”,”msg”:”游戏房间不存在”,”data”:…}
- 处理逻辑:根据roomCode和playerId查询t_player_status表,获取玩家的当前得分和生命值状态
- 处理逻辑:根据roomCode查询t_level_progress表,获取当前关卡ID和通关状态
- 处理逻辑:如果settlementType为1(胜利),则通关关卡数等于当前关卡ID;如果settlementType为0(失败),则通关关卡数为当前关卡ID减1
- 处理逻辑:根据玩家生命值判断存活状态,若生命值大于0则存活状态为1(存活),否则为0(阵亡)
- 处理逻辑:组装结算数据对象,包含最终得分、存活状态、通关关卡数、游戏结果
- 处理逻辑:将结算数据插入t_game_settlement表进行持久化保存
- 处理逻辑:更新t_game_room表中的game_status为3(结束)
- 返回结果:{“code”:”000000”,”msg”:”调用成功”,”data”:…}
五、生成源码



飞算 JavaAI


设置

规则

MCP

记忆

会话历史

开发规范指南
tank/.feisuan/rules/project_rule.md
为保证代码质量、可维护性、安全性与可扩展性,请在开发过程中严格遵循以下规范。
一、项目基本信息
- 作者:junjian
- 用户工作目录:/Users/junjian/IdeaProjects/tank
- 操作系统:Mac OS X
- 开发工具:JDK 21.0.1, Maven
- 当前项目时间:2026-03-05 11:38:49
二、目录结构
本项目采用标准的 Maven 目录结构,当前目录树如下:
tank
└── src
├── main
│ ├── java
│ │ └── (源代码目录)
│ └── resources
│ └── (配置文件目录)
└── test
├── java
│ └── (测试代码目录)
└── resources
└── (测试资源目录)
三、技术栈要求
- 主框架:Spring Boot 3.x
- 语言版本:Java 21 (JDK 21.0.1)
- 构建工具:Maven
- 核心依赖:
spring-boot-starter-webspring-boot-starter-data-jpalombok
四、分层架构规范
| 层级 | 职责说明 | 开发约束与注意事项 |
|---|---|---|
| Controller | 处理 HTTP 请求与响应,定义 API 接口 | 不得直接访问数据库,必须通过 Service 层调用 |
| Service | 实现业务逻辑、事务管理与数据校验 | 必须通过 Repository 层访问数据库;返回 DTO 而非 Entity(除非必要) |
| Repository | 数据库访问与持久化操作 | 继承 JpaRepository;使用 @EntityGraph 避免 N+1 查询问题 |
| Entity | 映射数据库表结构 | 不得直接返回给前端(需转换为 DTO);包名统一为 entity |
接口与实现分离
- 所有接口实现类需放在接口所在包下的
impl子包中。
五、安全与性能规范
输入校验
- 使用
@Valid与 JSR-303 校验注解(如@NotBlank,@Size等)- 注意:Spring Boot 3.x 中校验注解位于
jakarta.validation.constraints.*
- 注意:Spring Boot 3.x 中校验注解位于
- 禁止手动拼接 SQL 字符串,防止 SQL 注入攻击。
事务管理
@Transactional注解仅用于 Service 层方法。- 避免在循环中频繁提交事务,影响性能。
六、代码风格规范
命名规范
| 类型 | 命名方式 | 示例 |
|---|---|---|
| 类名 | UpperCamelCase | UserServiceImpl |
| 方法/变量 | lowerCamelCase | saveUser() |
| 常量 | UPPER_SNAKE_CASE | MAX_LOGIN_ATTEMPTS |
注释规范
- 语言要求:请使用中文(简体)编写代码注释,确保团队成员能够无障碍理解。
- 所有类、方法、字段需添加 Javadoc 注释。
类型命名规范(阿里巴巴风格)
| 后缀 | 用途说明 | 示例 |
|---|---|---|
| DTO | 数据传输对象 | UserDTO |
| DO | 数据库实体对象 | UserDO |
| BO | 业务逻辑封装对象 | UserBO |
| VO | 视图展示对象 | UserVO |
| Query | 查询参数封装对象 | UserQuery |
实体类简化工具
- 使用 Lombok 注解替代手动编写 getter/setter/构造方法:
@Data@NoArgsConstructor@AllArgsConstructor
七、扩展性与日志规范
接口优先原则
- 所有业务逻辑通过接口定义(如
UserService),具体实现放在impl包中(如UserServiceImpl)。
日志记录
- 使用
@Slf4j注解代替System.out.println
八、编码原则总结
| 原则 | 说明 |
|---|---|
| SOLID | 高内聚、低耦合,增强可维护性与可扩展性 |
| DRY | 避免重复代码,提高复用性 |
| KISS | 保持代码简洁易懂 |
| YAGNI | 不实现当前不需要的功能 |
| OWASP | 防范常见安全漏洞,如 SQL 注入、XSS 等 |