2024年微软 Excel 电竞决赛赛题是以《魔兽世界》为主题,解决一项项充满挑战的任务。虽然作者本人精通excel(简历上精通),但本人喜欢用多种方式解决问题,所以尝试用python来做做这个模型。
问题1:准备(入门)
在魔兽世界中,玩家的初始经验值(XP)为0,等级为1。玩家需要收集400XP从1级升级至2级,此后每升一级所需的XP都比前一次升级的多12.5%。例如,从2级升到3级需要450XP,从三级到四级需要506.25XP,以此类推。结果无需舍入。
问题: 玩家们此时已经游玩了一段时间,并积累了一些经验值。根据这些玩家当前的总经验值,找出他们每个人所在的等级。
解析:
import pandas as pd
upgrade_xp = [400] # 升级所需经验
total_xp = [0] # 累积经验
for i in range(1, 40):
total_xp.append(total_xp[i-1] + upgrade_xp[i-1])
upgrade_xp.append(upgrade_xp[i-1]*1.125)
# 为了直观看到他们的关系,写进一个表格内
degree = pd.DataFrame({'degree': range(1, 41), 'total_xp': total_xp, 'upgrade_xp': upgrade_xp})
| 等级 | 累积经验 | 升级所需经验 |
|---|---|---|
| 1 | 0 | 400 |
| 2 | 400 | 450 |
| 3 | 850 | 506.25 |
| 4 | 1356.25 | 569.53125 |
| ... | ... | ... |
| 37 | 218947.1707275169 | 27768.396340939613 |
| 38 | 246715.56706845653 | 31239.445883557066 |
| 39 | 277955.0129520136 | 35144.3766190017 |
| 40 | 313099.38957101526 | 39537.42369637691 |
然后根据玩家当前的总经验值倒推他们现在所在的等级
# 查找玩家的等级,把player_xp替换成玩家当前的总经验值即可
player_degree = [player_xp >= i for i in total_xp].index(False)
| 玩家 | 种族 | 职业 | 总经验值 | 答案 |
|---|---|---|---|---|
| 1 | Orc | Warrior | 6945 | 10 |
| 2 | Troll | Priest | 6612 | 3 |
| 3 | Undead | Warlock | 1500 | 4 |
| 4 | Tauren | Warrior | 5191 | 9 |
| 5 | Teuren | Hunter | 4777 | 8 |
| 6 | Undead | Priest | 4229 | 8 |
| 7 | Troll | Hunter | 7365 | 11 |
| 8 | Orc | Rouge | 5739 | 9 |
| 9 | Orc | Shaman | 7158 | 10 |
| 10 | Undead | Mage | 3250 | 6 |
| 11 | Orc | Warlock | 6212 | 10 |
| 12 | Troll | Warrior | 7492 | 11 |
| 13 | Undead | Rogue | 3971 | 7 |
| 14 | Troll | Mage | 6783 | 10 |
| 15 | Tauren | Shaman | 6297 | 10 |
| 16 | Troll | Shaman | 5589 | 9 |
| 17 | Undead | Rogue | 5266 | 9 |
| 18 | Troll | Priest | 3966 | 7 |
| 19 | Troll | Priest | 4640 | 8 |
| 20 | Tauren | Druid | 9500 | 12 |
问题2:升级(简单)
Level2的目标是将所有角色提升到40级,任务列表在“Quests”选项卡内,并且每个任务都会获得不同数量的经验值和金币。
换币规则: 1单位金币能兑换100单位银币。 1金币=100银币,0.55金币=55银币,1.55金币=155银币/1金币55银币
任务: 每个玩家开始根据他们当前的位置按顺序完成任务。当玩家完成当前位置的所有任务后,将根据种族移动到下一位置(见下表),如此继续完成任务并移动位置,直到达到40级。
| 位置 | Orc | Troll | Undead | Tauren |
|---|---|---|---|---|
| Location1 | Durotar | Durotar | Tirisal Galdes | Mulgore |
| Loaction2 | The Barrens | The Barrens | Silverpine Forest | The Barrens |
| Location3 | Ashenvale | Ashenvale | Ashenvale | Ashenvale |
| Loaction4 | Stonetalon Mountains | Stonetalon Mountains | Hillsbrad Foothills | Stonetalon Mountains |
| Location5 | Thousans Needles | Thousans Needles | Arathi Highlands | Thousand Needles |
| Loaction6 | Desolace | Desolace | n.a. | Desolace |
示例: 玩家David位于Durotar,已经累积了908XP和28.78金币。他需要先完成“Hidden Enemies”任务(DUR-1),获得5000XP和27银币;接着完成“Burning Blade Medallion”任务(DUR-2),获得5200XP和15银币;以此类推直到完成Durotar的所有任务。在完成Durotar的所有20个任务后,David仍未达到40级。他将根据种族(Orc)移动到下一个地点The Barrens继续完成任务。David在Ashenvale完成任务“Fallen Sky Lake”(ASH-16)后达到40级,此时他拥有315908XP和57.25金币(5725银币)。
问题: 各位玩家升至40级时手上有多少银币?请注意,玩家开始任务前拥有一定数量的金币。
import pandas as pd
location = pd.read_excel('Quest.xlsx', sheet_name='location') # 加载种族位置顺序表
site = pd.read_excel('Quest.xlsx', sheet_name='site') # 任务顺序表
def get_money(race, init_xp, gold_collected, current_location):
'''
:param race: 种族
:param init_xp: 初始xp
:param gold_collected: 初始金币
:param current_location: 当前位置
:return: 达到40级时的经验值、银币数量
'''
degree_xp = degree[degree['degree'] == 40]['total_xp'].values[0] # 达到40级的累积经验
race_location_sort = location[race] # 根据种族查找位置顺序
quest_location = list(race_location_sort).index(current_location)
df = site[site['Location'].isin(race_location_sort[quest_location:])]
df['Location'] = pd.Categorical(df['Location'], categories=race_location_sort)
df = df.sort_values(['Location', 'Quest ID'])
df['gold_collected_cumsum'] = df['Gold Granted'].cumsum()
df['xp_cumsum'] = df['XP Granted'].cumsum()
total_xp = df[df['xp_cumsum'] > (degree_xp - init_xp)]['xp_cumsum'].min() # 达到40级时获得的xp
gold_granted = df[df['xp_cumsum'] > (degree_xp - init_xp)]['gold_collected_cumsum'].min() # 达到40级时获得的金币
current_location = df[df['xp_cumsum'] > (degree_xp - init_xp)]['Location'].iloc[0] # 40级时的位置
total_xp += init_xp
total_sliver = int(round((gold_collected + gold_granted) * 100, 0))
return total_xp, total_sliver
| 玩家 | 种族 | 职业 | XP | 等级 | 金币 | 当前位置 | 答案 |
|---|---|---|---|---|---|---|---|
| 1 | Orc | Warrior | 6945 | 10 | 27.42 | Durotar | 5555 |
| 2 | Troll | Priest | 6612 | 10 | 26.47 | Durotar | 5460 |
| 3 | Undead | Warlock | 1500 | 4 | 27.82 | Thrisfal Glades | 5614 |
| 4 | Tauren | Warrior | 5191 | 9 | 27.75 | Mulgore | 5916 |
| 5 | Teuren | Hunter | 4777 | 8 | 28.11 | Mulgore | 5952 |
| 6 | Undead | Priest | 4229 | 8 | 25.76 | Thrisfal Glades | 5361 |
| 7 | Troll | Hunter | 7365 | 11 | 26.47 | Durotar | 5460 |
| 8 | Orc | Rouge | 5739 | 9 | 28.19 | Durotar | 5632 |
| 9 | Orc | Shaman | 7158 | 10 | 27.42 | Durotar | 5555 |
| 10 | Undead | Mage | 3250 | 6 | 27.44 | Thrisfal Glades | 5576 |
| 11 | Orc | Warlock | 6212 | 10 | 27.42 | Durotar | 5555 |
| 12 | Troll | Warrior | 7492 | 11 | 26.47 | Durotar | 5460 |
| 13 | Undead | Rogue | 3971 | 7 | 24.80 | Thrisfal Glades | 5265 |
| 14 | Troll | Mage | 6783 | 10 | 27.42 | Durotar | 5555 |
| 15 | Tauren | Shaman | 6297 | 10 | 26.47 | Mulgore | 5788 |
| 16 | Troll | Shaman | 5589 | 9 | 28.19 | Durotar | 5632 |
| 17 | Undead | Rogue | 5266 | 9 | 24.80 | Thrisfal Glades | 5265 |
| 18 | Troll | Priest | 3966 | 7 | 28.32 | Durotar | 5679 |
| 19 | Troll | Priest | 4640 | 8 | 27.82 | Durotar | 5595 |
| 20 | Tauren | Druid | 9500 | 12 | 25.47 | Mulgore | 5688 |
问题3:采矿(中等)
Level 3的目标是购买坐骑,以便在开放世界中更快地移动。坐骑的价格是90金币。在之前的游戏中,你已经获得了一些金币。现在你想采用采矿技能获得矿石,并在拍卖行出售,以获得足够的金币购买坐骑。在本题中,只使用了游戏的5种矿石资源:铜、锡、铁、秘银和钍。
| 资源 | 资源 | 资源 | 资源 | 资源 |
|---|---|---|---|---|
| 铜(Copper) | 锡(Tin) | 铁(Iron) | 秘银(Mithril) | 钍(Thorium) |
采矿任务: 每名玩家在指定的日期开始采矿,每次采矿一周,然后出售矿石,如此循环,直到获得90金币。开采的矿石必须以20单位为1堆的形式打包出售。矿石在开采周期的最后一天出售,剩余的矿石可以留到下一周期继续出售。矿石的每日出售价格在“Ore Price”。当金币数量足够时,立即停止采矿。在本题中,玩家XP不会因挖矿而改变。
示例: 玩家Daivd从之前的关卡中获得了57.25金币。2024年1月1日,他开始开采铜矿。他将在1月7日前开采999单位铜矿,999单位矿石=49.95堆矿石。Daivd卖出49堆,每堆0.22金,剩余0.95堆铜矿石,获得了49 x 0.22=10.78金币,此时他总共有68.03金币。在第2周,David又开采了354单位铜矿,相当于17.7堆(累计开采量为18.65堆)。2024年1月14日,Daivd以3.24黄金的价格出售了18堆铜矿石,剩余0.65堆铜矿石。在第4周结束时,David以25.52金的价格卖出了29堆铁矿石。此时他的总余额是111.69金币(足以用90黄金购买一个坐骑),因此他停止了采矿。购买坐骑后,他的余额为111.69-90.00=21.69金币=2169银币。
问题: 在花费90金币购买坐骑后,各玩家还剩多少银币?
解析:
第三题需要读取单元格的颜色来判断当天的矿石,但是python里与xlsx相关的库都没有直接获取单元格颜色的函数或代码。因此下列仅给出思路与部分代码:
copper_color = get_cell_color(wb['resource']['B1'])
tin_color = get_cell_color(wb['resource']['C1'])
icon_color = get_cell_color(wb['resource']['D1'])
mithril_color = get_cell_color(wb['resource']['E1'])
thorium_color = get_cell_color(wb['resource']['F1'])
schedule = wb['mining schedule']
def check_resource(color):
if color == copper_color:
return 'Copper'
elif color == tin_color:
return 'Tin'
elif color == icon_color:
return 'Iron'
elif color == mithril_color:
return 'Mithril'
elif color == thorium_color:
return 'Thorium'
print('请输入player_id和银币数量:') # 基于表格的位置读取日期的
player_id = int(input())
sliver_collected = int(input())
resource_remain = {
'Copper': 0,
'Tin': 0,
'Iron': 0,
'Mithril': 0,
'Thorium': 0,
'gold_collected': sliver_collected/100,
'week': '1'
}
while True:
for week in range(1, 5):
if week == 1: # week 1
resource_type = check_resource(get_cell_color(schedule.cell(player_id+1, week+1)))
start_date = schedule.cell(player_id+1, week+1).value
sell_date = start_date + datetime.timedelta(days=6)
resource_remain['week'] = '1'
stack = schedule.cell(player_id+1, week+1).value // 20
resource_remain[resource_type] = schedule.cell(player_id+1, week+1).value % 20 + resource_remain[resource_type]
resource_remain['gold_collected'] = (resource[resource['date'] == sell_date][resource_type] * stack).values[0] + resource_remain['gold_collected']
for i in ['Copper', 'Tin', 'Iron', 'Mithril', 'Thorium']:
if resource_remain[i] >= 20:
stack = resource_remain[i] // 20
resource_remain[i] = resource_remain[i] % 20
resource_remain['gold_collected'] = (resource[resource['date'] == sell_date][i]*stack).values[0] + resource_remain['gold_collected']
if resource_remain['gold_collected'] >= 90:
break
else: # week 2-5
resource_type = check_resource(get_cell_color(schedule.cell(player_id+1, week+1)))
start_date = start_date + datetime.timedelta(days=7)
sell_date = start_date + datetime.timedelta(days=6)
resource_remain['week'] = week
stack = schedule.cell(player_id+1, week+1).value // 20
resource_remain[resource_type] = schedule.cell(player_id+1, week+1).value % 20 + resource_remain[resource_type]
resource_remain['gold_collected'] = (resource[resource['date'] == sell_date][resource_type] * stack).values[0] + resource_remain['gold_collected']
for i in ['Copper', 'Tin', 'Iron', 'Mithril', 'Thorium']:
if resource_remain[i] >= 20:
stack = resource_remain[i] // 20
resource_remain[i] = resource_remain[i] % 20
resource_remain['gold_collected'] = (resource[resource['date'] == sell_date][i]*stack).values[0] + resource_remain['gold_collected']
if resource_remain['gold_collected'] >= 90:
break
print('剩余金币数:', (resource_remain['gold_collected'] - 90) * 100)
答案:
| 玩家 | 种族 | 职业 | 答案 |
|---|---|---|---|
| 1 | Orc | Warrior | 745 |
| 2 | Troll | Priest | 1696 |
| 3 | Undead | Warlock | 243 |
| 4 | Tauren | Warrior | 1160 |
| 5 | Teuren | Hunter | 279 |
| 6 | Undead | Priest | 518 |
| 7 | Troll | Hunter | 558 |
| 8 | Orc | Rouge | 2981 |
| 9 | Orc | Shaman | 5153 |
| 10 | Undead | Mage | 1288 |
| 11 | Orc | Warlock | 2677 |
| 12 | Troll | Warrior | 756 |
| 13 | Undead | Rogue | 64 |
| 14 | Troll | Mage | 385 |
| 15 | Tauren | Shaman | 2046 |
| 16 | Troll | Shaman | 2849 |
| 17 | Undead | Rogue | 3609 |
| 18 | Troll | Priest | 1715 |
| 19 | Troll | Priest | 999 |
| 20 | Tauren | Druid | 1684 |
问题4:提升属性值(中等)
你的角色已经达到40级,需要装备物品提升角色属性。每种职业(如牧师、猎人等)都有特定的属性要求,通过完成任务可以获得装备物品。开始时,所有玩家的属性值均为0。通过完成任务获得必要的装备,提高所需的属性值以达到目标要求。此外,每个任务都会获得经验值和金币。
| 职业 | 属性 | 属性目标值 |
|---|---|---|
| Shaman | Strength | 45 |
| Priest | Intellect | 65 |
| Warrior | Armor | 300 |
| Hunter | Agility | 60 |
| Mage | Intellect | 120 |
| Druid | Agility | 75 |
| Warlock | Intellect | 80 |
| Rogue | Agility | 50 |
任务: 限制玩家可以不受限制地移动到各地点。在所有可选任务中,玩家优先选择能给对应属性提升最大的任务。如果两个任务可获取的属性值相同,则优先选择能获得更多XP的任务。达到所需的属性值后立即停止继续完成任务。在“More Quests & Items (L4)”选项卡中查看任务列表和物品列表。无需考虑装备槽位的限制,该列仅供参考。
示例: David是一名Warlock,所以他需要将Intellect提升到80点。首先他完成了任务“Warlock's Whistle”,因为该任务获得的物品对智慧的提升最大。任务奖励为Dreadmist Robes,获得该物品后智慧提升到30。此外,他还获得了3950 XP和0.90金币。然后,David完成了任务“A Grim Discovery”和“Mistvale Giblets”。这两个任务奖励物品都提升20点智慧,但"A Grim Discovery" 提供了更多的经验值,所以David先完成这一任务。在完成3个任务后,大卫拥有70点智慧,并获得了15210XP和3.05金币。最后,玩家大卫需要在4个任务之间做出决定,这些任务奖励的物品均可以提升15点智慧。其中,"The Stones That Bind Us" 可获得更多的经验值,所以David选择了这个任务。完成后,他将获得物品"Dreadmist Mask"(15点智慧)。他现在有85点智慧,所以他停止继续完成任务。完成这些任务还让他获得了20460经验值和3.70金币。因此,他的经验是336368。金币数为25.39。
问题: 达到目标属性值后,各玩家将获得多少XP?
解析:
# L4
quest_list = pd.read_excel('L4.xlsx', sheet_name='Quest List')
quest_item = pd.read_excel('L4.xlsx', sheet_name='Quest Item')
class_stat = pd.read_excel('L4.xlsx', sheet_name='Stat')
data = pd.merge(quest_list, quest_item, left_on='Item Granted', right_on='Item Name', how='left')
print('请输入玩家种族:')
race = input()
print('请输入当前xp:')
player_xp = int(input()) # L2得到
print('请输入玩家职业:')
player_class = input()
print('请输入L3后剩余银币:')
sliver_granted = int(input())
gold_granted = sliver_granted / 100
print(gold_granted)
target = class_stat[class_stat['Class'] == player_class]['Target'].values[0]
if player_class in ['Warlock', 'Priest', 'Mage']:
player_class = 'Warlock, Priest, Mage'
elif player_class in ['Druid', 'Rogue']:
player_class = 'Druid, Rogue'
class_data = data[data['Available to Class'] == player_class]
class_data.sort_values(by=['Amount of Stats', 'XP Granted'], ascending=False, inplace=True)
class_data['total_stat'] = class_data['Amount of Stats'].cumsum()
class_data['xp_granted'] = class_data['XP Granted'].cumsum()
class_data['gold_granted'] = class_data['Gold Granted'].cumsum()
player_xp = class_data[class_data['total_stat'] >= target]['xp_granted'].values[0] + player_xp
gold_granted = class_data[class_data['total_stat'] >= target]['gold_granted'].values[0] + gold_granted
stats_amount = class_data[class_data['total_stat'] >= target]['total_stat'].values[0]
print('玩家的总经验值:', player_xp)
print('玩家的总金币数:', gold_granted)
print('玩家的属性值:', stats_amount)
答案:
| 玩家 | 种族 | 职业 | 答案 |
|---|---|---|---|
| 1 | Orc | Warrior | 329970 |
| 2 | Troll | Priest | 330822 |
| 3 | Undead | Warlock | 337660 |
| 4 | Tauren | Warrior | 328716 |
| 5 | Teuren | Hunter | 329802 |
| 6 | Undead | Priest | 328639 |
| 7 | Troll | Hunter | 331890 |
| 8 | Orc | Rouge | 333728 |
| 9 | Orc | Shaman | 338658 |
| 10 | Undead | Mage | 352717 |
| 11 | Orc | Warlock | 335672 |
| 12 | Troll | Warrior | 330517 |
| 13 | Undead | Rogue | 332160 |
| 14 | Troll | Mage | 349550 |
| 15 | Tauren | Shaman | 338297 |
| 16 | Troll | Shaman | 337089 |
| 17 | Undead | Rogue | 333455 |
| 18 | Troll | Priest | 334176 |
| 19 | Troll | Priest | 328850 |
| 20 | Tauren | Druid | 348194 |
问题5:地下城(中等)
你的目标是通过攻略地下城达到60级。详见“Dungeons(L5)”选项卡。 通关每个地下城会获得一定数量的经验值并提供武器。 每个地下城都有最低经验等级要求,玩家必须高于或等于规定等级才能进入。 同一地下城可重复攻略,玩家总是选择完成能提供最多XP值的地下城副本。每次通关地下城后,除经验值外,还会获得一把武器作为奖励。
如果一个玩家通关了4次血色修道院Scarlet Monastery,他将依次获得Ravager、Torturing Poker、Illusionary Rod和Ravager。
武器与职业绑定,并提供属性提升。Mage不能使用weapon的武器X'caliboar,所以会把武器出售。玩家只能携带一件武器,因此总是保留他们可用的属性值最高的武器。如果warrior当前的武器提供50点Armor,此时他获得了一件80 Armor的武器,则他必须出售之前的武器并装备上新的武器。
示例: 玩家David当前为40级,有336368经验值。他的目标是达到60级。他当前唯一可攻略的地下城是Scarlet Monastery(最低XP等级37)。通关后,他获得了50000点经验值、1.00金币和一个Ravager,但他的职业是Warlock,而Ravager只有Warriors可以使用。所以他出售了武器,获得2.20金币。
现在,他达到了41级,可以攻略“Razorfen Downs”。他通关两次,分别获得了55000 XP和1.50金币,第一次获得了一把X'Caliboar(只有Warriors能用),出售后获得3.40金币。第二次获得了一把Vanquisher's Sword (只有Hunters能用),也将其出售。
在攻略34次地下城后,David达到了60级,拥有3401368 XP,和241.39金币(24139银币)。获得并保留了武器“Headmaster's Charge”,提升了115智慧(合计200智慧)。
问题: 当角色升到60级时,各玩家有多少银币?
解析:
print('请输入玩家职业:')
player_class = input()
print('请输入L4后的xp:')
player_xp = int(input())
player_degree = degree[degree['total_xp'] <= player_xp]['degree'].max()
visit_on_degree = 1
armor_stats = 0
armor_price = 0
armor = 'null'
print('请输入L4后的金币数:')
gold_granted = float(input())
print('请输入L4后的属性值:')
stats_amount = int(input())
if player_class == 'Mage':
player_class = 'Warlock, Mage'
while True:
df = dungeons[dungeons['Min Level'] <= player_degree]
df.sort_values(['XP Granted', 'Min Level'], ascending=[False, False], inplace=True)
# 判断进入地下城次数
if visit_on_degree % 3 == 1:
data = df[df['Visit'] == '1, 4, 7,…']
elif visit_on_degree % 3 == 2:
data = df[df['Visit'] == '2, 5, 8,…']
else:
data = df[df['Visit'] == '3, 6, 9,…']
if player_class != data['Class'].values[0]:
# Warlock单独判断
if player_class == 'Warlock':
if data['Class'].values[0] == 'Warlock, Mage':
if armor_stats <= data['Stats Amount'].values[0]: # 丢弃旧装备
gold_granted = gold_granted + data['Gold Granted'].values[0] + armor_price
armor_price = data['Sales Price'].values[0]
stats_amount = stats_amount + data['Stats Amount'].values[0] - armor_stats
armor_stats = data['Stats Amount'].values[0]
armor = data['Gear Reward (Weapons)'].values[0]
else: # 丢弃新装备
gold_granted += data['Gold Granted'].values[0]
else:
gold_granted = gold_granted + data['Gold Granted'].values[0] + data['Sales Price'].values[0]
else:
gold_granted = gold_granted + data['Gold Granted'].values[0] + data['Sales Price'].values[0]
else:
# 判断新获得的装备是否比旧装备强,强则丢弃旧装备,反之丢弃新装备
if armor_stats <= data['Stats Amount'].values[0]: # 丢弃旧装备
gold_granted = gold_granted + data['Gold Granted'].values[0] + armor_price
armor_price = data['Sales Price'].values[0]
stats_amount = stats_amount + data['Stats Amount'].values[0] - armor_stats
armor_stats = data['Stats Amount'].values[0]
armor = data['Gear Reward (Weapons)'].values[0]
else: # 丢弃新装备
gold_granted = gold_granted + data['Gold Granted'].values[0] + data['Sales Price'].values[0]
# 判断等级
player_xp += data['XP Granted'].values[0]
player_degree = [player_xp >= i for i in total_xp].index(False)
print(player_xp, player_degree, gold_granted, stats_amount, armor_stats)
if player_degree == 60:
break
else:
# 查看是否能否开启下一级地下城
if df.shape[0] < dungeons[dungeons['Min Level'] <= player_degree].shape[0]: # 能够开启下一个地下城
visit_on_degree = 1 # 探索次数重置为1
else:
visit_on_degree += 1
print(gold_granted*100)
答案:
| 玩家 | 种族 | 职业 | 答案 |
|---|---|---|---|
| 1 | Orc | Warrior | 22366 |
| 2 | Troll | Priest | 23420 |
| 3 | Undead | Warlock | 243 |
| 4 | Tauren | Warrior | 1160 |
| 5 | Teuren | Hunter | 279 |
| 6 | Undead | Priest | 518 |
| 7 | Troll | Hunter | 558 |
| 8 | Orc | Rouge | 2981 |
| 9 | Orc | Shaman | 5153 |
| 10 | Undead | Mage | 1288 |
| 11 | Orc | Warlock | 2677 |
| 12 | Troll | Warrior | 756 |
| 13 | Undead | Rogue | 64 |
| 14 | Troll | Mage | 385 |
| 15 | Tauren | Shaman | 2046 |
| 16 | Troll | Shaman | 2849 |
| 17 | Undead | Rogue | 3609 |
| 18 | Troll | Priest | 1715 |
| 19 | Troll | Priest | 999 |
| 20 | Tauren | Druid | 1684 |
问题6:1V1(中等)
现在玩家已经达到60级,并装备了全新的武器。是时候在战斗中考验他们了! 我们将首先进行PvP(玩家对玩家)的战斗训练
根据职业的不同,玩家在战斗中提供攻击或治疗。 在团战和突袭中,Healer(Shamans和Priests)通过施放治疗法术来维持团体的生命值。玩家角色的属性(Strength, Intellect, Armor, Agility)转换为战斗属性(HPS或DPS), Healer为每秒治疗值(HPS), Damage为每秒伤害值(DPS)。
战斗属性数据(DPS)可根据以下公式计算得到: 战斗属性数据 = 角色属性值 × 乘数 *例如:David的智慧属性为200点,则DPS=200×2.5=500,即每秒可造成500点伤害值 *
生命值HP: 生命值可根据以下公式计算得到 HP = (经验等级×50)×职业生命值百分比 在战斗中,生命值会随着受到伤害而减少。但会在下一场战斗开始时完全恢复。
魔兽世界中的战斗是按秒计算的。为了简单起见,你可以假设战斗是分回合进行的,每一轮的时长为1秒。每一秒内,Damage(Warriors, Hunters等)都会对对手造成伤害,使生命值减少对应的DPS值。每一秒内,Healer(Shamans和Priests)都会对自己进行治疗,使生命值增加对应的HPS值。治疗师不会对对手造成伤害,因此他们的战斗结果总是对手胜利。注意:每秒内伤害和治愈同时发生。 例如,如果一名Healer剩余300点生命值,受到对手400点伤害,并200点生命值治疗,他在第二秒结束时仍然活着。
示例: David(Warlock)与玩家1(Warrior)对战。David的生命值为(等级60 x 50)x 80%职业生命值百分比=3000 x 80%=2400。玩家1的生命值为(XP等级60 x 50点)x 115%职业生命值百分比=3000 x 115%=3450。David的每秒伤害是200 Intellect x 2.5战斗乘数=500 DPS。玩家1的每秒伤害为476 Armor x 1.0战斗乘数=476 DPS。在战斗的第1秒,David对玩家1造成500点伤害,而玩家1对David造成476点伤害。经过1秒的战斗,David的生命值为2400-476=1924,玩家1的生命值为3450-500=2950。
这将持续6秒。David的生命值降至-456,战斗结束。玩家1在战斗6秒后仍有450点生命值。战斗结束后他们的生命值会在下一场战斗开始前恢复到初始状态。
问题: 每场战斗会持续多少秒?将答案四舍五入取整数。 注意:每场战斗后角色经验和金币不变。
解析:
# L6
attribute_df = pd.read_excel('L6.xlsx', sheet_name='attribute')
opponent_df = pd.read_excel('L6.xlsx', sheet_name='opponent')
# 两位对战的玩家分别叫玩家a和玩家b,并传入对应得属性
print('请输入玩家a的职业:')
player_class_a = input()
A = attribute_df[attribute_df['Class'] == player_class_a].to_dict('records')[0]
print('请输入玩家b的职业:')
player_class_b = input()
B = attribute_df[attribute_df['Class'] == player_class_b].to_dict('records')[0]
hp_a = (60 * 50) * A['HP %']
hp_b = (60 * 50) * B['HP %']
seconds = 0
print('请输入玩家A的属性值:')
player_attribute_a = int(input())
print('请输入玩家B的属性值:')
player_attribute_b = int(input())
if A['Combat Stat'] == 'DPS':
damage_a = player_attribute_a * A['Combat Multiplier']
healer_a = 0
else:
damage_a = 0
healer_a = player_attribute_a * A['Combat Multiplier']
if B['Combat Stat'] == 'DPS':
damage_b = player_attribute_b * B['Combat Multiplier']
healer_b = 0
else:
damage_b = 0
healer_b = player_attribute_b * B['Combat Multiplier']
while (hp_a > 0) & (hp_b > 0):
hp_a -= damage_b
hp_a += healer_a
hp_b -= damage_a
hp_b += healer_b
seconds += 1
print(seconds)
问题7:站队(困难)
现在,玩家们已经准备好进行突袭了!在突袭中,玩家组成一组盟友,共同挑战一名Boss。所有存活的Damage同时对Boss造成伤害Boss一次只能对一名玩家造成伤害所有存活的Healer都会治疗被攻击的玩家。
玩家们在Boss周围占据有利的位置,以最大限度地提高获胜的机会。因此,Boss将按照以下顺序攻击玩家:
- 优先攻击Damage(攻击Boss的玩家)
- 再攻击Healer(恢复队友的玩家) -- 如有多名,选择剩余生命值(HP)最高的玩家 -- 如有多名,选择DPS/HPS最低的玩家
假设在每秒Boss只能攻击1名玩家,如果当前玩家被Boss攻击后生命值小于0,Boss只能在下一秒开始攻击下一个玩家。
示例: David与玩家1/2/3/4一起攻击Lucifron。 Lucifron按以下顺序进攻:玩家1,玩家4,David,玩家3,玩家2。所有玩家的DPS合计为1952,HPS合计为305。
在战斗的第一秒,突袭对Lucifron造成1952点伤害,他的生命值为20000-1952=18048
同时,玩家1受到Lucifron造成的1100点伤害,和305点治愈。
玩家1的生命值降至3450-1100+305=2655。其他玩家HP没有改变。
经过5秒的战斗,玩家1被击败,但他仍然在第5秒对Lucifron造成伤害。
目前,Lucifron的HP已降至10240。
从战斗的第6秒开始,总DPS为1952-476(玩家1的DPS)=1476。
13秒后,Lucifron被击败,战斗结束,
David和玩家2/3仍然存活
所有玩家(包括被击败的玩家)每人将获得150000点经验值和2200点金币。但由于这只是个示例,所以玩家1/2/3/4没有获得经验和金币。
问题: 每场战斗会持续多少秒?将答案四舍五入取整数。
(Loading........)
奖励问题
奖励1
玩家需要在魔兽世界中积累多少经验值(XP)才能获得40级所需的经验值?答案四舍五入保留到整数。 。。。。问题1自己找去。。。。
奖励2
在“任务(L2)”选项卡上,任务名称中有多少个字母“W”? (Loading........)
奖励3
根据Level 7的规则,所有20名玩家的总生命值HP是多少?此时所有玩家都已升到60级。 (Loading........)
奖励4
在Level 7战斗结束后,所有20名玩家的总经验值是多少?注意,玩家可以从他们参与(不论最终存活与否)的所有成功打败Boss的突袭中获得经验。不包括示例7。 (Loading........)
奖励5
所有20名玩家参与熔火之心Molten Core突袭副本,与拉格纳罗斯Ragnaros对战。根据Level 7的规则,战斗将持续多少秒? (Loading........)
赛题文件
见赛题文件和答案。