首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法突破时间循环

无法突破时间循环
EN

Stack Overflow用户
提问于 2017-04-29 04:30:03
回答 5查看 1.4K关注 0票数 1

我编写了下面的python代码。它需要一张我在网上找到的英文单词的清单,然后把它们列成一个清单,这样我就可以用它们来做绞刑了。我的问题是,每次我运行这个程序并成功地猜出这个单词时,它都不会跳出while循环。只会继续下去。我不知道为什么我的一生。有谁知道为什么没有把最后的信息打印给获胜者呢?

代码语言:javascript
复制
import random

words = []

lettersGuessed = []

isGuessed = 0



wordFile = open(r'C:\Users\Sarah\PycharmProjects\hangman\words.txt')

for word in wordFile:
    words.append(word.rstrip(wordFile.readline()))


mysteryWord = random.choice(words)

while len(mysteryWord) <= 1:
    mysteryWord = random.choice(words)

for letter in mysteryWord:
    print("?", end = "")
print("\n")

def isWon():
    #win conditions
    count = 0
    for letter in mysteryWord:
        if letter in lettersGuessed:
            count += 1

        if count == len(mysteryWord):
            isGuessed = 1



count = 0

while isGuessed == 0:


    guess = input("Guess a letter \n")

    if guess.upper() or guess.lower() in mysteryWord:
        lettersGuessed.append(guess)
        for letter in mysteryWord:
            if letter in lettersGuessed:
                print(letter, end ='')
            else:
                print("?", end = '')
    print("\n")
    count = 0
    isWon()
    if isGuessed == 1:
        break

print("Congratulations, you correctly guessed ", mysteryWord)
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-04-29 05:06:51

顶层代码中的isGuessedisWon函数中的isGuessed是两个不同的变量。函数是一个单独的命名空间(否则,一个使用公共名称(如i )的变量的函数会在其他代码中造成严重破坏)。

这可以通过global声明来解决,但这是一个非常糟糕的风格。mysteryWordlettersGuessed等变量也是如此。

相反,您应该从isWon函数返回值:

代码语言:javascript
复制
def isWon(mysteryWord, lettersGuessed):
   # do your counting...
   return isGuessed

# main code
victory = False
while not victory:
   # ...
   victory = isWon(mysteryWord, lettersGuessed)
   # you don't even need the if ... break statement

顺便说一句,你的支票中所有的字母猜测都可以是一条线:

代码语言:javascript
复制
def isWon(mysteryWord, lettersGuessed):
    return set(lettersGuessed) == set(mysteryWord)
票数 0
EN

Stack Overflow用户

发布于 2017-04-29 05:03:33

当前的问题是,不管输入是什么,isWon()都不设置isGuessed。如果你用"foo“字串猜

代码语言:javascript
复制
lettersGuessed.append(guess)

将使lettersGuessed成为一个包含一个项(即字符串)的列表。我觉得你想做的是

代码语言:javascript
复制
lettersGuessed.extend(list(guess))

guess中的每个字母添加到lettersGuessed列表中。

还有两点值得一提:

  • 如果您在问题中猜到单词的一个字谜,isWon()将考虑游戏的胜负,例如,如果单词为"foo“,"oof”将被认为是一个正确的解决方案。
  • words.append(word.rstrip(wordFile.readline()))读取输入文件的每一行偶数行,并在删除与以下单词相同的字符后将其添加到words列表中。你想要做words.append(word.strip())代替。
票数 0
EN

Stack Overflow用户

发布于 2017-04-29 05:19:40

都是关于范围的。isGuessed用于isWon()是在本地范围中定义的。如果要影响在全局范围中声明的isGuessed,则必须将其作为参数传递给isWon(),或者在修改isGuessed之前使用global关键字。见下文:

代码语言:javascript
复制
def isWon():
#win conditions
count = 0
for letter in mysteryWord:
    if letter in lettersGuessed:
        count += 1

    if count == len(mysteryWord):
        global isGuessed
        isGuessed = 1    

这一变化的产出如下:

代码语言:javascript
复制
python3 test.py
?????

Guess a letter
1
?????

Guess a letter
2
?????

Guess a letter
3
????3

Guess a letter
4t
????3

Guess a letter
t
t??t3

Guess a letter
e
te?t3

Guess a letter
s
test3

Congratulations, you correctly guessed  test3
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43691803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档