从列表中删除,因为选择是疯狂的

2024-04-27 16:33:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个程序,通过随机分配一个种族,职业和统计来创建一个角色

但是我希望每个属性都有一个唯一的值。所以如果strength是8,那么其他属性都不能是8。我该怎么做呢?在进行选择时是否需要删除列表条目

我的代码

import random

races = ["Human", "Dwarf", "Elf"]
classes = ["Fighter", "Wizard", "Rogue"]
stats = [8, 10, 11, 12, 14, 15]

Strength = 0
Dexterity = 0
Constution = 0
Intelligence = 0
Wisdom = 0
Charisma = 0

Strength = random.choice(stats)
Dexterity = random.choice(stats)
Constution = random.choice(stats) 
Intelligence = random.choice(stats)
Wisdom = random.choice(stats)
Charisma = random.choice(stats)

race = random.choice(races)
clse = random.choice(classes)

Tags: 程序属性statsrandomstrengthclassesintelligencedexterity
3条回答

你给我们看的是一个角色的作品。但是如果我们想创造成百上千个呢。在Python中,所有东西都是一个类,在本例中,强烈建议使用它

看看这个简单的例子:

import random
from textwrap import dedent

races = ["Human", "Dwarf", "Elf"]
classes = ["Fighter", "Wizard", "Rogue"]
stats = [ 8, 10, 11, 12, 14, 15]

class char:
    def __init__(self, races, classes, stats):
        random.shuffle(stats) # <--- this solves your problem
        self.race = random.choice(races)
        self.cls = random.choice(classes)
        self.stats = dict(zip(['Strength','Dexterity','Constution',
                               'Intelligence','Wisdom','Charisma'],stats))

    def __str__(self):
        s = dedent('''\
        Your character is a....
        Race: {}
        Class: {}
        Stats: {}''').format(self.race, self.cls, self.stats)
        return s

char1 = char(races,classes,stats) # Creates char1 based on char class
char2 = char(races,classes,stats) # Creates char2 ...

print(char1) # printing a class will call the __str__ function if it exists
print()
print(char2)

一个类可以保存变量和其他函数,在本例中,我们创建了三个变量(race、cls和stats),并添加了一个print函数来轻松打印我们所拥有的内容

当我运行它时返回这个:

Your character is a....
Race: Elf
Class: Rogue
Stats: {'Dexterity': 11, 'Charisma': 15, 'Constution': 12, 'Wisdom': 10, 'Intelligence': 14, 'Strength': 8}

Your character is a....
Race: Dwarf
Class: Fighter
Stats: {'Dexterity': 14, 'Charisma': 8, 'Constution': 12, 'Wisdom': 11, 'Intelligence': 15, 'Strength': 10}

创建stats列表的随机排列,然后按排列顺序分配StrengthDexterity等。这样做还有一个额外的好处,即在创建新角色之前不需要重置列表

from random import shuffle

# ...
stats = [8, 10, 11, 12, 14, 15]
shuffle(stats)
Strength = stats[0]
Dexterity = stats[1]
Constution = stats[2]
Intelligence = stats[3]
Wisdom = stats[4]
Charisma = stats[5]

作为旁注,没有必要将默认值0分配给Strength等,因为它们将在之后立即更改

就像你在问题中说的,你可以从列表中删除条目:

Strenght = random.choice(stats)
del stats[stats.index(Strength)]

正如上面的答案所说,一个好的解决方案也是使用random shuffle。再加上一个提示,当你写的时候,例如Strength = random.choice(stats)你声明了这个时刻的变量强度,并给它一个值,这样你就不必在上面声明它,这样你就可以删除所有的Strength = 0等等

相关问题 更多 >