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…)

赛题文件

赛题文件和答案

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐