Initial commit
This commit is contained in:
3
doc/开箱玩法/Roll房/Roll房.md
Normal file
3
doc/开箱玩法/Roll房/Roll房.md
Normal file
@@ -0,0 +1,3 @@
|
||||
1.查询roll房的基本信息,是否存在,是否开奖,是否有参与者
|
||||
2.查看是否有系统指定用户获取饰品,调用rollSurplusOrnaments()方法,传入全部参与用户和饰品,将该饰品指定给需要指定的用户,扣除该饰品并返回剩下的饰品,并且将指定用户过滤出
|
||||
3.获取没有指定获取饰品的用户,再将这些没指定的用户打乱顺序,再去遍历有库存饰品,按顺序给随机用户,每人一件,保存结果,更新roll房状态
|
||||
8
doc/开箱玩法/极速永恒/极速永恒.md
Normal file
8
doc/开箱玩法/极速永恒/极速永恒.md
Normal 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.构建完整数据并且返回
|
||||
10
doc/开箱玩法/疯狂转盘/疯狂转盘.md
Normal file
10
doc/开箱玩法/疯狂转盘/疯狂转盘.md
Normal 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的格子就去选亏得最少的格子,将结果加入
|
||||
|
||||
10
doc/开箱玩法/百变竞技/百变竞技.md
Normal file
10
doc/开箱玩法/百变竞技/百变竞技.md
Normal 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()方法,有两个模式,欧皇模式(总价值最高者胜)和非酋模式(总价值最低者胜),欧皇模式去累加该玩家获得的所有的饰品价值,比较是否为最高或者平局,非酋模式是否为最低或者平局
|
||||
12
doc/开箱玩法/经典开箱/经典开箱饰品分配.md
Normal file
12
doc/开箱玩法/经典开箱/经典开箱饰品分配.md
Normal file
@@ -0,0 +1,12 @@
|
||||
1.根据用户类型确定使用哪个奖池,普通奖池,补偿奖池,三级爆率奖池,
|
||||
在再根据宝箱id和用户类型获取锁,防止同一个宝箱同一个用户类型的并发抽奖,持续10秒,重试三次
|
||||
2.获取三个奖池对象,判断三个奖池是否为空,如果为空,就初始化创建空奖池
|
||||
3.查询用户是否拥有三级爆率,如果不为空,说明有三级爆率
|
||||
4.根据是否有三级爆率权限,选择使用哪个奖池,checkPool() 方法首先查看当前prizePool对象是否有数据,
|
||||
是直接返回,否则去redis中查看是否有数据,有则将数据加入prizePool对象中,
|
||||
否则去数据库中查询,并加入prizePool对象中,有三级爆率就使用thirdExplosivePrizePool,否则使用prizePool
|
||||
5.补偿机制,先查询用户的补偿记录是否有值,如果是补偿箱并且没有补偿记录,创建空的补偿记录,如果有补偿记录,查看是否到达补偿阈值,
|
||||
如果是补偿箱并且补偿值>=阈值,将切换到补偿奖池,并将补偿值清楚,将补偿记录删除
|
||||
6.执行抽奖的算法doLottery()方法,箱子里面包含饰品及其数量,获取饰品总数量,并且随机五次并记录最后一次的值,
|
||||
然后循环每个饰品的位置,如果这个位置的值和记录的最后一次的值相同,拿到当前饰品的id,
|
||||
如果循环多次没有拿到,就取饰品的第一个(按序给),库存减一
|
||||
Reference in New Issue
Block a user