# 家庭游戏中心 (Family Game Center) - 产品需求文档 (PRD)
**文档版本:** 1.0
**最后更新:** 2024-12-29
**状态:** 已审批,进入开发阶段
**目标平台:** Linux (Ubuntu 22.04 LTS) / 开发平台: Windows 11
---
## 📋 文档目录
1. [项目概述](#项目概述)
2. [功能需求](#功能需求)
3. [技术方案](#技术方案)
4. [系统架构](#系统架构)
5. [开发规范](#开发规范)
6. [API 设计](#api-设计)
7. [数据库设计](#数据库设计)
8. [UI/UX 设计规范](#uiux-设计规范)
9. [安全需求](#安全需求)
10. [测试计划](#测试计划)
11. [部署方案](#部署方案)
12. [验收标准](#验收标准)
---
## 项目概述
### 1.1 项目背景
为父母(年龄 50+ 岁)设计的易用家庭游戏平台。该平台旨在提供一个完全锁定的游戏环境,使非技术用户无法误操作进入系统,只能使用游戏功能。
### 1.2 项目目标
| 目标 | 说明 |
|------|------|
| **易用性** | 父母无计算机知识也能独立使用 |
| **安全性** | 系统级锁定,用户无法退出或破坏系统 |
| **稳定性** | 无中断运行 48+ 小时 |
| **游戏性** | AI 对手难度可调,赢率 40-60% |
| **维护性** | 单人可维护和更新 |
### 1.3 产品范围
**包含:**
- 4 款主要游戏 (斗地主、拖拉机、卡五星、赛车)
- Linux Kiosk 启动器
- 响应式菜单 UI
- 本地 AI 对手
- 游戏存档管理
- 基础统计功能
**不包含:**
- 网络在线多人对战
- 云同步和备份
- 用户账户系统
- 第三方集成
- 语音/视频功能
### 1.4 项目成功标准
✓ MVP 版本 (斗地主 + 菜单): 6-8 周
✓ 完整版 (全部游戏): 12-18 周
✓ 总成本: 硬件 5-15K,软件 0 元
✓ 团队规模: 1-3 人
✓ 风险等级: 低-中等
---
## 功能需求
### 2.1 用户故事
#### 故事 1: 启动和菜单
```
作为 父亲
我想 开机后直接进入游戏菜单
这样 我无需学习系统操作,只需选择想玩的游戏
```
**验收标准:**
- 系统启动后 5 秒内进入菜单
- 菜单显示 4 个游戏卡片
- 卡片字体 32px+,易于阅读
- 按钮 80px+,易于点击
- 菜单背景颜色高对比度 (WCAG AAA)
#### 故事 2: 启动游戏
```
作为 母亲
我想 点击游戏卡片启动游戏
这样 我可以开始游玩
```
**验收标准:**
- 点击卡片 3 秒内启动游戏
- 游戏加载时显示进度提示
- 游戏结束自动返回菜单
- 支持按 ESC 返回菜单
#### 故事 3: 无法退出
```
作为 家人
我想 用户无法通过快捷键或菜单退出游戏
这样 游戏不会被误关闭或系统被破坏
```
**验收标准:**
- Alt+F4 无效
- Alt+Tab 无效
- Windows 键无效
- 右键菜单禁用
- 任务栏隐藏
- TTY 无法切换 (Ctrl+Alt+Fx)
#### 故事 4: AI 对手
```
作为 玩家
我想 和智能电脑对手对战
这样 我可以随时游戏,不需要其他玩家
```
**验收标准:**
- 所有游戏都有 2-4 个 AI 对手
- AI 难度可调 (简单/中等/困难)
- AI 出牌合法且有策略性
- AI 响应时间 1-2 秒
#### 故事 5: 保存进度
```
作为 玩家
我想 每局游戏的成绩和统计被自动保存
这样 我可以看到我的进度和胜率
```
**验收标准:**
- 游戏结束后自动保存成绩
- 显示历史成绩和统计数据
- 统计包括: 总局数、胜率、平均用时
- 数据持久存储在本地数据库
### 2.2 功能清单
#### 2.2.1 菜单系统 (Priority: P0 - 必须)
| 功能 | 说明 | 优先级 |
|------|----------------------------------------|--------|
| **游戏列表展示** | 网格布局显示 4 个游戏卡片 | P0 |
| **游戏卡片** | 包含海报、名称、简描 | P0 |
| **启动游戏** | 点击卡片启动对应游戏 | P0 |
| **时间显示** | 菜单顶部显示当前时间 | P1 |
| **返回菜单** | 游戏结束自动返回,支持 ESC 返回 | P0 |
| **响应式布局** | 适配 1080p 到 4K 分辨率, 以2K分辨率 150%缩放作为基准开发 | P0 |
| **高对比度** | WCAG AAA 标准配色 | P0 |
| **父母友好** | 大字体、大按钮 | P0 |
#### 2.2.2 斗地主游戏 (Priority: P0 - 必须)
| 功能 | 说明 | 优先级 |
|------|------|--------|
| **基础规则** | 单张、对、顺、炸、王炸判定 | P0 |
| **手牌显示** | 玩家手牌按大小排序显示 | P0 |
| **出牌交互** | 鼠标/触屏选牌并出牌 | P0 |
| **地主判定** | 系统自动判定地主 | P0 |
| **AI 对手** | 2 个 AI 农民对手 | P0 |
| **游戏流程** | 发牌→抢地主→轮流出牌→结束 | P0 |
| **声音效果** | 出牌音效、胜负音效 | P1 |
| **游戏统计** | 保存胜负和用时 | P1 |
**牌型规则:**
- 单张: 任何一张牌
- 对牌: 同点数的两张牌
- 三张: 同点数的三张牌
- 顺子: 5 张及以上连续的牌 (2 不能在顺子中)
- 炸弹: 同点数的四张牌 (可以压任何牌)
- 王炸: 红黑王 (最大)
- 其他: 简化版,不实现飞机等复杂牌型
#### 2.2.3 拖拉机游戏 (Priority: P1 - 高)
| 功能 | 说明 | 优先级 |
|------|------|--------|
| **基础规则** | 四人跑牌,拖拉机机制 | P1 |
| **主牌概念** | 主花色、主点数 | P1 |
| **AI 对手** | 3 个 AI 对手 | P1 |
| **游戏流程** | 发牌→选主→轮流出牌→计分→结束 | P1 |
#### 2.2.4 卡五星麻将 (Priority: P2 - 可选)
| 功能 | 说明 | 优先级 |
|------|------|--------|
| **基础规则** | 五人麻将变种 | P2 |
| **AI 对手** | 4 个 AI 对手 | P2 |
| **胡牌类型** | 简化版,5-10 种常见胡牌 | P2 |
#### 2.2.5 赛车游戏 (Priority: P1 - 高)
| 功能 | 说明 | 优先级 |
|------|------|--------|
| **基础机制** | 加速、减速、转向、碰撞 | P1 |
| **AI 对手** | 1 个 AI 赛手 | P1 |
| **赛道** | 简单环形赛道,3 圈 | P1 |
| **计时** | 完成赛道的用时和排名 | P1 |
#### 2.2.6 系统功能 (Priority: P0 - 必须)
| 功能 | 说明 | 优先级 |
|------|------|--------|
| **自动启动** | 系统启动后自动进入菜单 | P0 |
| **快捷键禁用** | 完全禁用系统快捷键 | P0 |
| **进程监控** | 游戏异常退出时自动返回菜单 | P0 |
| **数据持久化** | 游戏数据本地保存 | P0 |
| **日志记录** | 系统和游戏日志记录 | P1 |
| **故障恢复** | 自动修复数据损坏和异常状态 | P1 |
### 2.3 非功能需求
| 类别 | 需求 | 验收标准 |
|------|------|---------|
| **性能** | 启动时间 | < 5 秒进入菜单 |
| **性能** | 菜单响应 | < 100ms UI 反馈 |
| **性能** | 内存占用** | < 500MB (菜单+游戏) |
| **性能** | 帧率 | 60fps 稳定 |
| **可靠性** | 运行时长 | 无中断 48+ 小时 |
| **可靠性** | 故障恢复 | 自动重启恢复 |
| **安全性** | 系统锁定 | 三层防护机制 |
| **兼容性** | 分辨率 | 1080p, 1440p, 2560p, 4K |
| **兼容性** | 输入 | 鼠标、触屏、手柄 |
| **可维护性** | 代码** | 注释完整,易扩展 |
| **可维护性** | 文档** | API、部署、故障排查 |
---
## 技术方案
### 3.1 技术栈选择
#### 3.1.1 开发平台 (Windows 11)
```
IDE/编辑器: VS Code / JetBrains IDE
Golang: 1.20+ (Golang for Windows)
Node.js: 18+ LTS (Windows版)
Godot Engine: 4.1+ (Windows版)
Git: Git Bash or GitHub Desktop
包管理器: npm (Node.js), go mod (Golang)
```
**开发优势:**
- 所有开发工具都有完整的 Windows 支持
- Golang 和 Node.js 可在 Windows 上原生编译
- Godot 有完整的 Windows 编辑器
- 跨平台编译: 在 Windows 编译 Linux 二进制
#### 3.1.2 部署平台 (Ubuntu 22.04 LTS)
```
操作系统: Ubuntu 22.04 LTS (Server 版本推荐)
系统配置: Kiosk 模式 + systemd + Openbox
启动器: Golang 二进制 + zserge/webview
菜单UI: Vue 3 构建输出
游戏: Godot 导出的 Linux 64-bit 二进制
运行时: 无需额外依赖 (所有编译为静态二进制)
```
**部署优势:**
- Fedora Silverblue 不可变文件系统,或 Ubuntu Server 最小化
- Kiosk 配置完全锁定系统
- 无强制系统更新
- 极低资源占用
### 3.2 架构设计
```
┌─────────────────────────────────────────┐
│ 用户交互层 (User Layer) │
│ 鼠标/触屏/键盘 │
└──────────────────┬──────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 应用层 (Application Layer) │
│ │
│ ┌────────────────┐ ┌──────────────┐ │
│ │ Golang Launcher│ │ Process Mgr │ │
│ │ - Webview │ │ - Game spawn │ │
│ │ - 全屏模式 │ │ - 监控 │ │
│ └────────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ ┌────────┴──────────────────┴────┐ │
│ │ HTTP Server (localhost:8888) │ │
│ └────────────────┬───────────────┘ │
│ │ │
│ ┌────────────────┴──────────────┐ │
│ │ Vue 3 前端菜单 │ │
│ │ - 游戏网格 │ │
│ │ - 响应式布局 │ │
│ └────────────────┬──────────────┘ │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 游戏层 (Game Layer) │
│ │
│ ┌──────────┐ ┌──────────┐ ┌────────┐ │
│ │Godot Game│ │Godot Game│ │Pixi.js │ │
│ │ 斗地主 │ │ 拖拉机 │ │ 赛车 │ │
│ └──────────┘ └──────────┘ └────────┘ │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 系统层 (System Layer - Linux) │
│ │
│ ┌────────────────────────────────────┐ │
│ │ systemd 系统管理 │ │
│ │ - 自动登录 kiosk 用户 │ │
│ │ - 启动 game-launcher 服务 │ │
│ │ - 禁用睡眠、更新等 │ │
│ └────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────┐ │
│ │ X11/Wayland Display Server │ │
│ │ - Openbox 极简窗口管理 │ │
│ │ - 禁用快捷键 (X11 事件) │ │
│ │ - 禁用系统菜单 │ │
│ └────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────┐ │
│ │ Linux Kernel │ │
│ │ - SELinux / AppArmor │ │
│ │ - kiosk 用户权限管理 │ │
│ └────────────────────────────────────┘ │
└─────────────────────────────────────────┘
```
### 3.3 技术决策表
| 组件 | 选型 | 原因 |
|------|------|------|
| **启动器** | Golang | 内存 20MB, 启动 <100ms, 单二进制 |
| **菜单 UI** | Vue 3 + TypeScript | 响应式, 易修改, 开发快 |
| **卡牌游戏** | Godot 4 + GDScript | UI 系统优秀, 易学, 体积小 |
| **赛车游戏** | Pixi.js (Web 版) | 2D 性能最优, 易于参数调整 |
| **AI 算法** | 决策树 + 蒙特卡洛 | 快速开发, 难度可调, 可解释 |
| **数据库** | SQLite | 轻量级, 无需服务器, 易于备份 |
| **配置** | JSON | 易读易写, 无需解析库 |
---
## 系统架构
### 4.1 模块划分
```
project-root/
│
├─ launcher/ # Golang 启动器 (Module-1)
│ ├─ cmd/main.go # 入口点
│ ├─ internal/
│ │ ├─ launcher/launcher.go # 核心启动器逻辑
│ │ ├─ server/http.go # HTTP 服务器
│ │ ├─ process/manager.go # 进程管理
│ │ ├─ config/config.go # 配置加载
│ │ └─ logger/logger.go # 日志系统
│ ├─ go.mod
│ ├─ go.sum
│ └─ Makefile # 编译脚本
│
├─ frontend/ # Vue 3 菜单 (Module-2)
│ ├─ src/
│ │ ├─ App.vue # 根组件
│ │ ├─ main.ts # 入口
│ │ ├─ components/
│ │ │ ├─ GameGrid.vue # 游戏网格
│ │ │ ├─ GameCard.vue # 游戏卡片
│ │ │ └─ LoadingSpinner.vue # 加载提示
│ │ ├─ views/
│ │ │ ├─ MainMenu.vue # 菜单视图
│ │ │ ├─ StatisticsView.vue # 统计视图 (可选)
│ │ │ └─ SettingsView.vue # 设置视图 (可选)
│ │ ├─ services/
│ │ │ └─ api.ts # API 通信
│ │ ├─ types/
│ │ │ └─ game.ts # 类型定义
│ │ └─ styles/
│ │ └─ main.css # 全局样式
│ ├─ public/
│ │ ├─ games.json # 游戏配置
│ │ ├─ images/ # 游戏海报
│ │ └─ fonts/ # 中文字体
│ ├─ package.json
│ ├─ tsconfig.json
│ ├─ vite.config.ts
│ └─ Makefile
│
├─ games/ # 游戏项目
│ │
│ ├─ doudizhu/ # 斗地主 (Module-3)
│ │ ├─ project.godot # Godot 项目配置
│ │ ├─ scenes/
│ │ │ ├─ Game.tscn # 主场景
│ │ │ ├─ Card.tscn # 卡牌节点
│ │ │ ├─ Player.tscn # 玩家区域
│ │ │ └─ UI/
│ │ │ ├─ HandUI.tscn
│ │ │ ├─ TableUI.tscn
│ │ │ └─ InfoPanel.tscn
│ │ ├─ scripts/
│ │ │ ├─ Game.gd # 主逻辑 (~800 行)
│ │ │ ├─ CardLogic.gd # 规则判定 (~300 行)
│ │ │ ├─ AIPlayer.gd # AI 对手 (~500 行)
│ │ │ └─ UIController.gd # UI 控制 (~200 行)
│ │ ├─ assets/
│ │ │ ├─ images/
│ │ │ │ ├─ cards/ # 108 张牌纹理
│ │ │ │ └─ ui/
│ │ │ ├─ sounds/
│ │ │ │ ├─ card_play.wav
│ │ │ │ ├─ win.wav
│ │ │ │ └─ lose.wav
│ │ │ └─ fonts/
│ │ └─ export_presets.cfg # 导出配置
│ │
│ ├─ tractor/ # 拖拉机 (Module-4)
│ │ ├─ project.godot
│ │ ├─ scenes/
│ │ ├─ scripts/
│ │ │ ├─ Game.gd
│ │ │ ├─ CardLogic.gd # 拖拉机规则
│ │ │ └─ AIPlayer.gd
│ │ └─ assets/
│ │
│ ├─ mahjong/ # 卡五星 (Module-5, 可选)
│ │ ├─ project.godot
│ │ ├─ scenes/
│ │ ├─ scripts/
│ │ │ ├─ Game.gd
│ │ │ ├─ MahjongLogic.gd # 麻将规则
│ │ │ └─ AIPlayer.gd
│ │ └─ assets/
│ │
│ └─ racing/ # 赛车 (Module-6, Pixi.js)
│ ├─ src/
│ │ ├─ main.ts
│ │ ├─ Game.ts # 游戏主类
│ │ ├─ Car.ts # 车辆物理
│ │ ├─ Track.ts # 赛道管理
│ │ ├─ AI.ts # AI 赛手
│ │ └─ UI.ts # UI 管理
│ ├─ assets/
│ │ ├─ images/
│ │ ├─ sounds/
│ │ └─ fonts/
│ ├─ package.json
│ └─ tsconfig.json
│
├─ shared/ # 共享资源
│ ├─ fonts/
│ │ ├─ SourceHanSansSC-Regular.otf # 中文字体
│ │ └─ SourceHanSansSC-Bold.otf
│ ├─ images/
│ │ ├─ doudizhu.jpg # 游戏海报
│ │ ├─ tractor.jpg
│ │ ├─ mahjong.jpg
│ │ └─ racing.jpg
│ └─ sounds/
│ ├─ ui_click.wav
│ ├─ ui_hover.wav
│ └─ bgm.ogg
│
├─ config/ # 配置文件
│ ├─ kiosk/
│ │ ├─ gdm-custom.conf # GDM 自动登录
│ │ ├─ systemd-service.ini # systemd 服务
│ │ ├─ openbox-rc.xml # Openbox 配置
│ │ └─ xset-config.sh # X11 配置脚本
│ └─ app/
│ ├─ launcher.json # 启动器配置
│ └─ games.json # 游戏清单
│
├─ scripts/ # 构建和部署脚本
│ ├─ build-windows.bat # Windows 编译脚本
│ ├─ build-linux.sh # Linux 编译脚本
│ ├─ build-all.sh # 全量编译脚本
│ ├─ cross-compile.sh # 交叉编译脚本
│ ├─ deploy.sh # 部署脚本
│ ├─ setup-kiosk.sh # Kiosk 配置脚本
│ └─ verify.sh # 验证脚本
│
├─ docs/ # 文档
│ ├─ PRD.md # 本文档
│ ├─ ARCHITECTURE.md # 架构详解
│ ├─ DEVELOPMENT.md # 开发指南
│ ├─ API.md # API 文档
│ ├─ DEPLOYMENT.md # 部署指南
│ ├─ TESTING.md # 测试指南
│ └─ TROUBLESHOOTING.md # 故障排查
│
├─ tests/ # 测试用例
│ ├─ launcher/
│ ├─ frontend/
│ ├─ games/
│ └─ integration/
│
├─ README.md # 项目概述
├─ Makefile # 顶层编译脚本
├─ docker-compose.yml # 可选: Docker 支持
└─ .github/
└─ workflows/ # CI/CD 配置
```
### 4.2 依赖关系
```
启动器 (Golang)
│
├─ 依赖: zserge/webview (嵌入式浏览器)
│ stdlib (net/http, os/exec, etc.)
│
└─→ 启动 HTTP 服务器 (localhost:8888)
│
├─ 提供静态文件: 菜单 UI (Vue)
│
├─ 提供 API 端点: /api/launch
│ │
│ └─→ 调用 os/exec 启动游戏进程
│
└─ 提供 Webview
│
└─→ 显示菜单 UI
│
└─→ 用户交互
│
└─→ 调用 API 启动游戏
游戏进程 (Godot / Pixi.js)
│
├─ 通过 IPC/stdio 接收启动参数
│
└─ 独立运行,不需与启动器通信
(游戏结束时自己主动退出)
菜单 UI (Vue 3)
│
├─ 依赖: Vue 3, TypeScript, Vite
│
└─ 运行于 Webview 中
│
├─ 加载 games.json
│
└─ 通过 fetch API 调用启动器 HTTP 接口
```
---
## 开发规范
### 5.1 代码规范
#### 5.1.1 Golang 代码规范
```go
// 文件头注释
// Package main 描述此包的用途
package main
import (
"fmt"
"os"
// 标准库分组
"github.com/zserge/webview"
// 第三方库分组
)
const (
// 常量大写 + 下划线
DEFAULT_WEB_PORT = 8888
LAUNCHER_VERSION = "1.0.0"
)
type GameLauncher struct {
// 字段注释
currentGame *exec.Cmd // 当前运行的游戏进程
webPort int // HTTP 服务器端口
config Config // 配置对象
}
// NewGameLauncher 创建启动器实例
// 返回: *GameLauncher - 启动器指针
func NewGameLauncher() *GameLauncher {
return &GameLauncher{
webPort: DEFAULT_WEB_PORT,
}
}
// Start 启动游戏启动器
// 返回: error - 错误信息
func (gl *GameLauncher) Start() error {
// 函数实现
return nil
}
```
**规则:**
- 变量名用驼峰命名 (camelCase)
- 常量用大写 (CONSTANT_NAME)
- 每个公共函数必须有注释
- 每个包必须有注释说明其用途
- 错误处理不能忽略: `if err != nil { return err }`
- 使用 `fmt.Sprintf` 构建字符串,不要用 `+`
#### 5.1.2 Vue/TypeScript 代码规范
```typescript
// 文件头注释
/**
* GameLauncher.vue - 游戏启动器主组件
*
* 功能:
* - 显示游戏菜单网格
* - 处理游戏启动逻辑
* - 显示加载状态
*/
```
**规则:**
- 使用 `const` 优于 `let`,尽量避免 `var`
- 使用 TypeScript,不要用 JavaScript
- 组件名使用 PascalCase (GameCard.vue)
- 变量名使用 camelCase
- 使用 BEM 命名法管理 CSS 类名
- 必须包含 ARIA 无障碍属性
- 类型定义在每个文件头部
#### 5.1.3 GDScript 代码规范
```gdscript
# 文件头注释
## CardLogic.gd - 卡牌逻辑和规则判定
##
## 实现斗地主的卡牌判定算法
## 包括牌型检查、胜负判定等
class_name CardLogic
# 常量定义
const CARD_RANKS = ["9", "10", "J", "Q", "K", "A", "2"]
const CARD_SUITS = ["♠", "♥", "♦", "♣", "王"]
# 静态函数
static func is_valid_play(cards: Array) -> bool:
"""检查出牌是否合法"""
if cards.is_empty():
return false
# 单张
if cards.size() == 1:
return true
# 对牌
if cards.size() == 2:
return cards[0].rank == cards[1].rank
return false
# 实例函数
func get_best_play(hand: Array, table_cards: Array) -> Array:
"""根据手牌和桌面牌,给出最佳出牌"""
# 实现逻辑
return []
```
**规则:**
- 类名使用 PascalCase (CardLogic)
- 函数名使用 snake_case (is_valid_play)
- 常量使用 SCREAMING_SNAKE_CASE
- 每个公共函数使用 `##` 文档注释
- 避免全局变量,使用类成员变量
### 5.2 分支管理
```
main (生产分支)
│
├─ develop (开发分支)
│ │
│ ├─ feature/launcher (启动器功能)
│ ├─ feature/menu-ui (菜单 UI)
│ ├─ feature/doudizhu (斗地主)
│ ├─ feature/ai-algorithm (AI 算法)
│ └─ bugfix/xxx (bug 修复)
│
└─ release/v1.0 (发版分支)
```
**规则:**
- 功能开发: `feature/功能名`
- bug 修复: `bugfix/bug名`
- 发版准备: `release/版本号`
- 每个 PR 必须有描述和关联 issue
- 至少一人 code review 后才能合并
### 5.3 提交规范
```bash
# 格式: ():
#
#