|
RPG回合战斗模型 一直想用宏写一套RPG战斗模拟,前不久抽空写一下。
(战斗日志)
(装备洗炼)
以下是战斗相关的宏:
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public log1
Sub 战斗计算()
'获取属性----------------------------
g_hp_max = Sheets("PVP战斗模拟").Cells(8, 6) '最大生命
g_r = 18
g_Physical_damage_max = Sheets("PVP战斗模拟").Cells(g_r, 6) '最大物理伤害
g_r = g_r + 1
'g_Physical_damage_min = Sheets("PVP战斗模拟").Cells(g_r, 6) '最小物理伤害---取消
'g_r = g_r + 1
g_Magic_damage_max = Sheets("PVP战斗模拟").Cells(g_r, 6) '法术伤害(最大)
g_r = g_r + 1
'g_Magic_damage_min = Sheets("PVP战斗模拟").Cells(g_r, 6) '法术伤害(最小)---取消
'g_r = g_r + 1
g_Physical_defense = Sheets("PVP战斗模拟").Cells(g_r, 6) '物理防御
g_r = g_r + 1
g_Magic_defense = Sheets("PVP战斗模拟").Cells(g_r, 6) '法术防御
g_r = g_r + 1
g_Crit = Sheets("PVP战斗模拟").Cells(g_r, 6) '暴击
g_r = g_r + 1
g_Toughness = Sheets("PVP战斗模拟").Cells(g_r, 6) '韧性
g_r = g_r + 1
g_Bash = Sheets("PVP战斗模拟").Cells(g_r, 6) '重击
g_r = g_r + 1
g_Block = Sheets("PVP战斗模拟").Cells(g_r, 6) '招架
g_r = g_r + 1
g_Precision = Sheets("PVP战斗模拟").Cells(g_r, 6) '精准
g_r = g_r + 1
g_Hit = Sheets("PVP战斗模拟").Cells(g_r, 6) '命中
g_r = g_r + 1
g_Dodge = Sheets("PVP战斗模拟").Cells(g_r, 6) '躲闪
g_r = g_r + 1
g_Strength = Sheets("PVP战斗模拟").Cells(g_r, 6) '强度
s_hp_max = Sheets("PVP战斗模拟").Cells(8, 10) '最大生命
s_r = 18
s_Physical_damage_max = Sheets("PVP战斗模拟").Cells(s_r, 10) '最大物理伤害
s_r = s_r + 1
's_Physical_damage_min = Sheets("PVP战斗模拟").Cells(s_r, 10) '最小物理伤害---取消
's_r = s_r + 1
s_Magic_damage_max = Sheets("PVP战斗模拟").Cells(s_r, 10) '法术伤害(最大)
s_r = s_r + 1
's_Magic_damage_min = Sheets("PVP战斗模拟").Cells(s_r, 10) '法术伤害(最小)---取消
's_r = s_r + 1
s_Physical_defense = Sheets("PVP战斗模拟").Cells(s_r, 10) '物理防御
s_r = s_r + 1
s_Magic_defense = Sheets("PVP战斗模拟").Cells(s_r, 10) '法术防御
s_r = s_r + 1
s_Crit = Sheets("PVP战斗模拟").Cells(s_r, 10) '暴击
s_r = s_r + 1
s_Toughness = Sheets("PVP战斗模拟").Cells(s_r, 10) '韧性
s_r = s_r + 1
s_Bash = Sheets("PVP战斗模拟").Cells(s_r, 10) '重击
s_r = s_r + 1
s_Block = Sheets("PVP战斗模拟").Cells(s_r, 10) '招架
s_r = s_r + 1
s_Precision = Sheets("PVP战斗模拟").Cells(s_r, 10) '精准
s_r = s_r + 1
s_Hit = Sheets("PVP战斗模拟").Cells(s_r, 10) '命中
s_r = s_r + 1
s_Dodge = Sheets("PVP战斗模拟").Cells(s_r, 10) '躲闪
s_r = s_r + 1
s_Strength = Sheets("PVP战斗模拟").Cells(s_r, 10) '强度
g_hp = g_hp_max
s_hp = s_hp_max
g2s_dmg = 0
s2g_dmg = 0
'我方暴击率=min(max((我方暴击-对方韧性)/5000,5%),50%)
'我方格挡率=min(max((我方格挡-对方精准)/5000,5%),50%)
'我方闪避率=min(max((我方闪避-对方命中)/5000,5%),50%)
g_crit_rate = Application.WorksheetFunction.Min(Application.WorksheetFunction.Max((g_Crit - s_Toughness) / 13200, 0.05), 0.75) 'g出手时,g的暴击率
g_Block_rate = Application.WorksheetFunction.Min(Application.WorksheetFunction.Max((g_Block - s_Precision) / 13200, 0.05), 0.75) 's出手时,g的格挡率
g_Dodge_rate = Application.WorksheetFunction.Min(Application.WorksheetFunction.Max((g_Dodge - s_Hit) / 13200, 0.05), 0.75) 's出手时,g的闪避率
s_crit_rate = Application.WorksheetFunction.Min(Application.WorksheetFunction.Max((s_Crit - g_Toughness) / 13200, 0.05), 0.75) 's出手时,s的暴击率
s_Block_rate = Application.WorksheetFunction.Min(Application.WorksheetFunction.Max((s_Block - g_Precision) / 13200, 0.05), 0.75) 'g出手时,s的格挡率
s_Dodge_rate = Application.WorksheetFunction.Min(Application.WorksheetFunction.Max((s_Dodge - g_Hit) / 13200, 0.05), 0.75) 'g出手时,s的闪避率
'初始化血量
Sheets("PVP战斗模拟").Cells(5, 7) = g_hp
Sheets("PVP战斗模拟").Cells(5, 8) = s_hp
log1 = "战斗开始~~~"
'清除旧日志---------------------
Range("G9:H29").Select
Selection.ClearContents
'Range("A1").Select
Call 输出日志
'循环开始---------------------
For i = 1 To 300
'伤害=max(物理伤害-物理防御,物理伤害*30%)+max(魔法伤害-魔法防御,魔法伤害*30%)
'伤害浮动值=伤害*(rnd*0.2+0.9)
'Randomize (Now())
g_Physical_damage = Int(g_Physical_damage_max * (Rnd() * 0.2 + 0.9))
g_Magic_damage = Int(g_Magic_damage_max * (Rnd() * 0.2 + 0.9))
s_Physical_damage = Int(s_Physical_damage_max * (Rnd() * 0.2 + 0.9))
s_Magic_damage = Int(s_Magic_damage_max * (Rnd() * 0.2 + 0.9))
g2s_dmg = Application.WorksheetFunction.Max(g_Physical_damage - s_Physical_defense, g_Physical_damage * 0.3) + Application.WorksheetFunction.Max(g_Magic_damage - s_Magic_defense, s_Magic_defense * 0.3) '蓝方对红方的普通攻击伤害
s2g_dmg = Application.WorksheetFunction.Max(s_Physical_damage - g_Physical_defense, s_Physical_damage * 0.3) + Application.WorksheetFunction.Max(s_Magic_damage - g_Magic_defense, s_Magic_damage * 0.3) '红方对蓝方的普通攻击伤害
'判断暴击》判断格挡》判断闪避
g_crit_rate_rnd = Rnd()
s_Block_rate_rnd = Rnd()
s_Dodge_rate_rnd = Rnd()
s_crit_rate_rnd = Rnd()
g_Block_rate_rnd = Rnd()
g_Dodge_rate_rnd = Rnd()
'红方g攻击-------------------------------
'Randomize (Now())
If g_crit_rate_rnd <= g_crit_rate Then '判断暴击
g2s_dmg = Int(g2s_dmg * (1 + 0.5 + g_Bash / 5000))
log1 = "[" & i & "]红方暴击了蓝方,对蓝方造成" & g2s_dmg & "伤害"
Call 输出日志
ElseIf s_Block_rate_rnd <= s_Block_rate Then '判断招架
g2s_dmg = Int(g2s_dmg * 0.5)
log1 = "[" & i & "]蓝方招架了红方的攻击,对蓝方造成" & g2s_dmg & "伤害"
Call 输出日志
ElseIf s_Dodge_rate_rnd <= s_Dodge_rate Then '判断闪避
g2s_dmg = 0
log1 = "[" & i & "]蓝方闪避了红方的攻击,对蓝方造成" & g2s_dmg & "伤害"
Call 输出日志
Else '普通攻击
g2s_dmg = Int(g2s_dmg)
log1 = "[" & i & "]红方发起普通攻击,对蓝方造成" & g2s_dmg & "伤害"
Call 输出日志
End If
'输出守方剩余血量--------
s_hp = s_hp - g2s_dmg
If s_hp <= 0 Then
s_hp = 0
End If
Sheets("PVP战斗模拟").Cells(5, 8) = s_hp
'判断战斗是否结束-------
If g_hp <= 0 Or s_hp <= 0 Then
If g_hp < s_hp Then
log1 = "战斗结束,【蓝方】获胜"
Else
log1 = "战斗结束,【红方】获胜"
End If
Call 输出日志
Exit For
End If
'蓝方s攻击-----------------
'Randomize (Now())
If s_crit_rate_rnd <= s_crit_rate Then '判断暴击
s2g_dmg = Int(s2g_dmg * (1 + 0.5 + s_Bash / 5000))
log1 = "[" & i & "]蓝方暴击了红方,对红方造成" & s2g_dmg & "伤害"
Call 输出日志
ElseIf g_Block_rate_rnd <= g_Block_rate Then '判断格挡
s2g_dmg = Int(s2g_dmg * 0.5)
log1 = "[" & i & "]红方招架了蓝方的攻击,对红方造成" & s2g_dmg & "伤害"
Call 输出日志
ElseIf g_Dodge_rate_rnd <= g_Dodge_rate Then '判断闪避
s2g_dmg = 0
log1 = "[" & i & "]红方闪避了蓝方的攻击,对红方造成" & s2g_dmg & "伤害"
Call 输出日志
Else '普通攻击
s2g_dmg = Int(s2g_dmg)
log1 = "[" & i & "]蓝方发起普通攻击,对红方造成" & s2g_dmg & "伤害"
Call 输出日志
End If
'输出攻方剩余血量----------------------------------
g_hp = g_hp - s2g_dmg
If g_hp <= 0 Then
g_hp = 0
End If
Sheets("PVP战斗模拟").Cells(5, 7) = g_hp
'判断战斗是否结束-----------------------
If g_hp <= 0 Or s_hp <= 0 Then
If g_hp < s_hp Then
log1 = "战斗结束,【蓝方】获胜"
Else
log1 = "战斗结束,【红方】获胜"
End If
Call 输出日志
Exit For
End If
'MsgBox g_crit_rate_rnd & "," & s_Block_rate_rnd & "," & s_Dodge_rate_rnd & "," & s_crit_rate_rnd & "," & g_Block_rate_rnd & "," & g_Dodge_rate_rnd
Next i
End Sub
Sub 输出日志()
Sleep 100
n = 9
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = Sheets("PVP战斗模拟").Cells(n + 1, 7)
n = n + 1
Sheets("PVP战斗模拟").Cells(n, 7) = log1
n = n + 1
Sleep 100
Call 特定字符颜色
Sleep 100
End Sub
Public Sub 特定字符颜色()
Dim r As Range
Dim i As Integer
For Each r In Range("G9:H31")
i = 0
Do While InStr(i + 1, r.Value, "红方") > 0
i = InStr(i + 1, r.Value, "红方")
r.Select
ActiveCell.Characters(Start:=i, Length:=2).Font.Color = vbRed
Loop
Next
For Each r In Range("G9:H31")
i = 0
Do While InStr(i + 1, r.Value, "蓝方") > 0
i = InStr(i + 1, r.Value, "蓝方")
r.Select
ActiveCell.Characters(Start:=i, Length:=2).Font.Color = vbBlue
Loop
Next
End Sub
---------------------------------------------------------华丽的分割线------------------------------------------------------------
以下是洗炼相关的宏:
Public equip_row '输出的装备附加属性,武器暴击所在的行
Public equip_column '输出的装备附加属性,武器暴击所在的列
'红方装备洗炼---------------------------------------------------------------
Sub 红方武器洗炼()
equip_row = 37
equip_column = 16
Call 装备洗炼
End Sub
Sub 红方衣服洗炼()
equip_row = 38
equip_column = 16
Call 装备洗炼
End Sub
Sub 红方护腕洗炼()
equip_row = 39
equip_column = 16
Call 装备洗炼
End Sub
Sub 红方护腿洗炼()
equip_row = 40
equip_column = 16
Call 装备洗炼
End Sub
Sub 红方鞋子洗炼()
equip_row = 41
equip_column = 16
Call 装备洗炼
End Sub
Sub 红方头盔洗炼()
equip_row = 42
equip_column = 16
Call 装备洗炼
End Sub
Sub 红方项链洗炼()
equip_row = 43
equip_column = 16
Call 装备洗炼
End Sub
Sub 红方戒指洗炼()
equip_row = 44
equip_column = 16
Call 装备洗炼
End Sub
Sub 红方玉佩洗炼()
equip_row = 45
equip_column = 16
Call 装备洗炼
End Sub
Sub 红方腰带洗炼()
equip_row = 46
equip_column = 16
Call 装备洗炼
End Sub
Sub 红方装备全部洗炼()
Call 红方武器洗炼
Call 红方衣服洗炼
Call 红方护腕洗炼
Call 红方护腿洗炼
Call 红方鞋子洗炼
Call 红方头盔洗炼
Call 红方项链洗炼
Call 红方戒指洗炼
Call 红方玉佩洗炼
Call 红方腰带洗炼
End Sub
'蓝方装备洗炼---------------------------------------------------------------
Sub 蓝方武器洗炼()
equip_row = 37
equip_column = 35
Call 装备洗炼
End Sub
Sub 蓝方衣服洗炼()
equip_row = 38
equip_column = 35
Call 装备洗炼
End Sub
Sub 蓝方护腕洗炼()
equip_row = 39
equip_column = 35
Call 装备洗炼
End Sub
Sub 蓝方护腿洗炼()
equip_row = 40
equip_column = 35
Call 装备洗炼
End Sub
Sub 蓝方鞋子洗炼()
equip_row = 41
equip_column = 35
Call 装备洗炼
End Sub
Sub 蓝方头盔洗炼()
equip_row = 42
equip_column = 35
Call 装备洗炼
End Sub
Sub 蓝方项链洗炼()
equip_row = 43
equip_column = 35
Call 装备洗炼
End Sub
Sub 蓝方戒指洗炼()
equip_row = 44
equip_column = 35
Call 装备洗炼
End Sub
Sub 蓝方玉佩洗炼()
equip_row = 45
equip_column = 35
Call 装备洗炼
End Sub
Sub 蓝方腰带洗炼()
equip_row = 46
equip_column = 35
Call 装备洗炼
End Sub
Sub 蓝方装备全部洗炼()
Call 蓝方武器洗炼
Call 蓝方衣服洗炼
Call 蓝方护腕洗炼
Call 蓝方护腿洗炼
Call 蓝方鞋子洗炼
Call 蓝方头盔洗炼
Call 蓝方项链洗炼
Call 蓝方戒指洗炼
Call 蓝方玉佩洗炼
Call 蓝方腰带洗炼
End Sub
'装备洗炼---------------------------------------------------------------
Sub 装备洗炼()
'清空旧数据----------------------------------------------
Sheets("PVP战斗模拟").Range(Cells(equip_row, equip_column), Cells(equip_row, equip_column + 7)).Select '清空选择洗炼的装备的原附加属性
Selection.ClearContents
'获取数据------------------------------------------------
Name = Sheets("PVP战斗模拟").Cells(equip_row - 14, equip_column - 2) '获取装备的名字
quality = Sheets("PVP战斗模拟").Cells(equip_row, "o") '获取装备的品质
Attributes_num = Sheets("PVP战斗模拟").Cells(equip_row, equip_column - 2) '获取装备的附加属性数量
If Attributes_num > 0 Then
'查找武器在装备表中的行数
With Sheets("装备表").Columns("c:c")
Set c = .Find(Name, LookIn:=xlValues, LOOKAT:=xlWhole)
Row = c.Row
'MsgBox Cells(c.Row, 1)
End With
'定义变量
'获取该武器的数据
Dim Attributes_add(1 To 8) '附加属性基础值
Dim Attributes_base(1 To 8) '附加属性基础值
Dim Quality_ratio_min(1 To 6) '随机属性最小倍数
Dim Quality_ratio_max(1 To 6) '随机属性最大倍数
Dim quality_rate(1 To 6) '6个梯度对应的概率
i = Row
For j = 1 To 8
Attributes_base(j) = Sheets("装备表").Cells(i, 13 + j).Value
Next
For j = 1 To 8
t1 = t1 & ";" & Attributes_base(j)
Next
For j = 1 To 6
Quality_ratio_min(j) = Sheets("装备表").Cells(i, 21 + j)
Quality_ratio_max(j) = Sheets("装备表").Cells(i, 27 + j)
quality_rate(j) = Sheets("装备表").Cells(i, 33 + j)
Next
For j = 1 To 6
t2 = t2 & ";" & Quality_ratio_min(j)
t3 = t3 & ";" & Quality_ratio_max(j)
t4 = t4 & ";" & quality_rate(j)
Next
'计算----------------------------------------------------------------------
Randomize (Now())
'随机出附加属性
Dim arr() '定义存放随机数的数组
sxgs = Attributes_num '抽取x个数字
f1 = 1 '随机数范围的最小值
f2 = 8 '随机数范围的最大值
ReDim arr(1 To sxgs)
'开始抽取
For i = 1 To sxgs
Do
arr(i) = Round(Rnd() * (f2 - f1) + f1)
flag = False
For j = 1 To (i - 1)
If arr(i) = arr(j) Then
flag = True
End If
'如果有重复,就重新生成随机数
Next
Loop While flag
Next
'下面是显示所抽取的数字
For i = 1 To sxgs
t = t & arr(i) & ","
Next
'MsgBox t & vbCrLf & "共抽取" & sxgs & "个数字" & vbCrLf & t1 & vbCrLf & t2 & vbCrLf & t3
'随机出属性值---------------------------------------------------------------
wqr6 = quality_rate(1) + quality_rate(2) + quality_rate(3) + quality_rate(4) + quality_rate(5) + quality_rate(6)
wqr5 = quality_rate(1) + quality_rate(2) + quality_rate(3) + quality_rate(4) + quality_rate(5)
wqr4 = quality_rate(1) + quality_rate(2) + quality_rate(3) + quality_rate(4)
wqr3 = quality_rate(1) + quality_rate(2) + quality_rate(3)
wqr2 = quality_rate(1) + quality_rate(2)
wqr1 = quality_rate(1)
'MsgBox "属性个数:" & Attributes_num
For i = 1 To Attributes_num
b = arr(i)
ccc = Rnd() * 1
Select Case ccc
Case wqr5 To wqr6
xx = 6
Case wqr4 To wqr5
xx = 5
Case wqr3 To wqr4
xx = 4
Case wqr2 To wqr3
xx = 3
Case wqr1 To wqr2
xx = 2
Case 0 To wqr1
xx = 1
End Select
'生成的附加属性=附加属性基础知识*(附加属性最小倍数+(附加属性最大倍数-附加属性最小倍数)/梯度数6*随机数)
Attributes_add(b) = Int(Attributes_base(b) * (Quality_ratio_min(Attributes_num + 1) + (Quality_ratio_max(Attributes_num + 1) - Quality_ratio_min(Attributes_num + 1)) / 5 * (xx - 1)))
If Attributes_add(b) = 0 Then
Attributes_add(b) = "没出来"
End If
'输出结果
Sheets("PVP战斗模拟").Cells(equip_row, equip_column - 1 + b) = Attributes_add(b)
'MsgBox i
Next
Else
'MsgBox "白色装备没有附加属性"
End If
End Sub
|
|