お世話になります。初めて質問させていただきます。質問の仕方など分かりにくいかもしれませんが、どうぞよろしくお願いいたします。
超初心者でPythonで参考書を読みながら数当てゲームを作っています。ゲーム自体のプログラムは本に書いてあった通りのものに少しだけ自分で加えた部分もあるのですが、思った通りに作動しました。ですが、その次のセクションでゲームをウィンドウに表示する段階になって、本の通りにコードを書き足していったのですが、自分で加えた部分のコードとの合わせ方がまずかったようで、思うように作動しません。本に書いてある部分のみであれば正常に作動します。色々と自分でどこが間違っているのかを試してみたのですが、自力で発見するのは無理だと判断しこちらに質問させていただく事にしました。
具体的な内容ですが、ランダムに選ばれる4桁の数字を当てる数当てゲームを初心者用の参考書を読みながら作りました。こちらが本に書いてあったコードに、自分で「入力した回数が最後に表示される」ように書き足したコードになります。答えの4桁の数字は表示されるように書いてあります。
Spyder Editor This is a temporary script file. """ gamenumber=0 import random a=[random.randint(0,9), random.randint(0,9), random.randint(0,9), random.randint(0,9)] print(str(a[0])+str(a[1])+str(a[2])+str(a[3])) while True: import re isok=False while isok==False: b=input(" Enter a number") if not re.match(r"^\d\d\d\d$",b): print ("Enter a 4 digit number") else: isok=True hit=0 for i in range (4): if a[i]==int(b[i]): hit=hit+1 blow=0 for j in range(4): for i in range(4): if int(b[j])==a[i] and (a[i]!=int(b[i]))and (a[j]!=int(b[j])): blow=blow+1 break print("Hit"+str(hit)) print("Blow"+str(blow)) gamenumber=gamenumber+1 print("Your tried " + str(gamenumber)) if hit==4: print("You got the rigt number! You tried " + str(gamenumber)+ " time(s)!") break
"""
自分で書き足した部分はgamenumber=0とgamenumber=gamenumber+1、print("Your tried " + str(gamenumber))とprint("You got the rigt number! You tried " + str(gamenumber)+ " time(s)!")になります。ゲームの最後に何回数字を入力したかを表示されるようにしたいと思い書きました。この段階では一応自分の思った通りにプログラムは作動しています。(何か間違っていても気づいていない可能性もありますが。)
次に、本ではこのゲームをウィンドウに表示するという方法が説明されており、その通りに書いていったコードに少し自分で書き足したコードと合わせたものがこちらになります。
Python
1""" 2Created on Wed Jan 13 20:02:43 2021 3 4@author: Hit-chan 5""" 6 7 8import random 9gamenumber=0 10import tkinter as tk 11import tkinter.messagebox as tmsg 12 13#ボタンがクリックされた時の処理 14def ButtonClick(): 15 b=editbox1.get() 16 17 18 19 20 #入力されたデータが4桁の数字かどうかを判定する 21 22 import re 23 24 isok=False 25 while isok==False: 26 if not re.match(r"^\d\d\d\d$",b): 27 tmsg.showerror("Error!", "Enter a 4 digit number") 28 break 29 else: 30 isok=True 31 32 33 34 hit=0 35 for i in range (4): 36 if a[i]==int(b[i]): 37 hit=hit+1 38 39 blow=0 40 for j in range(4): 41 for i in range(4): 42 if int(b[j])==a[i] and (a[i]!=int(b[i]))and (a[j]!=int(b[j])): 43 blow=blow+1 44 break 45 46 gamenumber=gamenumber+1 47 48 #ヒットが4なら当たりで終了 49 if hit==4: 50 tmsg.showinfo("Right", "You got it right!") 51 tmsg.showinfo("Complete", "You tried " + str(gamenumber) + " time(s)!") 52 root.destroy() 53 else: 54 #ヒット数とブロー数を表示 55 rirekibox.insert(tk.END, b + "/Hit" + str(hit) + "/"+"Blow" + str(blow) + "\n") 56 57 58a=[random.randint(0,9), 59 random.randint(0,9), 60 random.randint(0,9), 61 random.randint(0,9)] 62 63print(str(a[0])+str(a[1])+str(a[2])+str(a[3])) 64 65 66#ウィンドウを作る、入力履歴を表示する 67 68 69root=tk.Tk() 70root.geometry("600x400") 71root.title("Hit and Blow game") 72rirekibox=tk.Text(root, font=("Arial, 14")) 73rirekibox.place(x=400, y=0, width=200, height=400) 74 75#ラベルを作る 76label1=tk.Label(root, text="Enter a number", font=("Arial",14)) 77label1.place(x=20,y=20) 78 79#テキストボックスを作る 80editbox1=tk.Entry(width=4, font=("Arial, 28")) 81editbox1.place(x=120,y=65) 82 83#ボタンを作る 84button1=tk.Button(root, text="Check", font=("Arial", 14), command=ButtonClick) 85button1.place(x=220, y=65) 86 87#ウィンドウを表示する 88root.mainloop() 89
ウィンドウに表示したテキストボックスに数字を入力してボタンをクリックする動作を1回と数え、その回数をゲーム終了時に表示させたいのですが、なかなか上手くいきません。そもそも、最初上のようにコードを書いたのですが、"Local Variable 'gamenumber' defined in enclosing scope on line 14 referenced before assignment (Pyflakes E)"というエラーが出てしまい作動できませんでした。その後もgamenumber=0とgamenumber=gamenumber+1を記入する位置を自分なりに考えて書き換えたりしたのですが、回数自体はウィンドウに表示されるものの、その回数の数が実際にボタンをクリックさせた数とは全く合わず上手くいきませんでした。
長くなりましたが、上のコードのどの部分を変更すれば、テキストボックスに数字を入力してボタンをクリックした回数を最後に表示できるのかを教えていただけると大変有難いです。どうぞ宜しくお願いいたします。
回答2件
あなたの回答
tips
プレビュー