我不喜欢使用很多IF语句。以下是我现在正在玩的东西,在必须使用大量IF语句来完成它的过程中:
首先,一些变量......
pick_level = 1
lockpicking_level1_maxxp = 40
lockpicking_level2_maxxp = 70
lockpicking_level3_maxxp = 100
现在我们开始选择锁定。当选择1和任何直到当前开锁技能等级的最大xp除以2之间的任意数字时,会发生成功的选择。所以对于1级,它是1到20之间的任何东西 - 2级,1到35之间的任何东西,以及3到50之间的任何东西。以下是IF语句的外观:
x = random.randint(1, 100)
if pick_level == 1:
if x not in range(1, (lockpicking_level1_maxxp / 2)):
print 'You failed to pick the lock'
...
elif pick_level == 2:
if x not in range(1, (lockpicking_level2_maxxp / 2)):
etcetc
我想做的是根据pick_level的值确定xp,而不必一遍又一遍地询问同一个问题。它会像这样下去(使用bash中的重音符号):
if x not in range(1, (lockpicking_level`pick_level`_maxxp / 2)):
这样我可以通过让代码根据pick_level的值自动变为'lockpicking_level1_maxxp','lockpicking_level2_maxxp'或'lockpicking_level3_maxxp'来避免所有的IF语句。
我已经有一段时间了,因为我已经完成了bash脚本,所以我对它如何工作的记忆可能有些偏差。另外我知道``在Python中直到版本3与使用repr()基本相同,所以不会如何做到这一点。有什么方法可以做到这一点,还是我一直在写这些丑陋的IF语句?
我想我可以使用dict,因为:
lockpicking_maxxp = {1:20, 2:35, 3:50}
...
if x in range(1, lockpicking_maxxp[pick_level]):
...但我不知道这是否正是我将如何设置我的技能数据库(尽管可能最终成为JSON文件。我喜欢JSON。)< / p>
非常感谢你的时间。我期待着更多地了解这个想法。
答案 0 :(得分:4)
Don't repeat yourself。尽可能使用数据结构而不是单个对象:
lockpicking_maxxp = {
1: 40,
2: 70,
3: 100
}
x = random.randint(1, 100)
if x > lockpicking_maxxp[pick_level] / 2:
print 'You failed to pick the lock'
...
当然,你可能在这个游戏中有其他技能,所以你可能想要更像的东西:
maxxp = {
'lockpicking': {
1: 40,
2: 70,
3: 100
}, 'trap_searching': {
1: 50,
...
}, ...
}
skill = 'lockpicking'
x = random.randint(1, 100)
if x > maxxp[skill][level[skill]] / 2:
print 'You failed to pick the lock'
...
答案 1 :(得分:2)
您可以使用locals()将本地符号表作为dict并使用它来获取变量值。即:
>>> pick_level = 1
>>> lockpicking_level1_maxxp = 40
>>> lockpicking_level2_maxxp = 70
>>> lockpicking_level3_maxxp = 100
>>> locals()["lockpicking_level%d_maxxp" % pick_level]
40
答案 2 :(得分:2)
每当您觉得需要为变量添加数字时,您应该只使用一个列表:
pick_level = 1
lockpicking_levels = [0,40, 70, 100]
test = random.randint(1, 100)
if test < lockpicking_levels[pick_level] / 2:
print "you failed"
else:
...