0

コンピューティングの評価のためにハングマン ゲームをプログラミングしようとしてきましたが、ちょっとした障害にぶつかりました。

基本的に、プログラムはユーザーに単語を要求し、ループを実行して、入力された単語と同じ長さのアスタリスクの文字列を作成します。

ユーザーが正しい文字の 1 つを入力すると、アスタリスクが正しい文字に置き換えられますが、単語の順序で置き換えられます。たとえば、単語が「嘘」で、ユーザーが「i」と入力すると、「*」が「i」に変更されます。

以下のようにコードします。

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()

コードの大部分をコメントしましたが、少しあいまいなことがあればお答えします。

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 を作成する際に使用できるヒントをいくつか紹介します。

LetterMask1) 大文字の変数 ( など)を使用しないでください。2 つの単語として読みたい場合は、代わりにlettermaskorを使用します。letter_mask

2) " " などのコメントvalidation_input = False #Setting the validation unput to "False"は役に立たず、コードを乱雑にするのに役立ちます。変数を False に設定していることは明らかです。これはまさにコードが示すとおりです。何をしているのかがより不明確な場合は、コメントの方が役立つ場合があります。これ (コメント) は実際にはプログラミングの最も難しい部分の 1 つであり、私はまだ苦労しています。

3) を使用しprint ""ます。改行を印刷するだけの場合は、単純に (改行を印刷する) を使用するか、印刷する文字列内の任意の場所に " " (改行文字; とてもクールです)printを追加して改行を印刷することができます。 \n. 私が何を意味するかを確認するために試してみてください。

if something == False4)単純に言うことができるようにブール値をテストする代わりにif not something、これははるかに明確です。同様に、テストしているif something == True場合は、単にif something.

5) 上記の解決策では、「現在の場所から目的の場所に移動するにはどうすればよいか」ではなく、「何を取得しようとしているのか」を自問しました。その違いは微妙で、「アイザックはバカだ」と言っているかもしれませんし、私はこれをうまく表現していないかもしれませんが、それは重要な違いです (私は思います!)。

Python/プログラミングの学習を頑張ってください!

于 2013-01-25T17:41:05.113 に答える
1

あなたは近づいていますが、そこまでではありません。ここにいくつかのヒントがあります:

lives1)デクリメントする必要がありますguess_part()

2) これ:

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

あなたが望むように機能していません。次のように置き換えるような簡単なものをお勧めします。

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

3) また、(上記の) 文字数の「-1」に注意してください。文字列は 0 ベースであるため、1 つずれています。

これらのいくつかの調整により、ほとんどの場合はそこにいます。

于 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 に答える