【问题标题】:Trying to simulate an Overwatch loot box opening program in Python试图在 Python 中模拟一个守望先锋战利品盒打开程序
【发布时间】:2017-04-20 06:35:40
【问题描述】:

所以基本上我正在尝试将在守望先锋中打开一个战利品盒重新创建为一个 Python 中的可运行程序。我试图让它在一个数组中包含四个随机项目,并在每次用户键入“打开”打开一个盒子时显示它们。打开每个盒子后,我希望它循环并询问他们是否要打开另一个盒子,或者他们是否不想然后停止程序。到目前为止,这是我的代码:

import random

# welcome
print("Welcome to the Overwatch Loot Box Simulator!")

OpenBox = input("Type 'open' to open a loot box!")

OverwatchSkins = [
    'Legendary: Oni Genji',
    'Epic: Frostbite Pharah',
    'Rare: Banana Winston',
    'Rare: Cobalt Reinhardt',
    'Epic: Synaesthesia Lucio',
    'Legendary: Lone Wolf Hanzo',
    'Rare: Rose Widowmaker',
    'Rare: Celestial Mercy',
    'Epic: Carbon Fiber D.VA',
    'Legendary: Dr. Junkenstein Junkrat',
    'Epic: Nihon Genji',
    'Rare: Blood Reaper',
    'Rare: Ebony McCree',
    'Epic: Demon Hanzo',
    'Rare: Peridot Ana',
    'Rare: Lemonlime D.VA',
    'Epic: Taegeukgi D.VA',
    'Legendary: Mei-rry Mei',
    'Legendary: Augmented Sombra',
    'Rare: Technomancer Symmetra',
    'Rare: Mud Roadhog'
]

if OpenBox == "open":
    print(random.choice(OverwatchSkins))

OverwatchSkins 数组稍后将被更多名称填充。非常感谢任何帮助!

【问题讨论】:

标签: python python-2.7 python-3.x


【解决方案1】:

您可以将所有内容包装在while(True)-Loop 中,并使用break 来停止循环,如果用户放入的不是open

确保只有输入和输出在循环中,因为您不想每次都重新定义列表。

import random
print("Welcome to the Overwatch Loot Box Simulator!")
OverwatchSkins = ['Legendary: Oni Genji', 'Epic: Frostbite Pharah', 'Rare: Banana Winston', 'Rare: Cobalt Reinhardt', 'Epic: Synaesthesia Lucio', 'Legendary: Lone Wolf Hanzo', 'Rare: Rose Widowmaker', 'Rare: Celestial Mercy', 'Epic: Carbon Fiber D.VA', 'Legendary: Dr. Junkenstein Junkrat', 'Epic: Nihon Genji', 'Rare: Blood Reaper', 'Rare: Ebony McCree', 'Epic: Demon Hanzo', 'Rare: Peridot Ana', 'Rare: Lemonlime D.VA', 'Epic: Taegeukgi D.VA', 'Legendary: Mei-rry Mei', 'Legendary: Augmented Sombra', 'Rare: Technomancer Symmetra', 'Rare: Mud Roadhog']

while(True):
    OpenBox = input("Type 'open' to open a loot box! ")
    if OpenBox == "open":
        print(random.choice(OverwatchSkins))
    else:
        break

【讨论】:

  • 太棒了,谢谢!您知道每次打开“盒子”时如何从数组中取出四个随机项吗?
  • @mastermind,看看random.sample()
【解决方案2】:

根据 Christian 的建议,如下所示:

import random
import sys

OverwatchSkins = ['Legendary: Oni Genji', 'Epic: Frostbite Pharah', 'Rare: Banana Winston', 'Rare: Cobalt Reinhardt', 'Epic: Synaesthesia Lucio', 'Legendary: Lone Wolf Hanzo', 'Rare: Rose Widowmaker', 'Rare: Celestial Mercy', 'Epic: Carbon Fiber D.VA', 'Legendary: Dr. Junkenstein Junkrat', 'Epic: Nihon Genji', 'Rare: Blood Reaper', 'Rare: Ebony McCree', 'Epic: Demon Hanzo', 'Rare: Peridot Ana', 'Rare: Lemonlime D.VA', 'Epic: Taegeukgi D.VA', 'Legendary: Mei-rry Mei', 'Legendary: Augmented Sombra', 'Rare: Technomancer Symmetra', 'Rare: Mud Roadhog']

while True:
    key = raw_input('\nType "open" to open a loot box!\n(Type "q" to exit.)\nYour input: ')
    if key.lower()=='q':
        sys.exit()
    elif key.lower()=='open':
        print random.choice(OverwatchSkins)
    else:
        print "Invalid input, try again!"

【讨论】:

    【解决方案3】:

    这比你要求的要多一点。下面为每个项目添加一个概率,因此选择“稀有”项目的频率低于“史诗”,并选择了 4 个项目。

    该示例已重新格式化以使用 Python 约定,例如 snake_case 而不是 CamelCase 用于变量名称。

    import random
    
    overwatch_skins = [
        # skin list here
    ]
    
    frequency = {
        'Legendary': 2,
        'Rare': 1,
        'Epic': 4
    }
    # type is to the left of the first colon
    types = [skin.split(':')[0] for skin in overwatch_skins]
    # map types onto weightings
    weightings = [frequency[type] for type in types]
    
    print("Welcome to the Overwatch Loot Box Simulator!")
    while True:
        reply = input("Type 'open' to open a loot box!")
        if reply != "open":
            break
        print(random.choices(overwatch_skins, weightings, k=4))
    
    >>> python choices.py
    ['Legendary: Dr. Junkenstein Junkrat', 'Rare: Ebony McCree', 'Epic: Frostbite Pharah', 'Epic: Demon Hanzo']
    ['Epic: Taegeukgi D.VA', 'Rare: Lemonlime D.VA', 'Legendary: Mei-rry Mei', 'Epic: Nihon Genji']
    

    注意列表推导的使用,这是一种从 Python 中的其他列表构建列表的方法:

    types = [skin.split(':')[0] for skin in overwatch_skins]
    weightings = [frequency[type] for type in types]
    

    您可以通过在每个调用之后放置 print() 来探索它,并使用 random.choices 一次返回四个加权选择。

    通常,您会将项目的“稀有”、“史诗”和“传奇”方面与描述分开,例如使用元组。所以:

    ('Legendary', 'Oni Genji'),
    

    而不是:

    'Legendary: Oni Genji',
    

    【讨论】:

      猜你喜欢
      • 2013-08-06
      • 2014-11-13
      • 2016-04-15
      • 2014-04-02
      • 2012-03-10
      • 1970-01-01
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多