Python 我的刽子手程序被困在要求输入而不打印任何我猜的字母

Python 我的刽子手程序被困在要求输入而不打印任何我猜的字母,python,Python,我对编程很陌生,我试着制作一个像hangman这样的程序。然而,我就是不明白为什么它不起作用。它所做的只是请求输入,然后什么也不做。输入只是一次又一次地循环,我输入的任何内容都不会改变。 另外,关于如何改进代码的任何建议都是受欢迎的,我觉得我在这里犯了很多错误 import random word_list = ["car", "house", "shop", "shoes", "tractor", "microphone", "camera"] game_state = True bl

我对编程很陌生,我试着制作一个像hangman这样的程序。然而,我就是不明白为什么它不起作用。它所做的只是请求输入,然后什么也不做。输入只是一次又一次地循环,我输入的任何内容都不会改变。 另外,关于如何改进代码的任何建议都是受欢迎的,我觉得我在这里犯了很多错误


import random

word_list = ["car", "house", "shop", "shoes", "tractor", "microphone", "camera"]

game_state = True

blank_spaces = []
word_picked = ""
already_guessed = []
word_letters = []


def Word_picker():
    word_number = random.randint(0, (len(word_list) - 1))
    word_picked = word_list[word_number]
    word_picked = word_picked.lower()
    word_letters = [char for char in word_picked]

    print("\n")
    print(word_picked)
    print(word_letters)
    print("\n")
    for char in word_letters:
        blank_spaces.append("_ ")


def Printer():
    print("\n \n")
    for x in range(len(blank_spaces)):
        print(blank_spaces[x], end='')


def Main():

    guessed_letter = input("Try a letter:")
    guessed_letter = guessed_letter.lower()

    if guessed_letter in already_guessed:
        print("You've already tried this letter. Try a different one. \n")
        Main()

    for z in word_letters:
        if guessed_letter == word_letters[z]:
            blank_spaces[z] = guessed_letter + " "
            already_guessed.append(guessed_letter)
            Main()

        else:
            print("Incorrect.")
            already_guessed.append(guessed_letter)
            Main()


def Already_guessed():
    for a in already_guessed:
        print("Already guessed letters:" + already_guessed[a] + ", ", end='')


Word_picker()
Printer()

while game_state:
    Already_guessed()
    Printer()
    Main()

我做了一些改变:

  • 正如@Barmar所指出的,您永远不会返回
    Main()
    函数。我现在在循环中调用函数,直到gam_状态变为False

  • @Barmar还指出,您正在使用
    z
    作为索引,它为您提供了一个
    索引器
    z
    已经被猜到了,所以你不需要它

  • 您仅在
    Word_picker
    中本地更改列表,但此操作不起作用。我将其更改为返回相应的单词,现在您可以从
    Main()
    函数访问这些单词

  • 您将猜测的字母添加到for循环中,覆盖了单词的所有字母,这并没有破坏您的代码,但它使输出变得可怕,因为更多猜测会导致代码变得不必要的慢

  • 然后对输出进行一些更改,以便只在循环外打印一次文本,等等

  • 未来工作的一些提示:

  • 使用
    打印
    语句或
    导入pdb;pdb.set_trace()
    用于调试,这样您就知道代码在做什么了

  • 首先编写简短的小元素,然后立即进行测试,不要从头开始编写所有代码,然后再查看。尝试尽早测试运行您的代码,看看它是否按预期运行

  • 通常,只需调用一次主函数是一个很好的经验法则

  • 我做了一些改变:

  • 正如@Barmar所指出的,您永远不会返回
    Main()
    函数。我现在在循环中调用函数,直到gam_状态变为False

  • @Barmar还指出,您正在使用
    z
    作为索引,它为您提供了一个
    索引器
    z
    已经被猜到了,所以你不需要它

  • 您仅在
    Word_picker
    中本地更改列表,但此操作不起作用。我将其更改为返回相应的单词,现在您可以从
    Main()
    函数访问这些单词

  • 您将猜测的字母添加到for循环中,覆盖了单词的所有字母,这并没有破坏您的代码,但它使输出变得可怕,因为更多猜测会导致代码变得不必要的慢

  • 然后对输出进行一些更改,以便只在循环外打印一次文本,等等

  • 未来工作的一些提示:

  • 使用
    打印
    语句或
    导入pdb;pdb.set_trace()
    用于调试,这样您就知道代码在做什么了

  • 首先编写简短的小元素,然后立即进行测试,不要从头开始编写所有代码,然后再查看。尝试尽早测试运行您的代码,看看它是否按预期运行

  • 通常,只需调用一次主函数是一个很好的经验法则


  • 您的代码无法正常工作的原因有很多,但让我们来了解一些有关如何调试代码并使其正常工作的提示

    与IDE无关的调试方法是添加print语句,以帮助确定变量是否包含您认为应该包含的值

    尝试在Main()函数中,在word字母中z以
    开头的行之前添加此print语句
    print(“这是word字母:”,word字母)

    问问自己:

  • 我希望这会有什么回报
  • 这究竟返回了什么
  • 如果有任何意外,是什么原因造成的
  • 对于上面的print语句:您会发现您的word_字母返回一个空列表。 这就是你所期望的吗

    尝试使用if语句和函数调用执行此操作


    如果您完成Main()和函数调用,您应该能够很好地了解如何让程序运行:)

    您的代码不工作的原因有很多,但是让我们来看看如何调试代码并使其工作的一些技巧

    与IDE无关的调试方法是添加print语句,以帮助确定变量是否包含您认为应该包含的值

    尝试在Main()函数中,在word字母中z以
    开头的行之前添加此print语句
    print(“这是word字母:”,word字母)

    问问自己:

  • 我希望这会有什么回报
  • 这究竟返回了什么
  • 如果有任何意外,是什么原因造成的
  • 对于上面的print语句:您会发现您的word_字母返回一个空列表。 这就是你所期望的吗

    尝试使用if语句和函数调用执行此操作


    如果您完成Main()和函数调用,您应该能够很好地了解如何让程序运行:)

    您永远不会从
    Main()返回。所有条件都递归地调用自身。
    z
    是一个字母,而不是索引
    word\u字母[z]
    应报告错误。您从不检查所有字母是否都被猜中。此外,您不会更改列表
    word\u字母
    word\u拾取的
    ,如果您在
    Main()中检查它们,它们都将保持为空
    函数。暂时不要使用递归,只需使用
    while
    循环即可。您永远不会从
    Main()
    返回。所有条件都递归地调用自身。
    z
    是一个字母,而不是索引
    word_字母[z]
    应报告错误。您从不检查是否所有字母都被猜到了。此外,您不需要
    import random
    
    word_list = ["car", "house", "shop", "shoes", "tractor", "microphone", "camera"]
    
    game_state = True
    
    blank_spaces = []
    word_picked = ""
    already_guessed = []
    word_letters = []
    
    
    def Word_picker():
        w_number = random.randint(0, (len(word_list) - 1))
        w_picked = word_list[w_number]
        w_picked = w_picked.lower()
        w_letters = [char for char in w_picked]
    
        print("\n")
        print(w_picked)
        print(w_letters)
        print("\n")
        b_spaces = []
        for char in w_letters:
            b_spaces.append("_ ")
        print(b_spaces)
    
        return b_spaces, w_picked, w_letters
    
    
    def Printer():
        print("\n \n")
        for x in range(len(blank_spaces)):
            print(blank_spaces[x], end='')
    
    
    def Main():
    
        guessed_letter = input("Try a letter:")
        guessed_letter = guessed_letter.lower()
        print(already_guessed)
    
        if guessed_letter in already_guessed:
            print("You've already tried this letter. Try a different one. \n")
    
        for i, z in enumerate(word_letters):
            if guessed_letter == z:
                blank_spaces[i] = guessed_letter + " "
    
            else:
                print("Incorrect.")
    
        already_guessed.append(guessed_letter)
    
    
    def Already_guessed():
        print("Already guessed letters:")
        for a in already_guessed:
            print(a)
    
    
    blank_spaces, word_picked, word_letters = Word_picker()
    Printer()
    
    while game_state:
        Already_guessed()
        Printer()
        Main()