1、设计思路

首先确定目标,希望达成以下几个功能:

1、用户每次访问主页验证身份,当天第一次登录给800金币;

2、用户抽卡判断抽卡次数是否满足要求(单抽或十连抽),再判断金币是否足够,再随机从牌库抽卡,更新到用户数据;

3、用户卖卡,首先判断用户是否有足够的该卡牌,再根据卡牌price,计算获得的金币数量,更新到用户数据;

4、用户卖出所有卡牌,根据卡牌price,计算获得的金币数量,更新到用户数据;

1.1 登录逻辑

1.2抽卡逻辑

1.3卖卡逻辑

1.4卖出所有卡牌逻辑

2、实现方法

逻辑理清之后,就要考虑实现方法了。这个抽卡游戏后端程序采用了模块化设计和分层架构,通过以下核心方法和思路实现需求:

2.1 系统架构

Flask 框架:作为 Web 服务器处理 HTTP 请求,路由设计清晰(/api/login、/api/gacha、/api/sell、/api/sell_all)。

SQLAlchemy ORM:与 SQLite 数据库交互,管理用户和卡牌数据。

模块化设计:将登录、抽卡、卖卡等功能拆分为独立函数,提高可维护性。

2.2 用户认证与状态管理

Cookie 机制:通过gacha_id唯一标识用户,首次访问自动生成 UUID 并存储在 Cookie 中。

数据库存储:用户信息(金币、抽卡次数)和卡牌数据持久化到 SQLite,确保会话状态不丢失。

2.3 核心功能实现

(1)登录与每日奖励

日志文件验证:通过读取当天日志文件(res/log/日期.log)判断用户是否已登录,避免重复奖励。

原子操作:检查登录状态与发放奖励在同一请求中完成,确保线程安全。

(2)抽卡系统

概率控制:通过随机数生成不同稀有度的卡牌(N:65%、R:25%、SR:9%、SSR:1%)。

保底机制:

累计 60 次抽卡必出 SSR(重置计数器)。

每 10 次抽卡必出 SR/SSR。

事务处理:扣除金币、更新卡牌数量、递增抽卡次数在同一数据库会话中完成,保证数据一致性。

(3)卖卡功能

单卡出售:通过/api/sell接收卡牌编号和数量,遍历数据库记录扣减并计算收益。

一键出售:通过/api/sell_all遍历用户所有卡牌,按cards.json中的价格累加收益后删除记录。

2.4 数据管理

卡牌配置:从cards.json读取卡牌信息(编号、稀有度、价格),便于热更新。

数据聚合:查询用户卡牌时自动合并相同编号的卡牌数量,优化前端展示。

2.5 可靠性保障

异常处理:

数据库操作使用事务(隐式),确保数据完整性。

日志记录关键操作(如登录、抽卡),便于排查问题。

参数校验:

抽卡次数限制为 1/10。

卖卡时验证卡牌数量是否足够。

2.6 性能优化

缓存机制:通过 HTTP 304 状态码避免重复传输未修改的静态资源(如 HTML)。

数据库优化:使用 SQLAlchemy 的Session.get()替代旧版Query.get(),提升查询效率。

3、代码下载

https://bb.yuubari.cn:10999/gacha/app.7z