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

标签 python if-statement error-handling

我是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),那么您将获得游戏结束消息,并结束循环。如果元素不在字典中,则删除最后一个选择,并调用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()
    

关于python - 在收到无效输入后,如何阻止程序跳转到其他if语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64248824/

相关文章:

java - 正则表达式替换开始和结束之间的新行

python - 修改 yield from 的返回值

JAVA:如果有余数打印一行代码,我该如何编写if语句?

R 循环太长

python - Python套接字错误-如何修复

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

python - 在 python 中同时产生两个变量时出错

python - 问题读取 csv 文件

php - 如何在数组中创建一个新字段?

mysql GROUP BY 子句验证