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
评论