首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【python】2024年微软excel电竞大赛决赛-魔兽世界

【python】2024年微软excel电竞大赛决赛-魔兽世界

原创
作者头像
ddAshley
发布2025-07-21 10:37:37
发布2025-07-21 10:37:37
2020
举报

2024年微软 Excel 电竞决赛赛题是以《魔兽世界》为主题,解决一项项充满挑战的任务。虽然作者本人精通excel(简历上精通),但本人喜欢用多种方式解决问题,所以尝试用python来做做这个模型。

问题1:准备(入门)

在魔兽世界中,玩家的初始经验值(XP)为0,等级为1。玩家需要收集400XP从1级升级至2级,此后每升一级所需的XP都比前一次升级的多12.5%。例如,从2级升到3级需要450XP,从三级到四级需要506.25XP,以此类推。结果无需舍入。

问题:

玩家们此时已经游玩了一段时间,并积累了一些经验值。根据这些玩家当前的总经验值,找出他们每个人所在的等级。

解析:

代码语言:python
复制
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

然后根据玩家当前的总经验值倒推他们现在所在的等级

代码语言:python
复制
# 查找玩家的等级,把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级时手上有多少银币?请注意,玩家开始任务前拥有一定数量的金币。

代码语言:python
复制
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相关的库都没有直接获取单元格颜色的函数或代码。因此下列仅给出思路与部分代码:

代码语言:python
复制
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?

解析:

代码语言:python
复制
# 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级时,各玩家有多少银币?

解析:

代码语言:python
复制
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点生命值。战斗结束后他们的生命值会在下一场战斗开始前恢复到初始状态。

问题:

每场战斗会持续多少秒?将答案四舍五入取整数。 注意:每场战斗后角色经验和金币不变。

解析:

代码语言:python
复制
# 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........)

赛题文件

赛题文件和答案

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题1:准备(入门)
  • 问题2:升级(简单)
  • 问题3:采矿(中等)
  • 问题4:提升属性值(中等)
  • 问题5:地下城(中等)
  • 问题6:1V1(中等)
  • 问题7:站队(困难)
  • 奖励问题
    • 奖励1
    • 奖励2
    • 奖励3
    • 奖励4
    • 奖励5
  • 赛题文件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档