山东大学软件学院创新实训(二)
日期:2026 年 3 月 31 日 —— 4 月 12 日
项目:绘画 AI 博弈小游戏 —— 人机对抗绘画猜词与心理解读系统
一、本阶段整体进度
本阶段项目正式进入开发阶段,团队围绕后端架构搭建、数据库设计、前端画板实现、AI 多模态接口联调四大方向同步推进,完成了从 “方案设计” 到 “代码落地” 的关键一步。
本阶段核心成果:
- 完成 Flask 后端完整骨架,实现 RESTful API + WebSocket 双通信体系
- 配置安全管理(API Key 隔离)
- 完成 SQLite 数据库 7 张表设计与索引优化
- 前端实现 Canvas 在线画板 + 实时同步 + 行为数据采集
- AI 模块完成 智谱 GLM-4V 对接,实现图片识别与猜词
- WebSocket通信架构与Socket.IO实战解析
- 团队四人博客同步更新
完成后端从 0 → 可运行、可联调、可扩展 的基础体系构建,为游戏联机、AI 识别、心理分析模块提供底层支撑。
模块一:需求分析和方案设计
一、功能分析
后端作为项目核心中枢,需承担四大能力:
- 页面路由:首页、房间页、心理报告页渲染
- 用户体系:游客模式快速登录、信息存储、历史记录查询
- 房间管理:创建房间、6 位房间码加入、人数限制、状态同步
- 实时联机:绘画同步、猜词广播、游戏阶段控制
- 数据持久化:用户、房间、对局、绘画、猜词、行为、心理报告存储
- AI 识别接入:多模态模型调用、结果解析、置信度判定
- 心理分析:绘画特征入库、报告生成与存储
二、库表设计
库名:zhipu.db共 7 张核心表,完全支撑游戏全业务链路:
- users(用户表)
- rooms(房间表)
- room_players(房间 - 玩家关联表)
- rounds(回合 / 对局表)
- guesses(玩家猜词表)
- drawing_behaviors(绘画行为表)
- psychology_reports(心理报告表)
1. 核心表设计(示例)
-- 用户表
CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY,
nickname TEXT NOT NULL,
avatar TEXT DEFAULT '',
created_at REAL NOT NULL,
total_score INTEGER DEFAULT 0,
games_played INTEGER DEFAULT 0,
games_won INTEGER DEFAULT 0
);
-- 房间表
CREATE TABLE IF NOT EXISTS rooms (
id TEXT PRIMARY KEY,
code TEXT UNIQUE NOT NULL,
host_id TEXT NOT NULL,
status TEXT DEFAULT 'waiting',
difficulty TEXT DEFAULT 'medium',
max_players INTEGER DEFAULT 4,
current_round INTEGER DEFAULT 0,
max_rounds INTEGER DEFAULT 5,
created_at REAL NOT NULL,
updated_at REAL NOT NULL,
FOREIGN KEY (host_id) REFERENCES users(id)
);
三、技术选型与应用
1. Flask 框架优势
- 轻量、灵活、适合快速开发
- 插件生态完善(Flask-SocketIO、Flask-CORS)
- 适合小型实训项目,部署简单
- 与 SQLite 无缝配合
2. Flask-SocketIO 作用
- 提供 WebSocket 长连接
- 支持房间广播、分组发送
- 满足绘画实时同步需求
3. SQLite 优势
- 单文件、零配置、无需启动服务
- 足够支撑 2–4 人联机小游戏数据量
- 便于提交、演示、打包
模块二:Flask 项目骨架搭建
一、工程结构设计
zhipu/
├── app.py # 应用入口、路由、Socket 事件
├── config.py # 全局配置、密钥、AI配置、游戏参数
├── models.py # 数据库连接、CRUD、表结构初始化
├── utils/
│ ├── ai_recognizer.py # AI多模态识别
│ ├── psychology.py # 心理分析规则
│ └── word_bank.py # 词库管理
├── templates/ # HTML页面
└── static/ # 前端资源
二、路由划分策略
1. 页面路由(GET)
/首页大厅/room/<code>游戏房间/report/<id>心理报告
2. RESTful API(HTTP)
/api/user/create创建用户/api/room/create创建房间/api/room/join加入房间/api/leaderboard排行榜/api/user/<id>/history历史记录
3. WebSocket 实时事件
join_room加入房间频道drawing_update笔触同步submit_guess提交猜词start_game开始游戏round_result回合结果广播
模块三:安全管理
一、config.py 核心设计
采用环境变量优先 + 默认值兜底,实现:
- 密钥不硬编码
- API Key 不上传 Git
- 部署环境自动适配
我们在 config.py 里这样写:
import os
# 从环境变量读取,如果没有就用空字符串
ZHIPU_API_KEY = os.environ.get('ZHIPU_API_KEY', '')
然后在启动脚本里设置环境变量:
# Linux/Mac
export ZHIPU_API_KEY="你的密钥"
python app.py
# Windows (start.bat)
set ZHIPU_API_KEY=你的密钥
python app.py
模块四:数据库模块开发(models.py)
一、上下文管理器实现(核心)
@contextmanager
def get_db_connection():
conn = get_db()
try:
yield conn
conn.commit()
except Exception:
conn.rollback()
raise
finally:
conn.close()
作用
- 自动连接 / 关闭
- 自动提交 / 回滚
- 防止连接泄漏
- 保证事务原子性
二、数据模型开发
1. 初始化数据库
def init_db():
with get_db_connection() as conn:
conn.executescript('''
CREATE TABLE IF NOT EXISTS users (...);
CREATE TABLE IF NOT EXISTS rooms (...);
''')
2. 用户 CRUD
def create_user(nickname):
user_id = str(uuid.uuid4())[:8]
with get_db_connection() as conn:
conn.execute(
'INSERT INTO users (id, nickname, created_at) VALUES (?,?,?)',
(user_id, nickname, time.time())
)
return user_id
3. 房间 CRUD
def create_room(host_id):
room_id = str(uuid.uuid4())[:8]
code = _generate_room_code()
with get_db_connection() as conn:
conn.execute('INSERT INTO rooms ...')
conn.execute('INSERT INTO room_players ...')
return room_id, code
三、索引设计(高频查询优化)
CREATE INDEX IF NOT EXISTS idx_rooms_code ON rooms(code);
CREATE INDEX IF NOT EXISTS idx_room_players_room ON room_players(room_id);
CREATE INDEX IF NOT EXISTS idx_rounds_room ON rounds(room_id);
作用
- 通过房间码快速查找房间
- 快速加载房间内玩家
- 快速加载对局历史
- 避免全表扫描
模块五:WebSocket 通信与实时联机设计
一、核心事件设计
@socketio.on('drawing_update')
def handle_drawing_update(data):
room_id = data.get('room_id')
stroke_data = data.get('stroke_data')
emit('drawing_sync', {
'user_id': data.get('user_id'),
'stroke_data': stroke_data
}, to=room_id, include_self=False)
二、通信流程
- 画家绘制 → 触发
drawing_update - 后端广播 →
drawing_sync - 所有观众实时回放笔触
- 低延迟、高同步、省流量
模块六:Flask-SocketIO async_mode 问题解决
一、问题
- 使用 eventlet 出现兼容性异常
- 第三方 AI SDK 不兼容协程
- Windows 环境不稳定
二、解决方案
socketio = SocketIO(app, async_mode='threading')
threading 优势
- 无额外依赖
- 全平台稳定
- 兼容所有第三方库
- 适合 4 人以内联机
模块七:核心业务流程开发(房间→加入→查询)
一、完整流程示例
- 创建用户
- 创建房间(返回 6 位 code)
- 其他用户通过 code 加入
- 查询房间信息(含玩家列表)
- 开始游戏 → 进入回合
# 1. 创建用户
host_id = create_user("房主")
# 2. 创建房间
room_id, code = create_room(host_id)
# 3. 加入房间
join_room(room_id, player_id)
# 4. 查询房间信息
room = get_room(room_id)
开发总结
本阶段完成后端骨架 + 数据库模块的完整工程化落地:
- 规范化项目结构,模块化分层清晰
- 安全的配置体系,密钥与代码隔离
- 七张表完整库表设计,关系合理、索引齐全
- 上下文管理器保证数据安全,无连接泄漏
- REST + WebSocket 双通信模式,支持联机游戏
- 房间 / 玩家 / 对局 CRUD 可直接支撑前端联调
- 解决 SocketIO 异步问题,全平台稳定运行
模块已具备可运行、可测试、可扩展能力,为下周前后端联调、AI 识别接入、心理分析模块开发奠定坚实基础。
后续计划
- 前后端全流程联调(登录→房间→绘画→同步→猜词→结果)
- AI 多模态识别接口完整接入
- 绘画行为 → 心理特征解析开发
- 联机延迟优化、异常重连机制
- 前端界面与游戏状态机完善
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)