0

I've been trying to program a Hangman Game for my Computing assessment, and I've hit a bit of a roadblock.

Basically, the program asks for a word from the user, and then runs a loop to create a string of asterisks, the same length of the inputted word.

Once one of the correct characters is inputted by the user, it will replace an asterisk with the correct character, but in order with the word. For example, if the word is "lie", and the user enters "i", it will change "*" to "i".

Code as below.

def guess_part(word):
    lives = 6
    LetterCount = 0
    LetterMask = ""
    for x in range(len(word)):
        LetterMask = LetterMask + "*"
    print LetterMask
    while lives != 0 and LetterMask.find("*")!=-1:
        LetterGuess = raw_input("Enter a letter to guess?")
        LetterCount = 0
        for char in word:
            LetterCount = LetterCount + 1
            if LetterGuess == char:
                print "Good Guess."
                LetterMask = LetterMask.replace(LetterMask[LetterCount], LetterGuess)
                print LetterMask

def rand_word():
    from random import randrange #import the randrange function, from "random"
    random_words = ['extraordinary','happy','computer','python','screen','cheese','cabaret','caravan','bee','wasp','insect','mitosis','electronegativity','jumper','trousers'] #list of different words which can be used by the program for the end user to guess.
    word = random_words[randrange(0, 15)] #pick a random number, and use this number as an index for the list, "random_words".
    guess_part(word) #call the function, "guess_part" with the parameter "word"

def user_word():
    print "All words will be changed to lowercase."
    print "Enter the word you would like to guess."
    print ""
    validation_input = False #Setting the validation unput to "False"
    while validation_input == False: #while the validation input is not False, do below.
        word = raw_input("") #Ask for input, and set the value to the variable, "word".
        if word.isalpha(): #If word contains only strings, no numbers or symbols, do below.
            word = word.lower() #set the string of variable, "word", to all lowercase letters.
            guess_part(word) #call the function, "guess_part" with the parameter, "word".
            validation_input = True #Break the while loop - set validation_input to "False".
        else: #if the above isn't met, do the below.
            print "Word either contained numbers or symbols."

def menu():
    print "Hangman Game"
    print ""
    print "Ashley Collinge"
    print ""
    print "You will have 6 lives. Everytime you incorrectly guess a word, you will lose a life."
    print "The score at the end of the game, is used to determine the winner."
    print ""
    print "Would you like to use a randomly generated word, or input your own?"
    print "Enter 'R' for randomly generated word, or 'I' for your own input."
    decision_bool = False #Set the decision_bool to "False".
    decision_length = False #Set the decision_length to "False".
    while decision_bool == False: #While decision_bool equals "False", do below.
        decision = raw_input("") #Ask for input, value set to the variable "decision".
        while decision_length == False: #While decision_length equals "False", do below.
            if len(decision) == 1: #If the length of decision eqausl 1, do below.
                decision_length = True #Set decision_length to "True."
                decision = decision.capitalize() #Capitalize the string value of decision.
                if decision == "R": #if the value of decision, eqauls "R".
                    print "You chose randomly generated word."
                    print ""
                    print "Forwarding..."
                    decision_bool = True #Set decision_bool to "True".
                    print ""
                    rand_word() #Call the function, rand_word()
                elif decision =="I": #If decision equals "I", do below.
                    print "You chose to input your own word."
                    print ""
                    print "Forwarding..."
                    decision_bool = True #Set decision_bool to "False".
                    print ""
                    user_word() #Call the function, user_word()
                else:
                    print "You entered an incorrect value for the question. Try again."
            else:
                print "You entered an incorrect value for the question. Try again."

menu()

I've commented the majority of the code, but if there's anything that's a bit vague, I'll answer.

4

3 回答 3

2

我不会为你写出你的整个程序,但简而言之:

假设word是单词(例如word = 'liar')。然后我们需要一个函数,将一个单词和一组猜测的字母翻译成一串星号+已猜测的字母。

def asterisker(word, guesses=[]):
    result = ""
    for letter in word:
        result += letter if letter in guesses else "*"
        # which does what the below does:
        # if letter in guesses:
        #     result += letter
        # else:
        #     result += "*"
    return result

给我们:

In [4]: asterisker("liar")
Out[4]: '****'

In [7]: asterisker("liar", ["l", "r" ])
Out[7]: 'l**r'

我可能会这样写,尽管上面的原文可能更好/更清晰。

def asterisker(word, guesses=[]):
    return "".join(l if l in guesses else "*" for l in word)

lives编辑:另外,正如迈克(首先)指出的那样,如果有人猜错了,你确实需要减少“ ”。


此外,这里有一些在编写 Python 时可以使用的技巧。

1) 不要使用大写的变量(如LetterMask);而是使用lettermaskorletter_mask如果您希望将其读取为两个单词。

2)诸如“ validation_input = False #Setting the validation unput to "False"”之类的注释没有帮助,并且会使您的代码混乱。很明显,您将变量设置为 False,因为这正是代码所说的。如果您正在做的事情更不清楚,评论可能会更有用。这(评论)实际上是编程中最难的部分之一,也是我仍在努力解决的问题。

3)您使用print "";如果您只是想打印一个换行符,您可以简单地使用print(它将打印一个换行符),或者\n在您正在打印的字符串中的任何位置添加一个“”(一个换行符;这很酷)来打印一个换行符. 试试看我的意思。

4)而不是像if something == False你可以简单地说测试布尔值if not something,这更清楚。同样,如果您正在测试if something == True,您可以简单地说if something.

5)在我上面的解决方案中,我问自己“我想得到什么”,而不是“我如何从我所在的地方到达我想去的地方”。区别是微妙的,你可能会说“艾萨克是个白痴”,我的措辞可能不好,但这是一个重要的区别(我认为!)

祝你学习 Python/编程好运!

于 2013-01-25T17:41:05.113 回答
1

你很近,但不完全在那里。这里有一些提示:

1)你需要lives减少guess_part()

2)这个:

LetterMask = LetterMask.replace(LetterMask[LetterCount], LetterGuess)

没有按照你想要的方式工作。我会建议一些简单的东西,比如将其替换为:

LetterMask = list(LetterMask)
LetterMask[LetterCount-1] = LetterGuess
LetterMask = "".join(LetterMask)

3)还要注意(上面)字母计数中的“-1”,因为字符串是从 0 开始的,所以你会差一个。

通过这几个调整,你基本上就在那里。

于 2013-01-25T17:55:41.923 回答
0

猜测您的问题出在guess_part()函数上,这是一个有效的版本:

def guess_part(word):
    lives = 6
    # Make a mutable array of characters same length as word
    LetterMask = bytearray("*" * len(word))
    while lives > 0 and LetterMask != word:
        print LetterMask
        while True:
            LetterGuess = raw_input("Enter a letter to guess: ")
            if LetterGuess: break
        LetterGuess = LetterGuess[0] # only take first char if more than one
        if LetterGuess in LetterMask:
            print "Sorry, you already guessed that letter. Try again."
            countinue
        GoodGuess = False
        for i, char in enumerate(word):
            if char == LetterGuess:
                GoodGuess = True
                LetterMask[i] = char
        if GoodGuess:
            print "Good guess."
        else:
            print "Sorry, bad guess"
            lives -= 1
    GuessedWholeWord = LetterMask == word
    if GuessedWholeWord:
        print "Congratulations, you guessed the whole word!"
    else:
        print "Sorry, no more guesses. You're hanged!"
    return GuessedWholeWord
于 2013-01-25T18:18:10.503 回答