2016-05-11 8 views
0

私はハングマンタイプのゲームをPythonで書いていますが、それをGUIプログラムに変換しようとしています。 これは私が仕事に取得しようとしているコードです:python hangmanのゲームをGUIに変換する

#!/usr/bin/env python3 

import random 
from tkinter import * 
from tkinter import ttk 

def getHint(word, guesses): 
    hint = ' ' 
    for letter in word: 
     if letter not in guesses: 
      hint += '_ ' 
     else: 
      hint += letter 

    return hint 

def loadWordList(filename): 
    file = open(filename, 'r') 
    line = file.read().lower() 
    wordlist = line.split() 

    return wordlist 

def countOccurences(word, guess): 
    length = len(word) 
    i = 0 
    total = 0 
    while i < length: 
     if guess == word[i]: 
      total += 1 
     i += 1 

    return total 

def play(): 
    word = random.choice(loadWordList('words.txt')) 
    guesses = [] 
    remaining = 10 

    while remaining > 0: 
     hint = getHint(word, guesses) 
     remaining = str(remaining) 
     guess = guess.lower() 

     while guess.isalpha() == False or len(guess) != 1: 
      output = 'Invalid input. Please enter a letter from a-z.' 

     if guess in guesses: 
      output = 'That letter has already been guessed!' 

     else: 
      if guess not in word: 
       output = 'That letter does not occur in the secret word.' 
      else: 
       output = 'That is a good guess! ' + str(guess) + ' occurs ' + str(countOccurences(word, guess)) + ' time(s) in the secret word' 
       guesses += guess 
       remaining -= 1 

     if '_' not in getHint(word, guesses): 
      result = 'Congratulations! You guessed the secret word: ' + word 
      break 

    if remaining == 0: 
     result = 'Sorry, the secret word was: ' + word 

def buttonClicked(): 
    play() 
    getHint(word, guesses) 

root = Tk() 
root.title('Guessing Game') 

frame = ttk.Frame(root, padding='3 3 12 12') 
frame.grid(column=0, row=0, sticky=(N, W, E, S)) 
frame.columnconfigure(0, weight=1) 
frame.rowconfigure(0, weight=1) 

guess = StringVar() 
output = StringVar() 
hint = StringVar() 
remaining = StringVar() 
result = StringVar() 

a_label = ttk.Label(frame, text='Enter a letter to guess: ') 
a_label.grid(column=1, row=1, sticky=E) 
a_entry = ttk.Entry(frame, width=7, textvariable=guess) 
a_entry.grid(column=2, row=1,sticky=E) 

b_label = ttk.Label(frame, textvariable=output) 

c_label = ttk.Label(frame, text='Current Hint: ') 
c_label.grid(column=1, row=3, sticky=E) 
d_label = ttk.Label(frame, textvariable=hint) 
d_label.grid(column=2, row=3) 

e_label = ttk.Label(frame, text='Guesses Remaining: ') 
e_label.grid(column=1, row=4, sticky=E) 
f_label = ttk.Label(frame, textvariable=remaining) 
f_label.grid(column=2, row=4) 

button = ttk.Button(frame, text='Submit', command=buttonClicked) 
button.grid(column=3, row=5) 

g_label = ttk.Label(frame, textvariable=result) 
g_label.grid(column=1, row=6) 


for child in frame.winfo_children(): 
    child.grid_configure(padx=5, pady=5) 

root.bind('<Return>',) 

root.mainloop() 

これらは私が取得していますエラーです:buttonClickedで

  • ライン77、 - 遊ぶ()
  • をライン52ローカル変数「推測」の任意のヒントとして、私はさらに、このコードを並べ替えることができますどのように割り当て

前に参照さT: - 、劇中で() UnboundLocalError = guess.lowerを推測実際にGUIに接続するための関数を得ることは非常に高く評価されるだろう。 ありがとう!

+0

play()でグローバルとして推測することでエラーを回避することはできますが、ここではさらに問題があります。 StringVar推測を文字列推測に変換する場合や、whileループを使用する場合などに使用します。 – Lafexlos

+0

本当に多くのことが修正される必要があります。私が見つけたものは、 'remaining'はplay()の文字列に変換されましたが、残っている= 1と'残っている> 0: 'のときと同じようにintを使用しています。おそらく、intを保持する変数と文字列を保持する変数の2つの変数を使用できます。私が無効な入力(例えば '1')を入力すると、ゲームは無限ループに見えます。これは問題のようです: 'guess.isalpha()== Falseまたはlen(推測)!= 1:'。そこから逃れる方法はありません!おそらくこれを 'if'文に変更して、フローコントロールを修正してください。 – coralvanda

+0

Pythonの組み込み関数 "count"を使って、出現回数をカウントすることができます。 - > print word.count(推測)また、エントリの内容を取得する必要があります。http://effbot.org/tkinterbook/entry.htm –

答えて

-1

まあまあ言われるとおり、変数 "推測"は定義されていません。 おそらく

guess = word.lower() 

のようなものをやってみたかったとない

guess = guess.lower() 

小さなヒント:使用PEP8、それは他の人があなたのコードを読むのに役立ちます。

+0

guess.lowerは私の最初のプログラムで働いていましたが、word.lower()に変更しましたが、プログラムはエラーを表示せずにクラッシュします。 – user6276841

+0

単語が実際にあなたがそこで欲しかったことだったかどうかわかりませんが、それはちょうど私にとって最も論理的だったようです。私は今あなたが別のエラーを取得すると思われる。コードのさまざまな場所でprintステートメントを試してください。少なくとも、どこでクラッシュするかを知ることができます。また、あなたのコードを実行するのにあなたは何を使用しますか?コマンドラインから実行すると、まだ実行していない方がうまくいくかもしれません。 –

関連する問題