1 python list range python-3.x
我正在制作一个简单的RPG战斗系统,用这个功能来决定玩家将使用哪种类型的攻击.但我没有运气让我的条件返回他们指定的字符串.所有它返回的都是"无"字样.
顺便说一下,我刚开始学习一个月前的编程,所以我不太了解Python.
def attack_or_critical_attack_or_missed():
    #Random number generated from a range and then placed into a list.
    import random
    number_list = [random.randrange(1, 105)]
    print(number_list)
    print("")
    #Check list to see where my generated number gets put. 
    #Big Chance For Regular Attack
    range1 = []
    n = range(1, 76)
    for n in n:
        range1.append(n)
    if range1 in number_list:
        return "normal_attack"
    #Small Chance For A Critical Attack
    range2 = []
    j = range(76, 101)
    for j in j:
        range2.append(j)
    if range2 in number_list:
        return "critical_attack"
    #Tiny Chance For The Attack To Miss
    range3 = []
    v = range(101, 106)
    for v in v:
        range3.append(v)
    if range3 in number_list:
        return "missed_attack"
print(attack_or_critical_attack_or_missed())
试试这个简化版的代码:
def attack_or_critical_attack_or_missed():
    import random
    roll = random.randrange(1, 105)
    if roll in range(1, 76):
        return "normal_attack"
    elif roll in range(76, 101):
        return "critical_attack"
    elif roll in range(101, 106):
        return "missed_attack"
    else:
        raise RuntimeError('This code should not be reached')
print(attack_or_critical_attack_or_missed())
它可能会帮助您了解您做错了什么.请注意,这是对原始代码的简单重构,除了异常之外我没有添加任何新内容,但我重新安排了代码的布局方式,以便让您更容易理解.
这是一个更健壮的方法:
import random
def perform_attack(rand_max=105, normal=range(1,76), critical=range(76,101), missed=range(101,106)):
    roll = random.randrange(1, rand_max)
    outcomes = {'normal': normal, 'critical': critical, 'missed': missed}
    for outcome, field in outcomes.items():
        if roll in field:
            return outcome + '_attack'
    raise RuntimeError('Roll was outside of any specified range, check parameters')
这是一个可以非常动态调整的万无一失的方法:
import random
def attack(**attack_table):
    attack_table.setdefault('normal', 75)
    attack_table.setdefault('critical', 25)
    attack_table.setdefault('miss', 5)
    max_roll = 0
    outcomes = {}
    for outcome, chance in attack_table.items():
        outcomes[outcome] = range(max_roll, max_roll + chance)
        max_roll += chance
    roll = random.randrange(max_roll)
    for outcome, threat_range in outcomes.items():
        if roll in threat_range:
            return outcome
用法:
该功能根据您分配的机会编号自动为每种类型的攻击建立威胁范围,默认情况下有正常,严重和未命中,所有这些都与您的机会相同.如果我要分配一种新类型的结果,说"超级"有可能500,那么它很可能成为结果:
>>> attack(super=500)
'super'
我甚至可以改变错过的机会:
>>> attack(miss=200)
'miss'
甚至可以一起消除失手的机会:
>>> attack(miss=0)
'critical'  # lucky shot!
| 归档时间: | 
 | 
| 查看次数: | 97 次 | 
| 最近记录: |