2014-10-30 58 views
0

這裏是我的代碼:Python的劊子手遊戲收尾

def randWord(): 
"""opens a file of words and chooses a random word from the file""" 
    infile = open('dictionary.txt','r') 
    wordList = infile.read() 
    wordList2 = wordList.split('\n') 
    infile.close() 
    randWord = str(random.choice(wordList2)) 
    return randWord 

def hangman(): 
"""initiates the game by explaining the rules and terminates when game is over""" 
    global roundsWon 
    global roundsPlayed 
    print('\nWelcome to hangman! The rules are simple: A word will be chosen at random and will be represented by a sequence of blanks. Each blank constitutes a letter in the word. You will be asked to enter a letter and if the letter is contained in the word you will be notified. You can only make an incorrect guess 8 times before you lose the round. To win the round you must guess all the letters and reveal the word. Good luck!\n\n') 
    word = randWord() 
    while True: 
     guess = letterGuess(word) 
     if checkGuess(guess,word): 
      roundsWon += 1 
      roundsPlayed +=1 
      print('\nYou won! The word is {}.'.format(word)) 
      break 
     elif guessesLeft == 0: 
      print("\nI'm sorry, but you have run out of guesses. The word was {}.".format(word)) 
      roundsPlayed +=1 
      break 

def letterGuess(word): 
"""asks the user to guess a letter and prints the number of guesses left""" 
    blankedWord(word) 
    guess = input('\nGuess a letter: ') 
    return guess 

def blankedWord(word): 
"""converts the random word into the proper blanked form based on the letter guessed and lets the user know if their letter is in the word""" 
    displayWord='' 
    for letter in word: 
     if guessedLetters.find(letter) > -1: 
      displayWord = displayWord + letter   #checks if the letter guessed is contained in the random word string by index. 
      print('\n{} is contained in the word!'.format(letter)) 
     else: 
      displayWord = displayWord + '-' 
    print(displayWord) 

def checkGuess(guess,word): 
"""checks if the user enters a single letter guess or the full word""" 
    if len(guess) > 1 and len(guess) == len(word): 
     return completeWordGuess(guess,word) 
    else: 
     return oneLetterGuess(guess, word) 

def completeWordGuess(guess,word): 
"""analyzes the complete word guess to check if is correct""" 
    global guessesLeft 
    if guess.lower() == word.lower(): #kept it lower case for simplicity 
     return True 
    else: 
     guessesLeft -=1 
     return False 

def oneLetterGuess(guess,word): 
"""checks to see if the single letter guess is included in the whole word""" 
    global guessedLetters 
    global guessesLeft 
    global guessesMade 
    if word.find(guess) == -1: #checks for failure on .find function 
     guessesLeft -= 1 
     guessesMade += 1 
     print('\nThat letter is not in the word. You have made {} incorrect guesses and have {} guesses left.'.format(guessesMade,guessesLeft)) 

    guessedLetters = guessedLetters + guess.lower() 
    if allGuessedLetters(word): 
     return True 
    return False 

def allGuessedLetters(word): 
"""checks if all of the letters in the word have been uncovered/guessed""" 
    for letter in word: 
     if guessedLetters.find(letter) == -1: #checks for failure on .find function 
      return False 
     return True 

def gameStats(): 
"""prints the final statistics of a play session""" 
    print('\nYou have played {} games and you have won {}  rounds!'.format(roundsPlayed,roundsWon)) 

import random 
guessesMade = 0 
guessesLeft = 8 
roundsPlayed = 0 
roundsWon = 0 
guessedLetters = '' 
userMode = 1 

while userMode==1: 
    if userMode == 1: 
     hangman() 
     guessesLeft = 8 
     guessedLetters = '' 
     userMode = eval(input('\nEnter 1 to play again, type 0 to end the game: ')) 
    else: 
     break 
gameStats() 

程序看似運行良好,除了一個部分:如果用戶猜單詞的第一個字母的程序將其視爲完全正確的字和將其視爲勝利。所以如果我說這個詞是'犀牛',我猜'r'它會表現爲一場勝利。我沒有看到這個錯誤,但是我有一種感覺,它在函數completeWordGuess中,我不確定是否應該爲第一個條件返回True。任何幫助表示讚賞。

回答

1

我認爲主要的問題 - 我說我覺得因爲我沒有機會撕開你的代碼,尋找其他方式,它不工作,我可能不會 - 是你已經把你的在錯誤的地方返回所有錯誤的信函中的虛假呼叫。這是你有什麼:

def allGuessedLetters(word): 
"""checks if all of the letters in the word have been uncovered/guessed""" 
for letter in word: 
    if guessedLetters.find(letter) == -1: #checks for failure on .find function 
     return False 
    return True 

的問題是,如果第一個字母不返回false,控制流程移動返回true,因爲「迴歸真實」是的每次迭代的一部分循環。該方法不返回True的唯一方法是如果第一個字母還沒有被猜出。

如果你改變它,像這樣:

def allGuessedLetters(word): 
    """checks if all of the letters in the word have been uncovered/guessed""" 
    for letter in word: 
     if guessedLetters.find(letter) == -1: #checks for failure on .find function 
      return False 
    return True 

方法按預期工作,因爲控制流僅移動一次for循環已經遇到一位信已評估的全部返回True,如果它們中的任何一個不匹配,則導致終止。

+0

啊,是的,我現在看到它。謝謝,完美的作品。 – Droxbot 2014-10-30 05:09:54

+0

沒問題!祝你好運。 – furkle 2014-10-30 05:11:10