Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
hangman项目存在问题,在python中,每次字母都会重置_Python_Python 3.x - Fatal编程技术网

hangman项目存在问题,在python中,每次字母都会重置

hangman项目存在问题,在python中,每次字母都会重置,python,python-3.x,Python,Python 3.x,我正在做一个刽子手计划。当用户输入一个字母时,即使输入下一个字符,它也应该出现,但问题是它会完全重置。如何解决此问题?脚本的主要问题是没有跟踪猜测字母,因此,每次迭代都会“重置”这些字母。在循环外部定义一个变量,用于跟踪猜测的字母。在本例中,guessed_chars是一个列表,该列表使用由目标单词长度确定的可变下划线量进行初始化: import random list_of_words = ["ability", "able", "above

我正在做一个刽子手计划。当用户输入一个字母时,即使输入下一个字符,它也应该出现,但问题是它会完全重置。如何解决此问题?

脚本的主要问题是没有跟踪猜测字母,因此,每次迭代都会“重置”这些字母。在循环外部定义一个变量,用于跟踪猜测的字母。在本例中,
guessed_chars
是一个列表,该列表使用由目标单词长度确定的可变下划线量进行初始化:

import random

list_of_words = ["ability", "able", "above", "administration", "against", "agency", "along",
                "almost", "answer"]


guessword = random.choice(list_of_words)

while True:
    result = input("Enter your guess: ")

    for word in guessword:

        if word in result:
            print(word)

        else:
            print("_")
现在是while循环。在本例中,我使用了
枚举
,它允许您并行地迭代iterable的索引和元素。请注意,我们还将while语句更改为
while'。join(猜测字符)!=word
。我们必须在这里使用
join
,因为记住,
gusted_chars
是一个
列表
,我们将其与
str
进行比较。这意味着它将继续运行,直到正确猜测的字母的连接列表等于单词

使用
枚举
,以便我们可以将
猜字符
中正确位置的下划线替换为正确猜字符。然后,在循环结束时,我们只需打印连接的字符列表,使其看起来像:
ab\uuuu
表示“以上”


你需要记住你已经猜到的单词,所以这里我用dict
players\u guess
来存储它们

while "".join(guessed_chars) != word:
    guess_char = input("Enter your guess: ")

    for i, char in enumerate(word):
        if char == guess_char:
            guessed_chars[i] = guess_char
            
    print("".join(guessed_chars))
输出如下所示:

import random

list_of_words = ["ability", "able", "above", "administration", "against", "agency", "along",
                "almost", "answer"]


guessword = random.choice(list_of_words)
players_guess = { }

while True:
    result = input("Enter your guess: ")

    for word in guessword:

        if word in result or word in players_guess:
            players_guess[result] = True
            print(word)

        else:
            print("_")

您缺少一些步骤:

版本1 给出:

import random

list_of_words = ["ability", "able", "above", "administration", "against", "agency", "along", "almost", "answer"]


guessword = random.choice(list_of_words)

while True:
    result = input("Enter your guess: ")
    
    if result == guessword:
        print(guessword)
        break
    elif result == 'exit':
        break

    for i, letter in enumerate(guessword):
        if i > len(result) - 1:
            print("_", end='')
        else:
            if letter == result[i]:
                print(letter, end='')
            else:
                print("_", end='')
    
    print('\n')
版本2 正如在评论中提到的,游戏规则应该是不同的,所以这里是相同的方法导致了一些不同的结果

Enter your guess: ability
ab___

Enter your guess: able
ab___

Enter your guess: above
above
给予

评论
  • while
    循环允许您灵活:无限播放或添加一些猜测次数的验证(因此您的选择是好的)
  • 但是,您不应该忘记退出这个无限循环(因此这里的关键字非常方便)
  • 用户可以输入几个字母(这可能违反规则),所以我们需要检查它
  • 用户可以输入大写字母,所以我们需要它
  • 我在这段代码中使用:它有助于遍历元素及其索引

您的意思是“结果”中的输入下次应该在“猜测词”中可用吗?它每次都会重置,因为您没有在每次迭代中保存结果。您需要将结果存储在某个位置(例如在数组中),并在每次用户输入时更新此结果。不清楚问题出在哪里。请提供您当前输出和预期输出的更多详细信息。虽然不是强制性的,但有意义的名称有助于理解程序。例如,您的
For word in guessword
更适合于
For letter in guessword
,因为对字符串的迭代会对其字符进行迭代。在保存猜测的字母时,它不会在下次运行时显示单词中的猜测字母。我想这就是OP想要的。因此,如果您在下一轮中猜测
a
able
和猜测
b
,您的代码将显示
\u b_uuuuuuuuu
,而不是
ab_uuuuuu
@funie200 ohhhhh好的,谢谢您的澄清。我会编辑accordingly@funie200编辑。再次感谢你指出这一点。嗯,为什么要用“-1”?代码完全按照要求执行:打印字母并在错误的字母中填入“\u1”。OP没有要求将结果保存在字典或列表中,只使用代码回答对OP没有帮助,它只是给了他们答案。如果你解释一下你的代码在做什么,那会更有帮助。另外,需要指出的是(不是否决投票的原因,因为最初的问题不够清楚):绞刑犯是通过一次猜一个字母来玩的,直到你正确猜到的字母组成了你要猜的单词。不允许用户一次猜测多个字符。这意味着您确实需要在循环之外的某个地方跟踪猜测的字母?我认为OP或多或少了解
,而
循环和
打印方法是如何工作的。另外,我在最后添加了一些评论。关于你最后的评论,我同意。然而,我接受了OP的逻辑:验证每个字母,如果猜对了,打印出来。虽然对我们来说可能很简单,但对OP来说可能不是。我认为,对于正在开始学习过程的人来说,对某些事情有一些解释会更清楚。例如,您添加了
enumerate
和各种
break
语句,这些语句对OP来说可能都是全新的。虽然StackOverflow是一个寻找答案的好地方,但它也是一个非常有用的学习工具。在你的答案的开头,一个简单的解释,记录下你所做的改变,以及你为什么做这些改变,这将是非常棒的!
import random

list_of_words = ["ability", "able", "above", "administration", "against", "agency", "along", "almost", "answer"]


guessword = random.choice(list_of_words)

while True:
    result = input("Enter your guess: ")
    
    if result == guessword:
        print(guessword)
        break
    elif result == 'exit':
        break

    for i, letter in enumerate(guessword):
        if i > len(result) - 1:
            print("_", end='')
        else:
            if letter == result[i]:
                print(letter, end='')
            else:
                print("_", end='')
    
    print('\n')
Enter your guess: ability
ab___

Enter your guess: able
ab___

Enter your guess: above
above
import random

list_of_words = ["ability", "able", "above", "administration", "against", "agency", "along", "almost", "answer"]

guessword = random.choice(list_of_words)
user_word = ['_']*len(guessword)

while True:
    user_guess = input("Enter your guess: ")
    
    if user_guess == 'exit':
        break
    elif len(user_guess) != 1:
        print('Your guess should be one letter long!')
        continue

    for i, letter in enumerate(guessword):
        if user_guess.lower() == letter:
            user_word[i] = letter
        
        print(user_word[i], end='')
            
    print('')
    if not '_' in user_word:
        print('You win!')
        break
Enter your guess: ab
Your guess should be one letter long!
Enter your guess: a
a____
Enter your guess: b
a____
Enter your guess: l
al___
Enter your guess: g
al__g
Enter your guess: o
alo_g
Enter your guess: n
along
You win!