Initial commit

This commit is contained in:
2026-04-23 16:58:11 +08:00
commit 267eba1eca
2582 changed files with 273338 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
1.查询roll房的基本信息是否存在是否开奖是否有参与者
2.查看是否有系统指定用户获取饰品调用rollSurplusOrnaments()方法,传入全部参与用户和饰品,将该饰品指定给需要指定的用户,扣除该饰品并返回剩下的饰品,并且将指定用户过滤出
3.获取没有指定获取饰品的用户再将这些没指定的用户打乱顺序再去遍历有库存饰品按顺序给随机用户每人一件保存结果更新roll房状态

View File

@@ -0,0 +1,8 @@
1.先效验传入的下注金额是否正确再去给每个用户申请一把锁根据用户id去redis中读取游戏缓存数据缓存为空扣费并且更新用户累计的投注在去更新用户的总投注额再去查找今天0点的统计记录不存在则创建否则将今日统计表中下注金额累计再将redis中的全局奖励池累加
再去初始化缓存数据再去通过selectGame()方法去挑选一局游戏
1.1selectGame()方法首先去查询用户的历史数据历史投钱数游戏多少次查询不到就去初始化一条全新数据再去redis中读取游戏的配置信息在去读取配置表有rtp=0.8再从redis中拿到全局的奖励池所有玩家总投注所有玩家总获奖再将StrategyContext对象组装
再去执行三个策略分别是普通旋转免费旋转超级旋转三个旋转只是查询条件不同最后封装GameSpin对象返回
2.处理免费旋转再去更新缓存再去检测并且去累加S出现的次数再去累加倍数到累计赢取额然后写回缓存保存更新
3.判断游戏是否结束,去计算最终的奖励,总得分(score) × 单注(bet) = 本局实际奖励金额若计算结果≤0强制设为0.01保底,再将赢取的金额加到玩家账号
4.本局游戏结束之后将该用户的redis缓存为空去更新用户累计的输赢金额再去更新统计表和Redis的全局奖励池
5.构建完整数据并且返回

View File

@@ -0,0 +1,10 @@
1.开奖算法:决定转盘停在哪个格子
1.1 无人下注的话过滤特殊效果S从剩下的格子里面随机选择一个
1.2 有人下注的话需要去计算每个格子的纯利润需要去遍历每个格子符号去获取每个格子的位置将特殊符号S过滤去计算需要赔付多少钱payoutIf方法计算出赔付金额
通过本局的总注额减去赔付金额就能计算出净利润,再将格子下标和净利润加入列表
1.2.1payoutIf()方法,根据下注的符号,去计算需要赔付多少钱,赔付金额是 = 总下注额*赔率
1.3 判断是否触发特殊效果S生成一个0到1的随机数如果小于特殊效果S的概率则触发特殊效果S然后再去随机选择一种特殊效果记录特殊效果名
1.3.1 如果是系统赢随机找一个非s的下标将下标和:S0组装表示为系统赢直接返回
1.3.2 免费旋转默认是1次随机找一个非s的下标将下标和:S1组装表示为免费旋转1次,可以旋转3次
1.4 普通开奖计算出净利润大于0的格子的集合再从盈利的格子随机选一个如果没有净利润大于0的格子就去选亏得最少的格子将结果加入

View File

@@ -0,0 +1,10 @@
1.创建对战房间先效验创建房间参数0是欧皇1是非酋几人对战配置宝箱的信息以及费用回合数是1-15次验证余额是否足够初始化座位
再去构建对战对象再去扣减房主的报名费房主自动入第一个座再去保存对战人员的信息创建房间成功通过异步WebSocket广播通知大厅有新房间
2.玩家加入对战房间先获取锁防止并发加入再去效验对战信息joinFightCheck方法方法首先查询未对战信息
再去查询是否报名再去检查余额是否足够再去寻找空位入座检查是否重复加入更新对战座位信息扣除加入人员报名费保存参与记录异步WebSocket广播用户加入房间
3.fightBegin开始游戏方法获取锁防止重复开始检查游戏是否开始执行多回合的抽奖newComputerFight()方法再去计算胜负computerWinner()方法,该方法包含对战模式,座位信息,抽奖结果,
去分配奖品,如果是多个赢家,失败者的奖品价值平分,赢家的奖品归自己,失败者的奖品累计,去平分失败者的总价值,如果是单个玩家或全员平局,单个赢家,将失败者奖品分给赢家,全员平局的话就轮流分配,
最后再去批量保存开箱记录更新对战状态为进行中在异步WebSocket广播构建开箱结果广播给房间用户和大厅
3.1.newComputerFight()方法获取宝箱配置获取所有玩家的id设置回合计数器外层遍历每一个宝箱内层记录宝箱开启的次数执行一回合的抽奖roundLottery()方法将对局结果addAll全部加入宝箱记录集合中回合数累加再去更新宝箱历史开箱统计在补充对战的id
3.1.1.roundLottery()方法遍历当前回合所有的玩家再去使用经典开箱方法singleLottery(),获取饰品详情,再去构建开箱的记录
3.2 computerWinner()方法,有两个模式,欧皇模式(总价值最高者胜)和非酋模式(总价值最低者胜),欧皇模式去累加该玩家获得的所有的饰品价值,比较是否为最高或者平局,非酋模式是否为最低或者平局

View File

@@ -0,0 +1,12 @@
1.根据用户类型确定使用哪个奖池,普通奖池,补偿奖池,三级爆率奖池,
在再根据宝箱id和用户类型获取锁防止同一个宝箱同一个用户类型的并发抽奖持续10秒重试三次
2.获取三个奖池对象,判断三个奖池是否为空,如果为空,就初始化创建空奖池
3.查询用户是否拥有三级爆率,如果不为空,说明有三级爆率
4.根据是否有三级爆率权限选择使用哪个奖池checkPool() 方法首先查看当前prizePool对象是否有数据
是直接返回否则去redis中查看是否有数据有则将数据加入prizePool对象中
否则去数据库中查询并加入prizePool对象中有三级爆率就使用thirdExplosivePrizePool否则使用prizePool
5.补偿机制,先查询用户的补偿记录是否有值,如果是补偿箱并且没有补偿记录,创建空的补偿记录,如果有补偿记录,查看是否到达补偿阈值,
如果是补偿箱并且补偿值>=阈值,将切换到补偿奖池,并将补偿值清楚,将补偿记录删除
6.执行抽奖的算法doLottery方法箱子里面包含饰品及其数量获取饰品总数量并且随机五次并记录最后一次的值
然后循环每个饰品的位置如果这个位置的值和记录的最后一次的值相同拿到当前饰品的id
如果循环多次没有拿到,就取饰品的第一个(按序给),库存减一