打架机器人这种东东,一般都是在游戏开发过程中测试用的东西,对于策划圈外的人士接触到这个东西的人很少,不像前面的原型库工具那样,其他行业只要是演示都可以使用,打架机器人的运用频率就少了很多,而且网游里面服务器的一般直接有专门的测试脚本框架,所以正常游戏换皮开发过程中,打架机器人也不是必须的,不过对于一些开发中的游戏来说,尤其游戏公司以前没有一套成熟的游戏数值模型系统的公司,打架机器人有时可以减少很多开发过程中的工作量,好了,我们看看开发这个东西需要什么东东。
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 Select
Select 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 If
If 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语系也应该都学了),了解了这个最基本的最简单的打架机器人编写,大家就可以开动脑筋制作自己工作需要的功能强大的项目专用打架机器人了。
好了,这一篇就到这里。