在收到无效输入后,如何阻止程序跳转到其他if语句



我是Stackoverflow和Python的新手。作为我自己的第一个程序,我写了一个文本游戏,你可以输入(a(或(b(,并以此方式决定你的角色做出的决定。它运行得很好,但我有一个问题。如果用户输入,例如;a";关于第一个决定;b";对于第二个决策,但对于第三个决策无效,下一个有效输入将再次触发第一个决策,而不是第三个。我试着做一个简短的版本来描述我的问题。感谢您的帮助。

def test():
while True:
input_zero = input("1. > ")
if input_zero == "a":
print("a")
input_a = input("2. > ")
if input_a == "a":
print("a, a")
break
elif input_a == "b":
print("a, b")
break
else:
print("Invalid input.")
elif input_zero == "b":
print("b")
input_b = input("2. > ")
if input_b == "a":
print("b, a")
break
elif input_b == "b":
print("b, b")
break
else:
print("Invalid input.")
else:
print("Invalid input.")

test()

因此,我认为,将您的选择打包到字典中(类似于下面所示(应该会使管理这里的选择稍微容易一些(几乎可以肯定有比这更好的方法(。然后在每次做出选择时添加到空字符串中,并尝试访问字典。如果选择在字典中,那么它将恢复一个文本字符串和一个结束状态,这将使我们能够在需要时结束游戏。

这种方法还通过使用itertools生成所有可能的状态组合来简化测试,这样您就可以找出缺失的状态。如果找到了end_state(元组第二个位置的值为1(,那么您将获得game-over消息,它将关闭循环。如果元素不在字典中,则会删除最后一个选择,并调用invalid_input函数。

def test():
choice_dict = {"a": (dP_lvl1.path_a, 0),
"b": (dP_lvl1.path_b, 0), 
"c": (dP_lvl1.path_c, 1)
"bb": (dP_lvl2.path_bb, 0),
"aa": (dP_lvl2.path_aa, 0),
"ba": (dP_lvl2.path_ba, 0),
"ab": (dP_lvl2.path_ab, 0),
"aaa": (dP_lvl3.path_aaa, 0),
"aab": (dP_lvl3.path_aab 0),
"aba": (dP_lvl3.path_aba, 0),
"abb": (dP_lvl3.path_abb, 0),
"bab": (dP_lvl3.path_bab, 0),
"bba": (dP_lvl3.path_bba} 0),
"bbb": (dP_lvl3.path_bbb, 0),
"aaaa": (dP_lvl4.path_aaaa, 0),
"abaa": (dP_lvl4.path_abaa, 0),
"aaba": (dP_lvl4.path_aaba, 0),
"aaab": (dP_lvl4.path_aaab, 1),
"bbba": (dP_lvl4.path_bbba, 0),
"bbab": (dP_lvl4.path_bbab, 0),
"babb": (dP_lvl4.path_babb, 0),
"abbb": (dP_lvl4.path_abbb, 0),
"abba": (dP_lvl4.path_abba, 1),
"abab": (dP_lvl4.path_abab, 0),
"aabb": (dP_lvl4.path_aabb, 0),
"baab": (dP_lvl4.path_baab, 0),
"bbaa": (dP_lvl4.path_bbaa, 1),
"baba": (dP_lvl4.path_baba, 0),
"baaa": (dP_lvl4.path_baaa, 0),
"bbbb": (dP_lvl4.path_bbbb, 0),}
# etc. you get the idea
decisions = ""
playing = True
while playing:
decision = input("choose an option 'a' or 'b':")
decisions += decision
try:
data, end_state = choice_dict[decisions]
print(data)
if end_state:
playing = False
print("Game over")
else:
continue
except KeyError:
decisions = decisions[:-1]
invalid_input()

最新更新