2016-12-09 4 views
0

Ich versuche, ein einfaches Hangman-Spiel in Python mit einem GUI mit tkinter zu programmieren. Ich habe den GUI-Rahmen mit einem Benutzereintrag eingerichtet. Das Problem ist, wenn ich einen Buchstaben einführe und dann den Code durch Drücken der Wiedergabetaste ausführe, läuft der Buchstabe durch den Code, bis der Code keine Leben mehr hat (10 Mal). Wie kann ich meinen Code so verbessern, dass ein Brief nur einmal durchlaufen wird und dann ein neuer Brief eingegeben werden kann, um ihn erneut zu erraten? dankeTkinter GUI für Hangman Spiel

from numpy import* 
from Tkinter import* 

#set up gui frame 

win=Tk() #create window assigned to variable win 
welc=Label(win,text="Welcome to Hangman!").grid(row=0) 
inst=Message(win,text="instructions: To play start by guessing a letter in the secret word. if the letter is in the word it will fill in a blank if not you lose a life. Continue guessing untill you have guessed the secret word.").grid(row=1) 
guess_text=Label(win,text="Enter a letter or Word").grid(row=2) 
blank_text=Label(win,text="Secret Word").grid(row=3) 
lives_text=Label(win,text="Lives Remaining").grid(row=4) 
e=Entry(win) 
e.grid(row=2,column=1) 

#library of secret words 
lib=['hanakah','christmas','holly','thanksgiving','reigndeer','family','presents','santa','kwanza', 'chocolate', 'cheesecake'] 
n=len(lib) 

#randomly pick secret word 
inx=random.randint(1,n) 
secret=lib[inx] 

#set up game 
lives_remaining=10 
guessed_letters='' 


#define function to play game 
def play(): 
    word=secret 
    while True: 
     guess=get_guess(word) 
     print guess 
     print type(guess) 
     if process_guess(guess,word): 
      Label(win,text="You Win!").grid(row=6) 
      break 
     if lives_remaining==0: 
      Label(win,text="You Lose!").grid(row=6) 
      Label(win,text="The secret word was: "+word).grid(row=7) 
      break 
Button(win,text=("Play"),command=play).grid(row=5,column=0) 

def get_guess(word): 
    blanks(word) 
    guess=e.get() 
    return guess 

#diplay guessed letter in postion of word 
def blanks(word): 
    Label(win,text=lives_remaining).grid(row=4,column=1) 
    display_word='' 
    for letter in word: 
     if guessed_letters.find(letter)> -1: 
        #LETTER found 
      display_word=display_word+letter 
     else: 
      #letter not found 
      display_word=display_word+'-' 
    Label(win,text=display_word).grid(row=3,column=1) 

def process_guess(guess,word): 
    if len(guess)>1 and len(guess)==len(word): 
     return whole_word_guess(guess, word) 
    else: 
     return single_letter_guess(guess, word) 

def whole_word_guess(guess, word): 

    if guess.lower() == word.lower(): 
     return True 
    else: 
     lives_remaining=lives_remaining+(-1) 
     return False     


def single_letter_guess(guess, word): 
    global guessed_letters 
    global lives_remaining 
    if word.find(guess) == -1: 
     # letter guess was incorrect 
     lives_remaining = lives_remaining+(-1) 
     guessed_letters = guessed_letters + guess.lower() 
    if all_letters_guessed(word): 
     return True 
    return False 

def all_letters_guessed(word): 
    for letter in word: 
     if guessed_letters.find(letter.lower()) == -1: 
      return False 
    return True 
mainloop() 
+0

Ich sehe nicht, was los ist. Es sieht so aus, als würde es für mich funktionieren. Könnten Sie in der 'While True'-Schleife einen Ausdruck hinzufügen, wie viele Leben noch übrig sind und was die aktuelle Schätzung ist? – mitoRibo

Antwort

0

Ich glaube, ich verstehe jetzt. Die get_guess Funktion ist immer ziehen, was auch immer in der eEntry ist, es wartet nicht auf den Wert von e zu ändern.

Eine einfache Lösung ohne Zuhörer zu schaffen wäre, eine neue globale Variable last_guess genannt zu schaffen, die zu '' initialisiert werden kann und dann zu get_guess als 2. arg passsed zu überprüfen, ob die Vermutung hat sich geändert:

def get_guess(word, last_guess): 
    blanks(word) 
    guess=e.get() 

    #If the guess has not changed ret false 
    if guess == last_guess: 
     return False 

    #If the guess has changed update the last_guess 
    else: 
     last_guess = guess 
     return guess 

und dann in der Haupt While Schleife:

while True: 
     guess=get_guess(word) 
     print guess 
     print type(guess) 

     if not guess: #<-- If the get_guess returned False 
      continue #<-- Just go on to on to the next iteration of the loop w/out updating lives etc 

     if process_guess(guess,word): 
      Label(win,text="You Win!").grid(row=6) 
      break 
     if lives_remaining==0: 
      Label(win,text="You Lose!").grid(row=6) 
      Label(win,text="The secret word was: "+word).grid(row=7) 
      break 

ich habe nicht diesen Code ausführen, so dass es Fehler haben könnte, aber ich denke, die allgemeine Idee funktionieren wird