打架机器人这种东东,一般都是在游戏开发过程中测试用的东西,对于策划圈外的人士接触到这个东西的人很少,不像前面的原型库工具那样,其他行业只要是演示都可以使用,打架机器人的运用频率就少了很多,而且网游里面服务器的一般直接有专门的测试脚本框架,所以正常游戏换皮开发过程中,打架机器人也不是必须的,不过对于一些开发中的游戏来说,尤其游戏公司以前没有一套成熟的游戏数值模型系统的公司,打架机器人有时可以减少很多开发过程中的工作量,好了,我们看看开发这个东西需要什么东东。

excel2003以上版本,大家电脑里面应该都有。别的不需要了。

说道excel编程,大家肯定想到宏,

所谓宏,就是一些命令组织在一起,作为一个单独命令完成一个特定任务。Microsoft Word中对宏定义为:“宏就是能组织到一起作为一独立的命令使用的一系列word命令,它能使日常工作变得更容易”。Word使用宏语言Visual Basic将宏作为一系列指令来编写。
计算机科学里的宏是一种抽象的,根据一系列预定义的规则替换一定的文本模式。Excel办公软件自动集成了“VBA”高级程序语言,用此语言编制出的程序就叫“宏”。使用“VBA”需要有一定的编程基础,并且还会耗费大量的时间,因此,绝大多数的使用者仅使用了Excel的一般制表功能,很少使用到“VBA”。
宏的用途在于自动化频繁使用的序列或者是获得一种更强大的抽象能力--但这常常是一回事。
应用程序也可以使用一种和宏类似机理的系统来允许用户将一系列(一般是最常使用到的操作)自定义为一个步骤。也就是用户执行一系列操作,并且让应用程序来“记住”这些操作以及顺序。更高级的用户可以通过内建的宏编程来直接使用那些应用程序的功能。当使用一种不熟悉的宏语言来编程时,比较有效的方法就是记录用户希望得到的一连串操作,然后通过阅读应用程序记录下来的宏文件来理解宏命令的结构组成。
我们这里只讨论,微软的宏,所以在其他语言中的应用我们不考虑。
看一下页面具体是怎么做的呢?
我们先看下随机生成属性的宏
Sub 随机生成等级A()
Call 属性索引
'===========数值类属性==========
A大生命 = Int(A常量 * (60 + Rnd() * 40))
A小生命 = A大生命
A小攻击 = Int(A常量 * (8 + Rnd() * 4))
A大攻击 = Int(A常量 * (13 + Rnd() * 7))
A间隔 = Int(50 + Rnd() * 50)
'===========概率类属性==========
A防御 = Int(A常量 * (1.5 + Rnd() * 17))
A命中 = Int(Rnd() * 60)
A躲闪 = Int(2 + Rnd() * 58)
A暴击 = Int(2 + Rnd() * 58)
A韧性 = Int(Rnd() * 60)
A格档 = Int(Rnd() * 60)
A穿透 = Int(Rnd() * 60)
'===========显示用1==========
'=====(已经提到公用区)
'===========显示用2==========
Sheet1.Cells(15, 4).Value = A小生命
Sheet1.Cells(15, 5).Value = A大生命
'===========显示用3==========
Sheet1.Cells(17, 4).Value = A小攻击
Sheet1.Cells(17, 5).Value = A大攻击
'===========显示用4==========
Sheet1.Cells(18, 5).Value = A间隔
Sheet1.Cells(19, 5).Value = A防御
'===========显示用5==========
Sheet1.Cells(20, 5).Value = A命中
Sheet1.Cells(21, 5).Value = A躲闪
Sheet1.Cells(22, 5).Value = A暴击
Sheet1.Cells(23, 5).Value = A韧性
Sheet1.Cells(24, 5).Value = A格档
Sheet1.Cells(25, 5).Value = A穿透
End Sub

sub定义方法,end sub结束,

Sub 随机生成等级B()
Call 属性索引
'===========数值类属性==========
B大生命 = Int(B常量 * (60 + Rnd() * 40))
B小生命 = B大生命
B小攻击 = Int(B常量 * (8 + Rnd() * 4))
B大攻击 = Int(B常量 * (13 + Rnd() * 7))
B间隔 = Int(50 + Rnd() * 50)
'===========概率类属性==========
B防御 = Int(B常量 * (1.5 + Rnd() * 17))
B命中 = Int(Rnd() * 60)
B躲闪 = Int(2 + Rnd() * 58)
B暴击 = Int(2 + Rnd() * 58)
B韧性 = Int(Rnd() * 60)
B格档 = Int(Rnd() * 60)
B穿透 = Int(Rnd() * 60)
'===========显示用1==========
'=====(已经提到公用区)
'===========显示用2==========
Sheet1.Cells(15, 10).Value = B小生命
Sheet1.Cells(15, 11).Value = B大生命
'===========显示用3==========
Sheet1.Cells(17, 10).Value = B小攻击
Sheet1.Cells(17, 11).Value = B大攻击
'===========显示用4==========
Sheet1.Cells(18, 11).Value = B间隔
Sheet1.Cells(19, 11).Value = B防御
'===========显示用5==========
Sheet1.Cells(20, 11).Value = B命中
Sheet1.Cells(21, 11).Value = B躲闪
Sheet1.Cells(22, 11).Value = B暴击
Sheet1.Cells(23, 11).Value = B韧性
Sheet1.Cells(24, 11).Value = B格档
Sheet1.Cells(25, 11).Value = B穿透
End Sub

A和B方法内容几乎一样,只不过sheet1.cells()所指向的格子不同,这里使用的数值是随机数,如果针对专门的项目,只要sheet1.Cells指向我们填好的升级曲线对应的数值就可以了。方法开始时call 调用属性索引,然后随机出A或B的的最大生命,最小生命,最大攻击,最小攻击值,以及攻击间隔时间,防御,命中,暴击,韧性,格挡,穿透,在方法最后把这些数值填到sheet1.Cells的格子里面,当然正常游戏中使用的应该是反方向的,就是说,我们根据升级曲线计算出数值,然后赋给A和B方法这些变量。

战斗按钮宏
Sub 开始模拟战斗()                         '这个是主函数!!
'===============初始操作(初始化)===============
Sheet1.Cells(15, 4).Value = Sheet1.Cells(15, 5).Value           '把当前HP同步为最大HP
Sheet1.Cells(15, 10).Value = Sheet1.Cells(15, 11).Value
Call 初始化属性
'=========100毫秒时,300回合是300秒,300毫秒时,100回合是300秒===============
战斗时间 = 33 * 100 * 4                     '1回合*100倍数*4步读条,因为100倍是50~100之间的数,理论如果双方都100间隔,则可以持续100回合(因为这里*4了,所以下面的刷新显示的循环次数也要*4的)
'#########战斗时间改成33回合,延迟毫秒改成300毫秒,显示时间改成99秒#########
A间隔累加 = A间隔                          '初始化默认值
B间隔累加 = B间隔
Call 概率索引
'===============循环开始===============
For i = 1 To 战斗时间
Call 显示时间
'===============主操作(攻击判定)===============
If i = A间隔累加 Then                      'i从1开始,间隔累加从1个间隔开始,上面有初始化
A间隔累加 = A间隔累加 + A间隔
Call A操作
End If
If i = B间隔累加 Then
B间隔累加 = B间隔累加 + B间隔
Call B操作
End If
'===============显示操作(显示刷新)===============
Call 冒数
Call 血条
If i Mod 40 = 0 Then          '调整速度,每循环多少次,延迟多少毫秒,假如1000毫秒刷新显示1下,如果判断的循环次数是100次,那么每循环100次的迟延是10毫秒(下面一行说明为了表达读条,乘了个4倍关系)
'============100毫秒时,1回合是1秒,300毫秒时,1回合是3秒==============
Sleep (300)                   '如果上所述,为了节省效率,如果是每循环10次,延迟100毫秒,也可以达到1000毫秒刷新显示一下的目的,但由于上面的循环有个4倍的关系,所以在循环次数上变成了40次
'#########战斗时间改成33回合,延迟毫秒改成300毫秒,显示时间改成99秒#########
End If                        '如果需要把每次刷新显示的时间拉长,则把100毫秒的延迟改成300毫秒,那么就相当于(攻击间隔是100的玩家)每循环400次,表现为3000毫秒的时间
Next
End Sub
Sub 显示时间()
Sheet1.Cells(4, 7).Value = Int(i / 100 / 4 * 3)       '把循环次数还原成回合数,这里1回合(循环400次)的时间大约为1000毫秒
'#########战斗时间改成33回合,延迟毫秒改成300毫秒,显示时间改成99秒,最后*3了#########
End Sub

战斗,先初始化属性,确定战斗时间,当然战斗就要有随机,所以我们调用概率索引,在战斗过程中,不断更新时间,攻击判定,显示血条等等,下面是全部源码

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'==================A和B的基础属性===================
Public A等级, A碾压, A抵抗, A小生命, A大生命, A小攻击, A大攻击, A间隔, A防御, A命中, A躲闪, A暴击, A韧性, A格档, A穿透
Public B等级, B碾压, B抵抗, B小生命, B大生命, B小攻击, B大攻击, B间隔, B防御, B命中, B躲闪, B暴击, B韧性, B格档, B穿透
'==================A和B的基础属性用常量===================
Public A常量, B常量
'==================循环次数和回合次数用===================
Public i, 战斗时间, A间隔累加, B间隔累加
'==================A和B的攻击判定属性===================
Public A攻击的碾压, A攻击的抵抗, A攻击的普通攻击, A攻击的未命中, A攻击的暴击, A攻击的格挡
Public B攻击的碾压, B攻击的抵抗, B攻击的普通攻击, B攻击的未命中, B攻击的暴击, B攻击的格挡
'==================A和B的攻击判定属性用常量===================
Public A攻击判定, B攻击判定, 常量碾压, 常量抵抗, 常量普通攻击, 常量未命中, 常量暴击, 常量格挡
'==================A伤害传递用===================
Public A伤害, A判定伤害, A最小伤害, A最大伤害
'==================B伤害传递用===================
Public B伤害, B判定伤害, B最小伤害, B最大伤害
Sub 属性索引()
A等级 = Sheet1.Cells(11, 3).Value
B等级 = Sheet1.Cells(11, 13).Value
A常量 = Application.WorksheetFunction.Power(2.1, A等级 / 10)
B常量 = Application.WorksheetFunction.Power(2.1, B等级 / 10)
'===============公用信息=======================
If A等级 > B等级 Then
A碾压 = Int(Application.WorksheetFunction.Power(A等级 - B等级, 2) / 1.2)
A抵抗 = Int(Application.WorksheetFunction.Power(A等级 - B等级, 2) / 1.2)
B碾压 = 0
B抵抗 = 0
ElseIf B等级 > A等级 Then
A碾压 = 0
A抵抗 = 0
B碾压 = Int(Application.WorksheetFunction.Power(B等级 - A等级, 2) / 1.2)
B抵抗 = Int(Application.WorksheetFunction.Power(B等级 - A等级, 2) / 1.2)
Else
A碾压 = 0
A抵抗 = 0
B碾压 = 0
B抵抗 = 0
End If
'============把A和B的等级差类属性,提到了公用区======================
'===========显示用1==========
Sheet1.Cells(11, 5).Value = A等级
Sheet1.Cells(12, 5).Value = A碾压
Sheet1.Cells(13, 5).Value = A抵抗
'===========显示用1==========
Sheet1.Cells(11, 11).Value = B等级
Sheet1.Cells(12, 11).Value = B碾压
Sheet1.Cells(13, 11).Value = B抵抗
End Sub
Sub 随机生成等级A()
Call 属性索引
'===========数值类属性==========
A大生命 = Int(A常量 * (60 + Rnd() * 40))
A小生命 = A大生命
A小攻击 = Int(A常量 * (8 + Rnd() * 4))
A大攻击 = Int(A常量 * (13 + Rnd() * 7))
A间隔 = Int(50 + Rnd() * 50)
'===========概率类属性==========
A防御 = Int(A常量 * (1.5 + Rnd() * 17))
A命中 = Int(Rnd() * 60)
A躲闪 = Int(2 + Rnd() * 58)
A暴击 = Int(2 + Rnd() * 58)
A韧性 = Int(Rnd() * 60)
A格档 = Int(Rnd() * 60)
A穿透 = Int(Rnd() * 60)
'===========显示用1==========
'=====(已经提到公用区)
'===========显示用2==========
Sheet1.Cells(15, 4).Value = A小生命
Sheet1.Cells(15, 5).Value = A大生命
'===========显示用3==========
Sheet1.Cells(17, 4).Value = A小攻击
Sheet1.Cells(17, 5).Value = A大攻击
'===========显示用4==========
Sheet1.Cells(18, 5).Value = A间隔
Sheet1.Cells(19, 5).Value = A防御
'===========显示用5==========
Sheet1.Cells(20, 5).Value = A命中
Sheet1.Cells(21, 5).Value = A躲闪
Sheet1.Cells(22, 5).Value = A暴击
Sheet1.Cells(23, 5).Value = A韧性
Sheet1.Cells(24, 5).Value = A格档
Sheet1.Cells(25, 5).Value = A穿透
End Sub
Sub 随机生成等级B()
Call 属性索引
'===========数值类属性==========
B大生命 = Int(B常量 * (60 + Rnd() * 40))
B小生命 = B大生命
B小攻击 = Int(B常量 * (8 + Rnd() * 4))
B大攻击 = Int(B常量 * (13 + Rnd() * 7))
B间隔 = Int(50 + Rnd() * 50)
'===========概率类属性==========
B防御 = Int(B常量 * (1.5 + Rnd() * 17))
B命中 = Int(Rnd() * 60)
B躲闪 = Int(2 + Rnd() * 58)
B暴击 = Int(2 + Rnd() * 58)
B韧性 = Int(Rnd() * 60)
B格档 = Int(Rnd() * 60)
B穿透 = Int(Rnd() * 60)
'===========显示用1==========
'=====(已经提到公用区)
'===========显示用2==========
Sheet1.Cells(15, 10).Value = B小生命
Sheet1.Cells(15, 11).Value = B大生命
'===========显示用3==========
Sheet1.Cells(17, 10).Value = B小攻击
Sheet1.Cells(17, 11).Value = B大攻击
'===========显示用4==========
Sheet1.Cells(18, 11).Value = B间隔
Sheet1.Cells(19, 11).Value = B防御
'===========显示用5==========
Sheet1.Cells(20, 11).Value = B命中
Sheet1.Cells(21, 11).Value = B躲闪
Sheet1.Cells(22, 11).Value = B暴击
Sheet1.Cells(23, 11).Value = B韧性
Sheet1.Cells(24, 11).Value = B格档
Sheet1.Cells(25, 11).Value = B穿透
End Sub
Sub 开始模拟战斗()                         '这个是主函数!!
'===============初始操作(初始化)===============
Sheet1.Cells(15, 4).Value = Sheet1.Cells(15, 5).Value           '把当前HP同步为最大HP
Sheet1.Cells(15, 10).Value = Sheet1.Cells(15, 11).Value
Call 初始化属性
'=========100毫秒时,300回合是300秒,300毫秒时,100回合是300秒===============
战斗时间 = 33 * 100 * 4                     '1回合*100倍数*4步读条,因为100倍是50~100之间的数,理论如果双方都100间隔,则可以持续100回合(因为这里*4了,所以下面的刷新显示的循环次数也要*4的)
'#########战斗时间改成33回合,延迟毫秒改成300毫秒,显示时间改成99秒#########
A间隔累加 = A间隔                          '初始化默认值
B间隔累加 = B间隔
Call 概率索引
'===============循环开始===============
For i = 1 To 战斗时间
Call 显示时间
'===============主操作(攻击判定)===============
If i = A间隔累加 Then                      'i从1开始,间隔累加从1个间隔开始,上面有初始化
A间隔累加 = A间隔累加 + A间隔
Call A操作
End If
If i = B间隔累加 Then
B间隔累加 = B间隔累加 + B间隔
Call B操作
End If
'===============显示操作(显示刷新)===============
Call 冒数
Call 血条
If i Mod 40 = 0 Then          '调整速度,每循环多少次,延迟多少毫秒,假如1000毫秒刷新显示1下,如果判断的循环次数是100次,那么每循环100次的迟延是10毫秒(下面一行说明为了表达读条,乘了个4倍关系)
'============100毫秒时,1回合是1秒,300毫秒时,1回合是3秒==============
Sleep (300)                   '如果上所述,为了节省效率,如果是每循环10次,延迟100毫秒,也可以达到1000毫秒刷新显示一下的目的,但由于上面的循环有个4倍的关系,所以在循环次数上变成了40次
'#########战斗时间改成33回合,延迟毫秒改成300毫秒,显示时间改成99秒#########
End If                        '如果需要把每次刷新显示的时间拉长,则把100毫秒的延迟改成300毫秒,那么就相当于(攻击间隔是100的玩家)每循环400次,表现为3000毫秒的时间
Next
End Sub
Sub 显示时间()
Sheet1.Cells(4, 7).Value = Int(i / 100 / 4 * 3)       '把循环次数还原成回合数,这里1回合(循环400次)的时间大约为1000毫秒
'#########战斗时间改成33回合,延迟毫秒改成300毫秒,显示时间改成99秒,最后*3了#########
End Sub
Sub A操作()
Select Case A间隔累加 / A间隔 Mod 4           '因为上面*4倍了,所以每次间隔是1/4读条,每4次间隔是读完1个条+攻击1次
Case 1                                        '读1/4条
Sheet1.Cells(10, 4).Interior.ColorIndex = 30
Sheet1.Cells(10, 5).Interior.ColorIndex = 2
Sheet1.Cells(10, 6).Interior.ColorIndex = 2
Sheet1.Cells(10, 7).Interior.ColorIndex = 2
Case 2                                       '读2/4条
Sheet1.Cells(10, 4).Interior.ColorIndex = 45
Sheet1.Cells(10, 5).Interior.ColorIndex = 45
Sheet1.Cells(10, 6).Interior.ColorIndex = 2
Sheet1.Cells(10, 7).Interior.ColorIndex = 2
Case 3                                        '读3/4条
Sheet1.Cells(10, 4).Interior.ColorIndex = 4
Sheet1.Cells(10, 5).Interior.ColorIndex = 4
Sheet1.Cells(10, 6).Interior.ColorIndex = 4
Sheet1.Cells(10, 7).Interior.ColorIndex = 2
Case 0                                        '读4/4/条
Sheet1.Cells(10, 4).Interior.ColorIndex = 33
Sheet1.Cells(10, 5).Interior.ColorIndex = 33
Sheet1.Cells(10, 6).Interior.ColorIndex = 33
Sheet1.Cells(10, 7).Interior.ColorIndex = 33
'==================计算攻击判定的概率================
Select Case Rnd() * (A攻击的碾压 + A攻击的抵抗 + A攻击的普通攻击 + A攻击的未命中 + A攻击的暴击 + A攻击的格挡)       '圆桌方式的攻击判定
Case 0 To A攻击的碾压 - 1
A攻击判定 = 常量碾压                          '这是常量,常量碾压=1,常量抵抗=2,常量普通攻击=3,常量未命中=4,常量暴击=5,常量格挡=6
Case A攻击的碾压 To A攻击的碾压 + A攻击的抵抗 - 1
A攻击判定 = 常量抵抗
Case A攻击的碾压 + A攻击的抵抗 To A攻击的碾压 + A攻击的抵抗 + A攻击的普通攻击 - 1
A攻击判定 = 常量普通攻击
Case A攻击的碾压 + A攻击的抵抗 + A攻击的普通攻击 To A攻击的碾压 + A攻击的抵抗 + A攻击的普通攻击 + A攻击的未命中 - 1
A攻击判定 = 常量未命中
Case A攻击的碾压 + A攻击的抵抗 + A攻击的普通攻击 + A攻击的未命中 To A攻击的碾压 + A攻击的抵抗 + A攻击的普通攻击 + A攻击的未命中 + A攻击的暴击 - 1
A攻击判定 = 常量暴击
Case A攻击的碾压 + A攻击的抵抗 + A攻击的普通攻击 + A攻击的未命中 + A攻击的暴击 To A攻击的碾压 + A攻击的抵抗 + A攻击的普通攻击 + A攻击的未命中 + A攻击的暴击 + A攻击的格挡 - 1
A攻击判定 = 常量格挡
End Select
'==================计算攻击判定的伤害================
A最小伤害 = A小攻击 * A小攻击 / (A小攻击 + B防御)
A最大伤害 = A大攻击 * A大攻击 / (A大攻击 + B防御)
A伤害 = Rnd() * (A最大伤害 - A最小伤害) + A最小伤害
Select Case A攻击判定
Case 1
A判定伤害 = Application.WorksheetFunction.Ceiling(A伤害 * 2, 1)
Case 2
A判定伤害 = Application.WorksheetFunction.Ceiling(A伤害 * 0.5, 1)
Case 3
A判定伤害 = Application.WorksheetFunction.Ceiling(A伤害 * 1, 1)
Case 4
A判定伤害 = Application.WorksheetFunction.Ceiling(A伤害 * 0, 1)
Case 5
A判定伤害 = Application.WorksheetFunction.Ceiling(A伤害 * 2, 1)
Case 6
A判定伤害 = Application.WorksheetFunction.Ceiling(A伤害 * 0.5, 1)
End Select
'==================HP变化=========================
B小生命 = B小生命 - A判定伤害
'==================冒数和滚屏=========================
Sheet1.Cells(8, 7).Value = A判定伤害            '初始冒数
Call 滚屏操作                                   '先滚屏,后初始滚屏行
Select Case A攻击判定                           '初始滚屏,胜利信息在HP上判断
Case 1
Sheet1.Cells(25, 6).Value = "A攻击B造成了[[碾压]]" & A判定伤害 & "点伤害"
Case 2
Sheet1.Cells(25, 6).Value = "A攻击B造成了[[抵抗]]" & A判定伤害 & "点伤害"
Case 3
Sheet1.Cells(25, 6).Value = "A攻击B造成了[[普通攻击]]" & A判定伤害 & "点伤害"
Case 4
Sheet1.Cells(25, 6).Value = "A攻击B造成了[[未命中]]" & A判定伤害 & "点伤害"
Case 5
Sheet1.Cells(25, 6).Value = "A攻击B造成了[[暴击]]" & A判定伤害 & "点伤害"
Case 6
Sheet1.Cells(25, 6).Value = "A攻击B造成了[[格挡]]" & A判定伤害 & "点伤害"
End Select
End Select
End Sub
Sub B操作()
Select Case B间隔累加 / B间隔 Mod 4           '因为上面*4倍了,所以每次间隔是1/4读条,每4次间隔是读完1个条+攻击1次
'#########可以改成5/5读条,有1段读条表示全条等于空白,但需要上面时间也*5#########
Case 1                                        '读1/4条
Sheet1.Cells(10, 11).Interior.ColorIndex = 30
Sheet1.Cells(10, 10).Interior.ColorIndex = 2
Sheet1.Cells(10, 9).Interior.ColorIndex = 2
Sheet1.Cells(10, 8).Interior.ColorIndex = 2
Case 2                                       '读2/4条
Sheet1.Cells(10, 11).Interior.ColorIndex = 45
Sheet1.Cells(10, 10).Interior.ColorIndex = 45
Sheet1.Cells(10, 9).Interior.ColorIndex = 2
Sheet1.Cells(10, 8).Interior.ColorIndex = 2
Case 3                                        '读3/4条
Sheet1.Cells(10, 11).Interior.ColorIndex = 4
Sheet1.Cells(10, 10).Interior.ColorIndex = 4
Sheet1.Cells(10, 9).Interior.ColorIndex = 4
Sheet1.Cells(10, 8).Interior.ColorIndex = 2
Case 0                                        '读4/4/条
Sheet1.Cells(10, 11).Interior.ColorIndex = 33
Sheet1.Cells(10, 10).Interior.ColorIndex = 33
Sheet1.Cells(10, 9).Interior.ColorIndex = 33
Sheet1.Cells(10, 8).Interior.ColorIndex = 33
'==================计算攻击判定的概率================
Select Case Rnd() * (B攻击的碾压 + B攻击的抵抗 + B攻击的普通攻击 + B攻击的未命中 + B攻击的暴击 + B攻击的格挡)       '圆桌方式的攻击判定
Case 0 To B攻击的碾压 - 1
B攻击判定 = 常量碾压                          '这是常量,常量碾压=1,常量抵抗=2,常量普通攻击=3,常量未命中=4,常量暴击=5,常量格挡=6
Case B攻击的碾压 To B攻击的碾压 + B攻击的抵抗 - 1
B攻击判定 = 常量抵抗
Case B攻击的碾压 + B攻击的抵抗 To B攻击的碾压 + B攻击的抵抗 + B攻击的普通攻击 - 1
B攻击判定 = 常量普通攻击
Case B攻击的碾压 + B攻击的抵抗 + B攻击的普通攻击 To B攻击的碾压 + B攻击的抵抗 + B攻击的普通攻击 + B攻击的未命中 - 1
B攻击判定 = 常量未命中
Case B攻击的碾压 + B攻击的抵抗 + B攻击的普通攻击 + B攻击的未命中 To B攻击的碾压 + B攻击的抵抗 + B攻击的普通攻击 + B攻击的未命中 + B攻击的暴击 - 1
B攻击判定 = 常量暴击
Case B攻击的碾压 + B攻击的抵抗 + B攻击的普通攻击 + B攻击的未命中 + B攻击的暴击 To B攻击的碾压 + B攻击的抵抗 + B攻击的普通攻击 + B攻击的未命中 + B攻击的暴击 + B攻击的格挡 - 1
B攻击判定 = 常量格挡
End Select
'==================计算攻击判定的伤害================
B最小伤害 = B小攻击 * B小攻击 / (B小攻击 + B防御)
B最大伤害 = B大攻击 * B大攻击 / (B大攻击 + B防御)
B伤害 = Rnd() * (B最大伤害 - B最小伤害) + B最小伤害
Select Case B攻击判定
Case 1
B判定伤害 = Application.WorksheetFunction.Ceiling(B伤害 * 2, 1)
Case 2
B判定伤害 = Application.WorksheetFunction.Ceiling(B伤害 * 0.5, 1)
Case 3
B判定伤害 = Application.WorksheetFunction.Ceiling(B伤害 * 1, 1)
Case 4
B判定伤害 = Application.WorksheetFunction.Ceiling(B伤害 * 0, 1)
Case 5
B判定伤害 = Application.WorksheetFunction.Ceiling(B伤害 * 2, 1)
Case 6
B判定伤害 = Application.WorksheetFunction.Ceiling(B伤害 * 0.5, 1)
End Select
'==================HP变化=========================
A小生命 = A小生命 - B判定伤害
'==================冒数和滚屏=========================
Sheet1.Cells(8, 8).Value = B判定伤害            '初始冒数
Call 滚屏操作                                   '先滚屏,后初始滚屏行
Select Case B攻击判定                           '初始滚屏,胜利信息在HP上判断
Case 1
Sheet1.Cells(25, 6).Value = "B攻击A造成了[[碾压]]" & B判定伤害 & "点伤害"
Case 2
Sheet1.Cells(25, 6).Value = "B攻击A造成了[[抵抗]]" & B判定伤害 & "点伤害"
Case 3
Sheet1.Cells(25, 6).Value = "B攻击A造成了[[普通攻击]]" & B判定伤害 & "点伤害"
Case 4
Sheet1.Cells(25, 6).Value = "B攻击A造成了[[未命中]]" & B判定伤害 & "点伤害"
Case 5
Sheet1.Cells(25, 6).Value = "B攻击A造成了[[暴击]]" & B判定伤害 & "点伤害"
Case 6
Sheet1.Cells(25, 6).Value = "B攻击A造成了[[格挡]]" & B判定伤害 & "点伤害"
End Select
End Select
End Sub
Sub 冒数()
If i Mod 40 = 0 Then                '40次循环约为100毫秒(因为上面判断延迟是40次,所以这里只能是40的倍数)
'===============A部分==================
If Sheet1.Cells(5, 7).Value <> "" Then
Sheet1.Cells(5, 7).Value = ""
ElseIf Sheet1.Cells(6, 7).Value <> "" Then
Sheet1.Cells(5, 7).Value = Sheet1.Cells(6, 7).Value
Sheet1.Cells(6, 7).Value = ""
ElseIf Sheet1.Cells(7, 7).Value <> "" Then
Sheet1.Cells(6, 7).Value = Sheet1.Cells(7, 7).Value
Sheet1.Cells(7, 7).Value = ""
ElseIf Sheet1.Cells(8, 7).Value <> "" Then
Sheet1.Cells(7, 7).Value = Sheet1.Cells(8, 7).Value
Sheet1.Cells(8, 7).Value = ""
End If
'===============B部分==================
If Sheet1.Cells(5, 8).Value <> "" Then
Sheet1.Cells(5, 8).Value = ""
ElseIf Sheet1.Cells(6, 8).Value <> "" Then
Sheet1.Cells(5, 8).Value = Sheet1.Cells(6, 8).Value
Sheet1.Cells(6, 8).Value = ""
ElseIf Sheet1.Cells(7, 8).Value <> "" Then
Sheet1.Cells(6, 8).Value = Sheet1.Cells(7, 8).Value
Sheet1.Cells(7, 8).Value = ""
ElseIf Sheet1.Cells(8, 8).Value <> "" Then
Sheet1.Cells(7, 8).Value = Sheet1.Cells(8, 8).Value
Sheet1.Cells(8, 8).Value = ""
End If
End If
End Sub
Sub 血条()
'================监视HP值变化(时时更新血条显示)===========
Sheet1.Cells(15, 4).Value = Application.WorksheetFunction.Max(A小生命, 0)           '取值范围0~MAX
Sheet1.Cells(15, 10).Value = Application.WorksheetFunction.Max(B小生命, 0)
Select Case A小生命 / A大生命 * 100
Case 81 To 100
Sheet1.Cells(9, 4).Interior.ColorIndex = 3
Sheet1.Cells(9, 5).Interior.ColorIndex = 3
Sheet1.Cells(9, 6).Interior.ColorIndex = 3
Sheet1.Cells(9, 7).Interior.ColorIndex = 3
Case 61 To 80
Sheet1.Cells(9, 4).Interior.ColorIndex = 3
Sheet1.Cells(9, 5).Interior.ColorIndex = 3
Sheet1.Cells(9, 6).Interior.ColorIndex = 3
Sheet1.Cells(9, 7).Interior.ColorIndex = 56
Case 41 To 60
Sheet1.Cells(9, 4).Interior.ColorIndex = 3
Sheet1.Cells(9, 5).Interior.ColorIndex = 3
Sheet1.Cells(9, 6).Interior.ColorIndex = 56
Sheet1.Cells(9, 7).Interior.ColorIndex = 56
Case 21 To 40
Sheet1.Cells(9, 4).Interior.ColorIndex = 3
Sheet1.Cells(9, 5).Interior.ColorIndex = 56
Sheet1.Cells(9, 6).Interior.ColorIndex = 56
Sheet1.Cells(9, 7).Interior.ColorIndex = 56
Case 0 To 20
Sheet1.Cells(9, 4).Interior.ColorIndex = 56
Sheet1.Cells(9, 5).Interior.ColorIndex = 56
Sheet1.Cells(9, 6).Interior.ColorIndex = 56
Sheet1.Cells(9, 7).Interior.ColorIndex = 56
End SelectSelect Case B小生命 / B大生命 * 100
Case 81 To 100
Sheet1.Cells(9, 11).Interior.ColorIndex = 3
Sheet1.Cells(9, 10).Interior.ColorIndex = 3
Sheet1.Cells(9, 9).Interior.ColorIndex = 3
Sheet1.Cells(9, 8).Interior.ColorIndex = 3
Case 61 To 80
Sheet1.Cells(9, 11).Interior.ColorIndex = 3
Sheet1.Cells(9, 10).Interior.ColorIndex = 3
Sheet1.Cells(9, 9).Interior.ColorIndex = 3
Sheet1.Cells(9, 8).Interior.ColorIndex = 56
Case 41 To 60
Sheet1.Cells(9, 11).Interior.ColorIndex = 3
Sheet1.Cells(9, 10).Interior.ColorIndex = 3
Sheet1.Cells(9, 9).Interior.ColorIndex = 56
Sheet1.Cells(9, 8).Interior.ColorIndex = 56
Case 21 To 40
Sheet1.Cells(9, 11).Interior.ColorIndex = 3
Sheet1.Cells(9, 10).Interior.ColorIndex = 56
Sheet1.Cells(9, 9).Interior.ColorIndex = 56
Sheet1.Cells(9, 8).Interior.ColorIndex = 56
Case 0 To 20
Sheet1.Cells(9, 11).Interior.ColorIndex = 56
Sheet1.Cells(9, 10).Interior.ColorIndex = 56
Sheet1.Cells(9, 9).Interior.ColorIndex = 56
Sheet1.Cells(9, 8).Interior.ColorIndex = 56
End Select
'================屏幕信息(开始战斗和结束战斗提示)===========
If i = 1 Then                               '提示开始战斗
Call 滚屏操作
Sheet1.Cells(25, 6).Value = "###==========分割线============###"            '2次滚屏,先放个横条上去
Call 滚屏操作
Sheet1.Cells(25, 6).Value = "A和B开始了战斗"
End IfIf i = 战斗时间 Then
Sheet1.Cells(25, 6).Value = "平局"
Else
If A小生命 < 1 And B小生命 < 1 Then         '提示结束战斗
Call 滚屏操作
Sheet1.Cells(25, 6).Value = "平局"
ElseIf A小生命 < 1 Then
Call 滚屏操作
Sheet1.Cells(25, 6).Value = "B胜利"
ElseIf B小生命 < 1 Then
Call 滚屏操作
Sheet1.Cells(25, 6).Value = "A胜利"
End If
End If
'================弹出窗口(显示胜负,退出循环)===========
If i = 战斗时间 Then
Response = MsgBox("平局", , "战斗结束")
Else
If A小生命 < 1 And B小生命 < 1 Then         '退出循环,弹出窗口
i = 战斗时间                                     '用于退出循环
Response = MsgBox("平局", , "战斗结束")
ElseIf A小生命 < 1 Then
i = 战斗时间
Response = MsgBox("B胜利", , "战斗结束")
ElseIf B小生命 < 1 Then
i = 战斗时间
Response = MsgBox("A胜利", , "战斗结束")
End If
End If
End Sub
Sub 概率索引()
'===============A部分==================
A攻击的碾压 = A碾压
A攻击的抵抗 = B抵抗
A攻击的普通攻击 = 30
A攻击的未命中 = Application.WorksheetFunction.Median(2, B躲闪 - A命中, 60)              '取值范围2~60
A攻击的暴击 = Application.WorksheetFunction.Median(2, A暴击 - B韧性, 60)                '取值范围2~60
A攻击的格挡 = Application.WorksheetFunction.Median(0, B格档 - A穿透, 60)                '取值范围0~60
'===============B部分==================
B攻击的碾压 = B碾压
B攻击的抵抗 = A抵抗
B攻击的普通攻击 = 30
B攻击的未命中 = Application.WorksheetFunction.Median(2, A躲闪 - B命中, 60)              '取值范围2~60
B攻击的暴击 = Application.WorksheetFunction.Median(2, B暴击 - A韧性, 60)                '取值范围2~60
B攻击的格挡 = Application.WorksheetFunction.Median(0, A格档 - B穿透, 60)                '取值范围0~60
End Sub
Sub 滚屏操作()
Sheet1.Cells(11, 6).Value = Sheet1.Cells(12, 6).Value
Sheet1.Cells(12, 6).Value = Sheet1.Cells(13, 6).Value
Sheet1.Cells(13, 6).Value = Sheet1.Cells(14, 6).Value
Sheet1.Cells(14, 6).Value = Sheet1.Cells(15, 6).Value
Sheet1.Cells(15, 6).Value = Sheet1.Cells(16, 6).Value
Sheet1.Cells(16, 6).Value = Sheet1.Cells(17, 6).Value
Sheet1.Cells(17, 6).Value = Sheet1.Cells(18, 6).Value
Sheet1.Cells(18, 6).Value = Sheet1.Cells(19, 6).Value
Sheet1.Cells(19, 6).Value = Sheet1.Cells(20, 6).Value
Sheet1.Cells(20, 6).Value = Sheet1.Cells(21, 6).Value
Sheet1.Cells(21, 6).Value = Sheet1.Cells(22, 6).Value
Sheet1.Cells(22, 6).Value = Sheet1.Cells(23, 6).Value
Sheet1.Cells(23, 6).Value = Sheet1.Cells(24, 6).Value
Sheet1.Cells(24, 6).Value = Sheet1.Cells(25, 6).Value
End Sub
Sub 初始化属性()
'===========A的属性==========
A等级 = Sheet1.Cells(11, 5).Value
A碾压 = Sheet1.Cells(12, 5).Value
A抵抗 = Sheet1.Cells(13, 5).Value
A小生命 = Sheet1.Cells(15, 4).Value
A大生命 = Sheet1.Cells(15, 5).Value
A小攻击 = Sheet1.Cells(17, 4).Value
A大攻击 = Sheet1.Cells(17, 5).Value
A间隔 = Sheet1.Cells(18, 5).Value
A防御 = Sheet1.Cells(19, 5).Value
A命中 = Sheet1.Cells(20, 5).Value
A躲闪 = Sheet1.Cells(21, 5).Value
A暴击 = Sheet1.Cells(22, 5).Value
A韧性 = Sheet1.Cells(23, 5).Value
A格档 = Sheet1.Cells(24, 5).Value
A穿透 = Sheet1.Cells(25, 5).Value
'===========B的属性==========
B等级 = Sheet1.Cells(11, 11).Value
B碾压 = Sheet1.Cells(12, 11).Value
B抵抗 = Sheet1.Cells(13, 11).Value
B小生命 = Sheet1.Cells(15, 10).Value
B大生命 = Sheet1.Cells(15, 11).Value
B小攻击 = Sheet1.Cells(17, 10).Value
B大攻击 = Sheet1.Cells(17, 11).Value
B间隔 = Sheet1.Cells(18, 11).Value
B防御 = Sheet1.Cells(19, 11).Value
B命中 = Sheet1.Cells(20, 11).Value
B躲闪 = Sheet1.Cells(21, 11).Value
B暴击 = Sheet1.Cells(22, 11).Value
B韧性 = Sheet1.Cells(23, 11).Value
B格档 = Sheet1.Cells(24, 11).Value
B穿透 = Sheet1.Cells(25, 11).Value
'===========常量的属性==========
常量碾压 = 1
常量抵抗 = 2
常量普通攻击 = 3
常量未命中 = 4
常量暴击 = 5
常量格挡 = 6
End Sub
好了全部代码都在这里了,宏相比其他语言来说还是比较简单,易读的,不过书写过程中,对c语系的小伙伴会稍显别扭(不过大学里面B语系也应该都学了),了解了这个最基本的最简单的打架机器人编写,大家就可以开动脑筋制作自己工作需要的功能强大的项目专用打架机器人了。
下载地址
好了,这一篇就到这里。

用工具测试游戏的平衡性-简单的打架机器人编写相关推荐

  1. 使用浏览器开发工具测试网站可访问性的七种方法

    前言 有很多方法可以测试你的网站是否具有可访问性.服务.软件包,甚至是人工测试公司.他们都有自己的位置,通常最好是对真实的人进行测试.然而,对于一个快速的初步测试,你无需安装任何东西或支付服务费用.浏 ...

  2. LeetCode 04检查平衡性-简单

    实现一个函数,检查二叉树是否平衡.在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 1. 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 3/ \9 20 ...

  3. 关于游戏平衡性——王者荣耀英雄伤害数值参考

    收集王者荣耀各个英雄的装备对技能增加的百分比,这样的主要目的为保证游戏的平衡性.对于技能主要包括:血量.物理攻击.法术攻击.物理穿透.法术穿透.暴击等.关于各个装备,已经列成一张excel表格,在这里 ...

  4. 《全景探秘游戏设计艺术》精华 用户体验 游戏平衡性

    <全景探秘游戏设计艺术>精华 用户体验 游戏平衡性 一本很好的游戏设计书籍,暂时关注的是用户体验部分,比如,用户喜欢什么,什么可以带来乐趣,以及游戏的平衡性 男性与女性的区别 男性喜欢的游 ...

  5. 魔兽争霸3 1.25补丁上线测试,平衡性有了很大调整

    >>官方原帖地址 魔兽争霸1.25测试补丁修改内容一览 平衡性修改 人族 -防御塔的护甲模式从重甲恢复为城甲: -攻城坦克的单位等级从2级提升到3级:(经验增加) -火枪手的生命值从505 ...

  6. 对魔兽攻击伤害算法及平衡性的研究

    内容摘要: ◆ 星际的攻击伤害算法回顾 ◆ 魔兽3的攻击伤害算法回顾 ◆ WOW的伤害算法解析(含卡服原因推测) 在阅读本文前,我强烈建议您先看一看我之前的一篇文章基础理论:对火星算法的研究,这会让您 ...

  7. 战歌竞技场服务器维护中,战歌竞技场版本更新预告 战歌竞技场平衡性调整内容...

    各位棋手大大: <战歌竞技场>上线以来,收到了大量的反馈,针对大家较为集中反馈的平衡性问题,我们结合了海量数据进行验证,将持续对游戏平衡性进行优化.我们将于5月21日迎来国服上线后首次平衡 ...

  8. 三维星座图查询_微信我的三维星座图测试游戏

    微信我的三维星座图测试游戏是一款简单画风打造的模拟测试类的手机游戏,玩家将通过系统给出的几个答题来选择你心中所向,不同的答题会带来不同的结果,深思熟虑享受这个测试的过程,简单的点击屏幕完成一场充满惊喜 ...

  9. 【Unity新闻】Unity新工具Metric Validation帮你自动化测试游戏平衡性

    洪流学堂,让你快人几步. 我们一起看看上周Unity有什么大事情发生吧! Unity性能优化团队最新进展 大约两年前,Unity组建了一支专门的优化团队,专注于将性能本身作为一项功能.团队的任务很简单 ...

最新文章

  1. 2015计算机硕士考研非统考的学校,2015考研计算机专业统考非统考学校统计
  2. 75道常见AI面试题,看看你的知识盲点在哪?(附解析)
  3. GFStableList Adapter
  4. DataTables选择多行
  5. [ARM-assembly]-ARMV8的exclusive和inexclusive的介绍
  6. opencv在python环境下的安装_关于python环境下的opencv安装
  7. Github:深度学习文本检测识别(OCR)精选资源汇总
  8. 修改npm安装的全局路径和配置环境变量的坑
  9. QT5.10+MinGW+OpenCV3.4.2编译
  10. 使用Swagger辅助开发Fabric Application的Web API
  11. 索要ValidateTextBox控件Source Code的朋友rickel****@gmail.com,邮件退回了。各位,与我通信,请不要使用GMAIL,烦。...
  12. terminator安装
  13. 在vs2005调试asp程序
  14. 重启tomcat-Tomcat服务器怎么重启?
  15. 中职计算机ps公开课教案,全国“xx杯”计算机类说课大赛课件一等奖作品:《利用PS蒙版制作照片的蒙太奇效果》教学设计.doc...
  16. 软件定义存储正当时 厂商纷纷争抢一杯羹
  17. 面向预测的时空数据学习方法分析
  18. 【翻译】案例研究:Slite如何利用谷歌云建立先进的GitOps实践
  19. 戴尔将为奔驰多款车型设计专业的车载智能系统
  20. JavaScript一些优雅小技巧不得不知

热门文章

  1. JDK1.6.0新特性详解与代码示例 - 徐明明的博客 - CSDNBlog
  2. 步科ET070不能启动
  3. linux中如何压缩单个文件大小,Linux 将文件打包、压缩并分割成指定大小
  4. ERC-777 和风险缓解
  5. 保加利亚的IT专家在公开展示幼儿园软件漏洞后被捕
  6. 华为OD机试题 - 绘图机器(JavaScript)| 机考必刷
  7. Fortran笔记,文件,part1-文件读取的概念、基本操作
  8. KubeSphere使用rbd-csi创建快照
  9. 精选几个高能神器分享,速度收藏了!
  10. 智慧城市利用物联网技术解决的四大示例!--甲由科技