标题: 三国孔明传物理伤害分析
性别:男-离线 阿尔法孝直
(雀力日进)

闽国公
遂安军节度使
★★★★★★

Rank: 19Rank: 19Rank: 19Rank: 19
柱国(正二品) 轩辕春秋年度最佳(游戏人生区)
组别 节度使
级别 卫将军
好贴 2
功绩 1796
帖子 6034
编号 19070
注册 2004-10-16
家族 轩辕雀党


发表于 2010-7-29 18:02 资料 个人空间 短消息 只看该作者 QQ
写了一个,发现算法不好,如果攻方双方等级都很高,那么计算一次消耗的时间可能要半个甚至一个小时甚至还要多。
每次计算随机数时都做成循环,为了计算随机数取任何一个值时的结果,那么循环次数最高为:


(255+32)*3\2*13\10*99^4=53,697,316,959
这个……


顶部
性别:男-离线 阿尔法孝直
(雀力日进)

闽国公
遂安军节度使
★★★★★★

Rank: 19Rank: 19Rank: 19Rank: 19
柱国(正二品) 轩辕春秋年度最佳(游戏人生区)
组别 节度使
级别 卫将军
好贴 2
功绩 1796
帖子 6034
编号 19070
注册 2004-10-16
家族 轩辕雀党


发表于 2010-7-29 18:16 资料 个人空间 短消息 只看该作者 QQ
刚刚发现有逻辑错误:

QUOTE:
2、伤害A计算:
A、1 如果Random%(攻方攻击力x攻方所在地形因素/10)<防御方防御力x防御方地形因素/10/10
并且防御方没有混乱,那么伤害A=0,(猜测:攻击方如果是敌人,那敌人是不会来打的,他似乎会实现有个模拟运算攻击过程,见下边程序注释处)

A、2 如果Random%(攻方攻击力x攻方所在地形因素/10)>=防御方防御力x防御方地形因素/10/10
那么又分为:
A、2-1:如果(防御力x地形因素/10+1)/2>攻击方攻击力x攻击方所在地形因素/10
那么伤害A=1;
A、2-2:如果(防御力x地形因素/10+1)/2<=攻击方攻击力x攻击方所在地形因素/10
那么伤害A=攻击力x地形因素/10-防御力x地形因素/10/2
B、判断防御方兵种:
B、1:如果兵种代号为09,0A、0B时,伤害A=Ax75%;
B、2:如果兵种代号为1B、1C、1D时,伤害A=Ax150%;
B、3:如果兵种代号1E、1F时,伤害A=Ax50%;
B、4:如果兵种代号为22时,伤害A=1;

一旦红字部分判定成功,伤害=0,那么后面的 第2-B步 和 第6步 应该不再计算(其他步骤因为只乘系数不做加减法,所以不会动摇0伤害)。否则就会出现本应该有很大伤害的攻击,结果出现只扣1~5的HP。

[ 本帖最后由 阿尔法孝直 于 2010-7-29 18:17 编辑 ]


顶部
性别:未知-离线 ctermiii


Rank: 5Rank: 5
轩辕春秋年度最佳(游戏人生区)
组别 羽林都尉
级别 破贼校尉
好贴 1
功绩 92
帖子 90
编号 50655
注册 2005-10-7


发表于 2010-7-29 21:51 资料 文集 短消息 只看该作者
噢,是这样的,如果基本伤害为0的话,直接退出基本伤害计算函数,也不再进行全力一击和等级因素的判断。
其他判断还是照旧进行。
对于计算伤害,我有另外一个想法,我看看能不能实现先。
好像比较难。

[ 本帖最后由 ctermiii 于 2010-7-29 22:10 编辑 ]
顶部
性别:男-离线 阿尔法孝直
(雀力日进)

闽国公
遂安军节度使
★★★★★★

Rank: 19Rank: 19Rank: 19Rank: 19
柱国(正二品) 轩辕春秋年度最佳(游戏人生区)
组别 节度使
级别 卫将军
好贴 2
功绩 1796
帖子 6034
编号 19070
注册 2004-10-16
家族 轩辕雀党


发表于 2010-7-29 23:17 资料 个人空间 短消息 只看该作者 QQ


QUOTE:
A、2-1:如果(防御力x地形因素/10+1)/2>攻击方攻击力x攻击方所在地形因素/10
那么伤害A=1;
A、2-2:如果(防御力x地形因素/10+1)/2<=攻击方攻击力x攻击方所在地形因素/10
那么伤害A=攻击力x地形因素/10-防御力x地形因素/10/2

又发现算法的一个问题:

当(防御力x地形因素/10+1)/2 与 攻击方攻击力x攻击方所在地形因素/10 恰好相等时,伤害=攻击力x地形因素/10-防御力x地形因素/10/2,等于0
本来这步应该是为了保证伤害至少为1,结果……

QUOTE:
0042A5B7   .  C1E8 01       SHR EAX,1                                                  ;  (防御力x地形因素/10+1)/2
0042A5BA   .  3B45 FC       CMP EAX,DWORD PTR SS:[EBP-4]
0042A5BD   .  0F82 0C000000 JB EKD2Win.0042A5CF
0042A5C3   .  C745 F0 01000>MOV DWORD PTR SS:[EBP-10],1         ;(防御力x地形因素/10+1)/2大于攻击方攻击力x攻击方所在地形因素/10,只受1点伤害
0042A5CA   .  E9 0E000000   JMP EKD2Win.0042A5DD
0042A5CF   >  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0042A5D2   .  8B4D E0       MOV ECX,DWORD PTR SS:[EBP-20]
0042A5D5   .  C1E9 01       SHR ECX,1
0042A5D8   .  2BC1          SUB EAX,ECX                                                ;  
0042A5DA   .  8945 F0       MOV DWORD PTR SS:[EBP-10],EAX               ; 小于的话,伤害为:攻击力x地形因素/10-防御力x地形因素/10/2
0042A5DD   >  8B4D E4       MOV ECX,DWORD PTR SS:[EBP-1C]

原来你把JB看成JBE了……

---------------------------------------------------------------------------------------

另外还有一个需要确认一下,就是间接攻击(反击、炮车虎兵等的非第一人攻击)对0x22号兵种(就是藤甲兵)的伤害是否永远为0,无论攻击力多少。

关于这个,我仔细看了一下IDA:

signed int __thiscall sub_4238AF(int this, unsigned int a2)
{
  signed int result; // eax@26
  unsigned int v3; // ebx@6
  int v4; // eax@10
  int v5; // eax@12
  unsigned __int8 v6; // al@14
  unsigned int v7; // ebx@14
  unsigned __int8 v8; // al@14
  unsigned __int8 v9; // al@16
  unsigned __int8 v10; // al@17
  unsigned int v11; // eax@17
  int v12; // [sp+Ch] [bp-14h]@1
  char *v13; // [sp+14h] [bp-Ch]@1
  int v14; // [sp+18h] [bp-8h]@1
  signed int v15; // [sp+1Ch] [bp-4h]@1
  signed int v16; // [sp+10h] [bp-10h]@1

  v12 = this;
  v13 = (char *)&dword_4556E8 + 54 * sub_409130();
  v14 = (int)((char *)&dword_4556E8 + 54 * sub_409130());
  v15 = 0;
  v16 = 0;
  switch ( *(_BYTE *)(v12 + 18) )
  {
    case 1:
      v15 = sub_42A4AD(*(_DWORD *)(v12 + 4 * *(_BYTE *)(v12 + 16)), v14, 1);
      if ( a2 >= 1 || *(_BYTE *)(v12 + 19) == 1 )
        v15 /= 2;
      sub_423769(v12);
      if ( v15 > 0 )
      {
        v3 = (unsigned __int8)sub_42A396(*(_DWORD *)(v12 + 4 * *(_BYTE *)(v12 + 16)));
        if ( v3 > sub_447328(100) )
        {
          v15 = 3 * v15 / 2;
          v16 = 1;
        }
      }
      break;
    case 2:
      v4 = v12;
      LOBYTE(v4) = *(_BYTE *)(v12 + 19);
      v15 = sub_4087E1(v14, v4);
      break;
    case 3:
      v5 = v12;
      LOBYTE(v5) = *(_BYTE *)(v12 + 19);
      v15 = sub_408907(v14, v5);
      break;
  }
  if ( v15 > 0 )
  {
    v6 = sub_409280();
    v7 = sub_447328(v6);
    v8 = sub_409280();
    if ( v7 >= sub_447328(v8) && v16 != 1 )
    {
      v10 = sub_409280();
      v11 = sub_447328(v10);
      v15 = sub_4472CB(v15, v11 % 6);
    }
    else
    {
      v9 = sub_409280();
      v15 += sub_447328(v9) % 6u;
    }
  }
  if ( sub_409220() == 1 )
  {
    if ( !sub_40BAB0() )
      v15 = 8 * v15 / 10;
    if ( sub_40BAB0() == 2 )
      v15 = 12 * v15 / 10;
  }
  if ( v16 == 1 )
  {
    if ( v15 > 0 )
    {
      sub_409580();
      sub_438F35(0, (char)(char *)dword_45181C);
    }
  }
  result = *(_DWORD *)(v12 + 4 * *(_BYTE *)(v12 + 17) + 26);
  if ( result >= v15 )
    result = v15;
  *(_DWORD *)(v12 + 42) = result;
  return result;
}

就是说,要等反击除以2算完之后才判断是否为零,若等于零则不再算下面的。

[ 本帖最后由 阿尔法孝直 于 2010-7-29 23:51 编辑 ]
顶部
性别:未知-离线 ctermiii


Rank: 5Rank: 5
轩辕春秋年度最佳(游戏人生区)
组别 羽林都尉
级别 破贼校尉
好贴 1
功绩 92
帖子 90
编号 50655
注册 2005-10-7


发表于 2010-7-30 13:18 资料 文集 短消息 只看该作者
你对数字真的很敏感啊,哈哈
伤害为0的地方还真多,等我出差回去再看看,现在有时间没时间的不定。
顶部
性别:男-离线 阿尔法孝直
(雀力日进)

闽国公
遂安军节度使
★★★★★★

Rank: 19Rank: 19Rank: 19Rank: 19
柱国(正二品) 轩辕春秋年度最佳(游戏人生区)
组别 节度使
级别 卫将军
好贴 2
功绩 1796
帖子 6034
编号 19070
注册 2004-10-16
家族 轩辕雀党


发表于 2010-7-30 17:04 资料 个人空间 短消息 只看该作者 QQ
写了一个计算工具,大家看看有没问题。

[ 本帖最后由 阿尔法孝直 于 2010-8-1 19:08 编辑 ]


附件: 物理伤害计算.rar (2010-8-1 19:08, 585.48 K)
该附件被下载次数 186
顶部
性别:未知-离线 ctermiii


Rank: 5Rank: 5
轩辕春秋年度最佳(游戏人生区)
组别 羽林都尉
级别 破贼校尉
好贴 1
功绩 92
帖子 90
编号 50655
注册 2005-10-7


发表于 2010-7-30 18:27 资料 文集 短消息 只看该作者
你这个程序注册了也打不开。
---------------------------
孔明传物理伤害计算器
---------------------------
Run-time error '76':

Path not found
---------------------------
确定   
---------------------------
我放到游戏目录下也不行。
顶部
性别:男-离线 阿尔法孝直
(雀力日进)

闽国公
遂安军节度使
★★★★★★

Rank: 19Rank: 19Rank: 19Rank: 19
柱国(正二品) 轩辕春秋年度最佳(游戏人生区)
组别 节度使
级别 卫将军
好贴 2
功绩 1796
帖子 6034
编号 19070
注册 2004-10-16
家族 轩辕雀党


发表于 2010-7-30 18:58 资料 个人空间 短消息 只看该作者 QQ
我的错,缺了一个文件,已经在原帖换好了。

[ 本帖最后由 阿尔法孝直 于 2010-7-30 20:58 编辑 ]
顶部
性别:未知-离线 ctermiii


Rank: 5Rank: 5
轩辕春秋年度最佳(游戏人生区)
组别 羽林都尉
级别 破贼校尉
好贴 1
功绩 92
帖子 90
编号 50655
注册 2005-10-7


发表于 2010-8-1 15:18 资料 文集 短消息 只看该作者
伤害为0的话,会越过等级相关的计算,但对是否我军还是敌军,是不会越过的,第一帖已经改了;

但你这个文件还是打不开。

我直接模拟了一次伤害计算来显示,

其他因素都是不变的,只有随机数变化,所以模拟前把随机数保存起来,模拟后再恢复。

可保证伤害一定跟模拟相同。

全力一击也可以模拟到,会直接以伤害加强的形式反映在伤害结果里。
顶部
性别:男-离线 阿尔法孝直
(雀力日进)

闽国公
遂安军节度使
★★★★★★

Rank: 19Rank: 19Rank: 19Rank: 19
柱国(正二品) 轩辕春秋年度最佳(游戏人生区)
组别 节度使
级别 卫将军
好贴 2
功绩 1796
帖子 6034
编号 19070
注册 2004-10-16
家族 轩辕雀党


发表于 2010-8-1 15:35 资料 个人空间 短消息 只看该作者 QQ
再度泪奔,又改了一下,如果还不行那我要跳楼了。
顶部
性别:男-离线 阿尔法孝直
(雀力日进)

闽国公
遂安军节度使
★★★★★★

Rank: 19Rank: 19Rank: 19Rank: 19
柱国(正二品) 轩辕春秋年度最佳(游戏人生区)
组别 节度使
级别 卫将军
好贴 2
功绩 1796
帖子 6034
编号 19070
注册 2004-10-16
家族 轩辕雀党


发表于 2010-8-1 15:39 资料 个人空间 短消息 只看该作者 QQ


QUOTE:
原帖由 ctermiii 于 2010-8-1 15:18 发表
伤害为0的话,会越过等级相关的计算,但对是否我军还是敌军,是不会越过的,第一帖已经改了;

但你这个文件还是打不开。

我直接模拟了一次伤害计算来显示,

其他因素都是不变的,只有随机数变化,所以 ...

是否会越过我军还是敌军对结果无任何影响,反正结果都是0,判定敌我也就是乘个系数,0乘任何数都是0。
顶部
性别:未知-离线 ctermiii


Rank: 5Rank: 5
轩辕春秋年度最佳(游戏人生区)
组别 羽林都尉
级别 破贼校尉
好贴 1
功绩 92
帖子 90
编号 50655
注册 2005-10-7


发表于 2010-8-1 18:17 资料 文集 短消息 只看该作者
恭喜,这下不用跳楼了
不过连击只跟速度有关,你的计算器算出来,比如88大武术家级对5运粮队级,竟然100%连击
奇怪,就算速度最慢的武将被减速,最高也只有(10-2/2+1)/15=67%的概率啊
判断是否我军跟伤害没关系,只是把运算过程还原一下

我发现攻击之后,除非人物升级能力变化过程取随机数,不然随机数A一直到连击判定都保持不变;
如果连击导致随机数为B,造成伤害之前B还是不变。

那这个模拟过程除了模拟暴击,连击也能算出来了,我看看是否要在补丁里加入本次攻击是否连击的判断,那连击伤害也很容易算出来了。

[ 本帖最后由 ctermiii 于 2010-8-1 18:20 编辑 ]
顶部
性别:男-离线 阿尔法孝直
(雀力日进)

闽国公
遂安军节度使
★★★★★★

Rank: 19Rank: 19Rank: 19Rank: 19
柱国(正二品) 轩辕春秋年度最佳(游戏人生区)
组别 节度使
级别 卫将军
好贴 2
功绩 1796
帖子 6034
编号 19070
注册 2004-10-16
家族 轩辕雀党


发表于 2010-8-1 19:08 资料 个人空间 短消息 只看该作者 QQ


QUOTE:
原帖由 ctermiii 于 2010-8-1 18:17 发表
恭喜,这下不用跳楼了
不过连击只跟速度有关,你的计算器算出来,比如88大武术家级对5运粮队级,竟然100%连击
奇怪,就算速度最慢的武将被减速,最高也只有(10-2/2+1)/15=67%的概率啊
判断是否我军跟伤害没关 ...

重新改了一下,再看看行不行了。
顶部
性别:未知-离线 ctermiii


Rank: 5Rank: 5
轩辕春秋年度最佳(游戏人生区)
组别 羽林都尉
级别 破贼校尉
好贴 1
功绩 92
帖子 90
编号 50655
注册 2005-10-7


发表于 2010-8-2 17:02 资料 文集 短消息 只看该作者
没有我的用起来方便,还要输数据进去
顶部

正在浏览此帖的会员 - 共 1 人在线




当前时区 GMT+8, 现在时间是 2024-11-20 12:29
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.015768 second(s), 10 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP