我正在用Python构建RPG风格的基于文本的游戏,但我陷入了困境。我试图要求用户输入并在代码中使用它来选择玩家的角色和种族。我把所有种族作为一个阶级,把所有阶级作为一个阶级。
这里是一个例子:
class Human:
hp = 50
dg = 10
ar = .1
cs = .05
ak = 5
ev = 0.1
class Elf:
hp = 20
dg = 20
ar = .1
cs = .2
ak = 15
ev = 0.15
def race_sel():
y = eval(input("Select Race: Human, Elf").capitalize())
return y
x = race_sel()
class Mage(x):
hp = 80 + x.hp
dg = 20 + x.dg
ar = .15 + x.ar
cs = .1 + x.cs
ak = 40 + x.ak
ev = .15 + x.ev
class Warrior(x):
hp = 100 + x.hp
dg = 20 + x.dg
ar = .2 + x.ar
cs = .1 + x.cs
ak = 30 + x.ak
ev = .15 + x.ev
def char_sel():
y = eval(input("Select Class: Mage, Warrior").capitalize())
return y
q = char_sel()
此半有效。在控制台中,它会询问“字符串”,然后如果我键入,则是人类还是精灵,它会.capitalize()
输入,并将x
设置为所选的类。然后,将x
插入Mage(x)
或Warrior(x)
中的一个类中。然后它将x.whatever
添加到所选的类。
然后,char_sel():
函数选择角色正在播放的类。
我遇到的问题是我想在函数race_sel()
和class_sel()
中使用if else语句,如果用户输入的不是“人类”或“小精灵”,则打印“无效”。选择,然后重试”,但似乎与eval()
一起使用代码中包含的所有Python类自动检查您的输入。因为eval()
将其更改为str类型。
我可以输入一个字符串,然后将其转换为eval()
类型吗?我对eval()
方法真的不是很熟悉。这只是我发现的东西,因此我可以使用用户控制台输入来调用类。
我敢肯定,有一种更简便的方法可以完成我正在编写的大部分内容。
答案 0 :(得分:1)
使用eval
is generally bad practice。最好这样做(它也可以解决您的问题):
def race_sel():
while True:
# the .lower() allows user to input hUmAn or something and it will still work
type = input('Select Race: Human, Elf ').lower()
if type == 'human':
return Human
elif type == 'elf':
return Elf
else:
print('Invalid selection, try again')
对char_sel
使用类似的过程。
顺便说一句,没有eval
类型的东西。如果成功,eval
将返回一个典型的Python对象(类型取决于eval
的参数内容。)
答案 1 :(得分:1)
我了解使用内省来避免重复自己的吸引力。不要使用eval()
,只需检查用户输入的内容是否在globals()
中即可。
def race_sel():
prompt = "Select race: Human, Elf "
race = input(prompt).capitalize()
while race not in globals():
print(race, "is not a valid race. Try again.")
race = input(prompt).capitalize()
return globals()[race]
对于进一步的不重复活动,请从基类派生所有类,然后使用isinstance()
确保用户实际上已经参加了有效的比赛。 (或者,您可以将所有种族都放在Race
类中,而将外部种族简单地用作命名空间。)您还可以使用自省功能动态生成提示,因此定义新种族自动更新菜单。