2012-03-24 28 views
2

我正在处理的一个version子手的Python版本,工作的.txt文件的单词列表。出于某种原因,在初次玩游戏后的剧本中,脚本不会显示某些字母。其他一切都按我想要的方式工作,或多或少。Python的hang子手不透露字母

我的代码:

import random 

wordlist = open("wordlist.txt").read().split() 
word = random.choice(wordlist) 
strikes = 0 
hidden_letters = [] 
alphabet = "abcdefghijklmnopqrstuvwxyz" 
guesses = [] 

def new_word(): 
    global word 
    global guesses 
    word = random.choice(wordlist) 
    for letter in set(word): 
     if letter in alphabet: 
      hidden_letters.append(letter) 
    guesses = [] 

def current_progress(): 
    for letter in word: 
     if letter in hidden_letters: 
      print '_', 

     elif letter == ' ': 
      print ' ', 

     else: 
      print letter, 
    print "\n" 

def play_again(): 
    global strikes 
    print "Would you like to play again?" 
    answer = raw_input("y/n: ") 
    if answer == "y": 
     strikes = 0 
     main() 
    elif answer == "n": exit(0) 
    else: 
     print "That's not a valid answer." 
     play_again() 

def letter_in_word(x): 
    global strikes 
    global hidden_letters 
    if x in word: 
     hidden_letters.remove(x) 
     print "That letter is in the word." 
     current_progress() 
     if hidden_letters == []: 
      print "You win!" 
      play_again() 
     else: 
      print "You have %d strike(s)." % strikes 

    elif not x in word: 
     print "That letter is not in the word." 
     current_progress() 
     strikes = strikes + 1 
     print "You have %d strike(s)." % strikes 

def main(): 
    new_word() 
    current_progress() 
    global strikes 
    while strikes < 6 and not hidden_letters == []: 
     print "Guess a letter. \n Letters that have been already guessed are:", guesses 

     guess = raw_input("> ") 

     if guess in alphabet and len(guess) == 1: 
      if not guess in guesses: 
       guesses.append(guess) 
       letter_in_word(guess) 

      else: 
       print "You've already guessed that letter. Pick another." 
       current_progress() 
       print "You have %d strikes." % strikes 

     else: 
      print "Sorry, that's not a valid guess." 
      current_progress() 
      print "You have %d strikes." % strikes 

    if strikes == 6: 
     print "Oop! You lose." 
     print "The answer was:", word 
     play_again() 

print "Welcome to Hangman!" 
print "Six strikes and you lose." 
print "----------"  
main() 
+1

你能给我们提一个你遇到的问题的具体例子吗?或者尝试使用调试器来缩小问题的范围? – prelic 2012-03-24 20:01:12

回答

2

您的问题:当玩家猜测存在于当前词和前一个字的信,但前一个字没有猜到(玩家失去了游戏) ,该字母仍然在hidden_letters列表中,因为remove(x)仅删除该字母的第一个实例。换句话说,在某些执行过程中,您的列表包含两个相同的字母,这违反了您的代码的隐含要求。在添加新单词的字母之前,您可以通过在您的new_word()函数中添加hidden_letters = []来解决此问题。

Python tutorial(重点煤矿):

list.remove(x)

中值为X列表中删除第一项。如果没有这样的项目,则是错误 。

+0

而且,通过使用一套可以完全消除整个事件,这将防止重复的可能性。 – 2012-03-24 22:06:52

+0

谢谢,这很好地解决了我的问题。 – thepotato329 2012-03-25 01:41:14

2

或者说,我想你可以对new_word()的beggining添加语句

del hidden_letters[:] 

。它将清除hidden_letters列表。