以撒的结合吧 关注:288,803贴子:3,388,973

一次射出多发泪弹时的泪弹发射角度的经验公式(重制版)

只看楼主收藏回复

回看之前的帖子的时候发现代码有问题,文字部分也写的很乱,所以删掉重写一篇,这次有先在word里打草稿,争取说明白,楼下开始


IP属地:湖北1楼2025-11-12 20:42回复
    【省流版】复制运行以下lua代码:
    local function GetMaxTearsAngleInBranch(b)
    local maxTearsAngleInBranch = 0
    if b <= 0 then
    maxTearsAngleInBranch = 0
    elseif b <= 1 then
    maxTearsAngleInBranch = 90
    else
    maxTearsAngleInBranch = 110
    end
    print("maxTearsAngleInBranch = "..tostring(maxTearsAngleInBranch))
    return maxTearsAngleInBranch
    end
    local function TearsInBranchOverflow(b)
    return (b >= 8 )
    end
    local function GetTearsInBranch(b)
    local tearsInBranch = 1
    if TearsInBranchOverflow(b) then
    tearsInBranch = 8
    else
    tearsInBranch = b + 1
    end
    tearsInBranch = math.min(16, tearsInBranch)
    print("tearsInBranch = "..tostring(tearsInBranch))
    return tearsInBranch
    end
    local function GetMaxBranchAngle(x, y, z)
    local m = x + 2 * y + 1
    local angles = 0
    if m > 1 then
    angles = m
    end
    local angleOffset = 4.34
    local maxBranchAngle = angleOffset * angles
    if z > 0 then
    local k = 0.4
    maxBranchAngle = k * maxBranchAngle
    end
    print("maxBranchAngle = "..tostring(maxBranchAngle))
    return maxBranchAngle
    end
    local function TearsOverflow(branches, tearsInBranch)
    return (branches * tearsInBranch > 16)
    end
    local function GetBranches(b, x, y, z, tearsInBranch)
    local branches = 1
    if TearsInBranchOverflow(b) then
    branches = 2
    else
    local m = x + 2 * y + 1
    local n
    if z > 1 then
    n = m + (z - 1) + 1
    else
    n = m + 1
    end
    if m > 1 or z > 0 then
    branches = branches + 1 + math.floor((n - 2) / tearsInBranch)
    end
    if TearsOverflow(branches, tearsInBranch) then
    branches = math.floor(16 / tearsInBranch)
    end
    end
    print("branches = "..tostring(branches))
    return branches
    end
    local function UpdateBranchesOnConjoined(branches, b, x, y, z)
    if b < 1 then
    if x > 0 or y > 0 or z > 0 then
    branches = math.min(16, branches + 2 )
    end
    elseif b == 1 then
    branches = math.min(16, branches + 1)
    end
    print("update branches on conjoined: branches = "..tostring(branches))
    return branches
    end
    local function UpdateTearsOnConjoined(tears, b, x, y, z)
    if b < 1 then
    if x > 0 or y > 0 or z > 0 then
    tears[#tears] = nil
    tears[#tears] = nil
    end
    tears[#tears + 1] = {
    [1] = -45,
    [2] = 45
    }
    end
    print("update tears on conjoined")
    return tears
    end
    local function GetTears(b, x, y, z, c)
    local maxTearsAngleInBranch = GetMaxTearsAngleInBranch(b)
    local tearsInBranch = GetTearsInBranch(b)
    local maxBranchAngle = GetMaxBranchAngle(x, y, z)
    local branches = GetBranches(b, x, y, z, tearsInBranch)
    if c then
    branches = UpdateBranchesOnConjoined(branches, b, x, y, z)
    end
    local startBranchAngle = - maxBranchAngle / 2
    local startTearsAngleInBranch = - maxTearsAngleInBranch / 2
    local BranchAngleOffset = maxBranchAngle / (branches - 1)
    local TearsAngleOffset = maxTearsAngleInBranch / (tearsInBranch - 1)
    local curBranchAngle = startBranchAngle
    local curTearsAngleInBranch = startTearsAngleInBranch
    local tears = {}
    for i = 1, branches, 1 do
    tears[i] = {}
    for j = 1, tearsInBranch, 1 do
    tears[i][j] = curBranchAngle + curTearsAngleInBranch
    curTearsAngleInBranch = curTearsAngleInBranch + TearsAngleOffset
    end
    curTearsAngleInBranch = startTearsAngleInBranch
    curBranchAngle = curBranchAngle + BranchAngleOffset
    end
    if c then
    tears = UpdateTearsOnConjoined(tears, b, x, y, z)
    end
    return tears
    end
    local function PrintTears(tears)
    print("your tears: ")
    for i = 1, #tears, 1 do
    for j = 1, #tears[i], 1 do
    print("["..tostring(i)..", "..tostring(j).."] = "..tostring(tears[i][j]))
    end
    end
    end
    local b = 0---巫师帽:自然数
    local x = 0 --内眼:自然数
    local y = 0 --变异蜘蛛:自然数
    local z = 0 --完美视力:自然数
    local c = false --宝宝套:true/ false
    local tears = GetTears(b, x, y, z, c)
    print("your collectibles: 巫师帽:"..tostring(b)
    ..",内眼:"..tostring(x)
    ..",蜘蛛:"..tostring(y)
    ..",眼镜:"..tostring(z)
    ..",宝宝套:"..tostring(c))
    PrintTears(tears)


    IP属地:湖北2楼2025-11-12 20:43
    收起回复
      2025-12-29 11:01:10
      广告
      不感兴趣
      开通SVIP免广告
      可以使用这个网站运行上面的代码:http【】s://wiki【】.luatos【】.com/pag【】es/emul【】ator.html
      楼下说怎么用


      IP属地:湖北3楼2025-11-12 20:48
      回复





        IP属地:湖北4楼2025-11-12 20:53
        回复
          【屁话版】
          注意:因为这是经验公式,来自对测试数据的主观判断和归纳,所以会有很多迷惑发言,请在保持自己独立思考的情况下批判性观看。
          说人话:公式是连蒙带猜搞出来的,不必当真看个乐子就行。
          楼下开始


          IP属地:湖北5楼2025-11-12 20:56
          回复
            【泪弹组】
            角色同时发射多发泪弹时,把泪弹分为几组,大多数情况下每组内的泪弹对称分布且任意两组可以通过围绕角色旋转重合(持有宝宝套时可能存在特殊情况)
            说人话:举例如图



            IP属地:湖北6楼2025-11-12 21:00
            回复
              【泪弹组内泪弹最大夹角(组内最大夹角)】
              取一个泪弹组内两个泪弹最大夹角为组内最大夹角,如图所示:


              IP属地:湖北7楼2025-11-12 21:01
              回复
                【定义变量】
                在接下来的公式里涉及4个变量,如图所示:


                IP属地:湖北8楼2025-11-12 21:03
                回复
                  2025-12-29 10:55:10
                  广告
                  不感兴趣
                  开通SVIP免广告
                  【组内最大夹角的经验公式】

                  说人话:
                  组内最大夹角只和巫师帽数目有关
                  (不持有巫师帽时单个泪弹即一个泪弹组,所以不考虑组内最大夹角)
                  持有1个巫师帽时组内最大夹角为90;
                  持有多于1个巫师帽时组内最大夹角为110


                  IP属地:湖北9楼2025-11-12 21:04
                  收起回复
                    【泪弹组内泪弹数目(组内泪弹数目)的经验公式】
                    组内泪弹数目对应变量tearsInBranch

                    说人话:
                    组内泪弹数目也只和巫师帽数目有关
                    组内泪弹数目比巫师帽多1个,上限8个
                    (7个巫师帽时发射8个泪弹,8个及以上则发射16个泪弹和这个有关,16= 2组 * 8个/组, 后文细说)


                    IP属地:湖北10楼2025-11-12 21:07
                    回复
                      【组间最大夹角】
                      取组内最大夹角的角平分线对应的角度代表这个泪弹组,所有泪弹组对应的角度之间差值最大的为组间最大夹角,举例如图



                      IP属地:湖北11楼2025-11-12 21:09
                      回复
                        【组间最大夹角的经验公式】
                        组间最大夹角对应变量maxBranchAngle

                        说人话:
                        组间最大夹角和内眼数目x,蜘蛛数目y,眼镜数目z有关,与巫师帽无关。
                        如果内眼或蜘蛛至少有一个,那么组间最大夹为4.34 * (x + 2 * y + 1),可以理解为wiki里的公式在没有眼镜的情况下算出的泪弹数目个泪弹,两两角度间隔4.34°地排在一起后构成的大夹角

                        如果眼镜至少有一个,那么还要在上述角度上乘0.4
                        【注意】这里算的是角度不是泪弹数目,眼镜只增加泪弹数目,对角度反而是压缩的效果
                        话说4.34和0.4这两个数值有什么特殊意义吗?


                        IP属地:湖北12楼2025-11-12 21:17
                        回复
                          【泪弹组数目(组数)的经验公式】
                          组数对应变量branches



                          这个稍微有点复杂,楼下细说


                          IP属地:湖北13楼2025-11-12 21:19
                          回复
                            首先是遵循下面几条原则,优先度从大到小:
                            ① 组内泪弹总数不能超过8
                            ② 泪弹总数不能超过16,如果超过则优先确保组内泪弹数目不变而减小组数直到泪弹总数不大于16
                            ③ 持有道具增加时泪弹总数尽量增加或不变,尽量不要减少
                            重点是:增加泪弹总数不是最大优先级的原则,它要为前两条原则让路
                            然后把整个函数拆开看:
                            第一部分:看是否有多余的巫师帽,如果有则组数一定只能是2


                            7个巫师帽时组内泪弹数目正好是8,组内泪弹数达到最大值,8个巫师帽时还是8,相当于多余1个巫师帽。
                            之所以不直接说巫师帽数目大于7是我自己为了方便理解,我自己是这样想的:
                            以8个巫师帽为例子,根据1~7个巫师帽时的规律应该一组内有8+1=9个泪弹,因为每组最多8个泪弹所以应该是1.125组,但是组数只能是整数,基于原则③尽量不减少泪弹总数所以向上取整即2组,所以一共有2组*8个/组=16枚泪弹。
                            接下来三步都是在没有多余巫师帽的情况下进行的。


                            IP属地:湖北14楼2025-11-12 21:27
                            回复
                              2025-12-29 10:49:10
                              广告
                              不感兴趣
                              开通SVIP免广告
                              第二部分:计算只有内眼蜘蛛和眼镜时的泪弹总数n(或者说是每组只有一枚泪弹时的组数)

                              和wiki公式完全一致所以不多说了:


                              IP属地:湖北15楼2025-11-12 21:28
                              回复