2 篇文章带有标签 “database-design”

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

创建项目

# 🎮 坦克大战 - Tank Battle

一个经典坦克游戏克隆,致敬任天堂的《坦克大战》(Battle City)。

## ✨ 功能特性

### 核心玩法
- **玩家坦克** - 使用 WASD 或方向键控制移动,空格键射击
- **AI 敌方坦克** - 自动移动和射击,难度随关卡递增
- **基地保护** - 保护你的金色基地不被敌人摧毁
- **关卡系统** - 通关后自动进入下一关,敌人越来越强

### 地图元素
- **🧱 砖墙** - 可被子弹破坏,提供战术掩护
- **🔩 钢墙** - 不可破坏的坚固障碍物(增强子弹可以破坏)
// ...

一、理解需求

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

Continue 源码分析 - SQLite 数据库设计

SQLite 数据库设计

CREATE TABLE tag_catalog (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    dir STRING NOT NULL,
    branch STRING NOT NULL,
    artifactId STRING NOT NULL,
    path STRING NOT NULL,
    cacheKey STRING NOT NULL,
    lastUpdated INTEGER NOT NULL
)

CREATE TABLE sqlite_sequence(name,seq)

CREATE TABLE global_cache (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    cacheKey STRING NOT NULL,
    dir STRING NOT NULL,
    branch STRING NOT NULL,
    artifactId STRING NOT NULL
)

CREATE TABLE chunks (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    cacheKey TEXT NOT NULL,
    path TEXT NOT NULL,
    idx INTEGER NOT NULL,
    startLine INTEGER NOT NULL,
    endLine INTEGER NOT NULL,
    content TEXT NOT NULL
)

CREATE TABLE chunk_tags (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    tag TEXT NOT NULL,
    chunkId INTEGER NOT NULL,
    FOREIGN KEY (chunkId) REFERENCES chunks (id)
)

CREATE TABLE code_snippets (
    id INTEGER PRIMARY KEY,
    path TEXT NOT NULL,
    cacheKey TEXT NOT NULL,
    content TEXT NOT NULL,
    title TEXT NOT NULL,
    startLine INTEGER NOT NULL,
    endLine INTEGER NOT NULL
)

CREATE TABLE code_snippets_tags (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    tag TEXT NOT NULL,
    snippetId INTEGER NOT NULL,
    FOREIGN KEY (snippetId) REFERENCES code_snippets (id)
)

CREATE TABLE lance_db_cache (
    uuid TEXT PRIMARY KEY,
    cacheKey TEXT NOT NULL,
    path TEXT NOT NULL,
    artifact_id TEXT NOT NULL,
    vector TEXT NOT NULL,
    startLine INTEGER NOT NULL,
    endLine INTEGER NOT NULL,
    contents TEXT NOT NULL
)

CREATE TABLE fts_metadata (
    id INTEGER PRIMARY KEY,
    path TEXT NOT NULL,
    cacheKey TEXT NOT NULL,
    chunkId INTEGER NOT NULL,
    FOREIGN KEY (chunkId) REFERENCES chunks (id),
    FOREIGN KEY (id) REFERENCES fts (rowid)
)

CREATE VIRTUAL TABLE fts USING fts5(
    path,
    content,
    tokenize = 'trigram'
)

CREATE TABLE 'fts_data'(id INTEGER PRIMARY KEY, block BLOB)
CREATE TABLE 'fts_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID
CREATE TABLE 'fts_content'(id INTEGER PRIMARY KEY, c0, c1)
CREATE TABLE 'fts_docsize'(id INTEGER PRIMARY KEY, sz BLOB)
CREATE TABLE 'fts_config'(k PRIMARY KEY, v) WITHOUT ROWID

CREATE UNIQUE INDEX idx_tag_catalog_unique 
     ON tag_catalog(dir, branch, artifactId, path, cacheKey)
CREATE UNIQUE INDEX idx_global_cache_unique 
     ON global_cache(cacheKey, dir, branch, artifactId)