🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2370閲覧

Pythonの数当てゲームで、入力した回数を最後に表示する方法

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/18 00:13

編集2021/01/18 00:53

お世話になります。初めて質問させていただきます。質問の仕方など分かりにくいかもしれませんが、どうぞよろしくお願いいたします。
超初心者で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を記入する位置を自分なりに考えて書き換えたりしたのですが、回数自体はウィンドウに表示されるものの、その回数の数が実際にボタンをクリックさせた数とは全く合わず上手くいきませんでした。

長くなりましたが、上のコードのどの部分を変更すれば、テキストボックスに数字を入力してボタンをクリックした回数を最後に表示できるのかを教えていただけると大変有難いです。どうぞ宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_whitecat_22

2021/01/18 00:17

コードの記載は、Markdown記法で記入しましょう。 質問を再編集して「コードを編集」ボタンを押し、その中に記述してください。 そうすることで、回答も得られやすくなると思います。
meg_

2021/01/18 00:28

> その次のセクションでゲームをウィンドウに表示する段階になって、本の通りにコードを書き足していったのですが、自分で加えた部分のコードとの合わせ方がまずかったようで、思うように作動しません。 参考書の元々のコードは正常に動作しますでしょうか?誤植などの可能性もありますので確認です。
退会済みユーザー

退会済みユーザー

2021/01/18 00:39

_whitecat_22様 ご指摘ありがとうございます。再編集してみます。
退会済みユーザー

退会済みユーザー

2021/01/18 00:39

meg_様 ありがとうございます。 参考書の元々のコードは正常に動きました。
_whitecat_22

2021/01/18 03:54

解決に至ったようで、何よりです。 お役に立てずに申し訳ございませんでした。 「global xxxx(変数名)」 とすることは、私も勉強になりました。 >meg さん ありがとうございました。
退会済みユーザー

退会済みユーザー

2021/01/18 04:38

_whitecat_22様 とんでもないです。いち早く質問の中に正しくコードを記入する方法を教えていただいて大変助かりました。初めてのサイト利用と質問に緊張しておりましたが、温かいお言葉を頂いたことで気持ちが和らぎました。改めてありがとうございました。
guest

回答2

0

def ButtonClick():内の先頭でglobal gamenumberを追記すると質問のエラーは出なくなりました。

投稿2021/01/18 02:53

meg_

総合スコア10739

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/01/18 03:07

meg_様 ありがとうございます!早速教えていただいた所を追記し、その他の部分も少し変更したところ、無事に希望通りの動作を実現する事ができました。私の為にお時間を取っていただいて、改めてありがとうございました。
azzurrosa

2021/01/18 03:52

65kさん、解決して良かったですね!^^ プログラミングの習得に向けて、がんばっていきましょう
退会済みユーザー

退会済みユーザー

2021/01/18 04:33

azzurrosa様 温かいお言葉ありがとうございます。毎日短い時間しか勉強に割けませんが、それでもコツコツと努力をして頑張っていきたいと思っております。
guest

0

ベストアンサー

教えていただいたアドバイスを元に、疑問を解決をする事ができました。
アドバイス通りにdef ButtonClick():の後にglobal gamenumberを追記し、if hit==4:の下とelse:の下にgamenumber=gamenumber+1を追加する事で、クリックする毎に一番最初に記入したgamenumber=0に回数を代入できるようになりました。何度か動作確認したところ、ゲーム終了時にクリックした回数がちゃんと表示できました。

import random gamenumber=0 import tkinter as tk import tkinter.messagebox as tmsg #ボタンがクリックされた時の処理 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])) def ButtonClick(): global gamenumber b=editbox1.get() #入力されたデータが4桁の数字かどうかを判定する import re isok=False while isok==False: if not re.match(r"^\d\d\d\d$",b): tmsg.showerror("Error!", "Enter a 4 digit number") break 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 #ヒットが4なら当たりで終了 if hit==4: gamenumber=gamenumber+1 tmsg.showinfo("Right", "You got it right!") tmsg.showinfo("Complete", "You tried " + str(gamenumber) + " time(s)!") #終了 root.destroy() else: gamenumber=gamenumber+1        #ヒット数とブロー数を表示 rirekibox.insert(tk.END, b + "/Hit" + str(hit) + "/"+"Blow" + str(blow) + "\n") #ウィンドウを作る root=tk.Tk() root.geometry("600x400") root.title("Hit and Blow game") rirekibox=tk.Text(root, font=("Arial, 14")) rirekibox.place(x=400, y=0, width=200, height=400) #ラベルを作る label1=tk.Label(root, text="Enter a number", font=("Arial",14)) label1.place(x=20,y=20) #テキストボックスを作る editbox1=tk.Entry(width=4, font=("Arial, 28")) editbox1.place(x=120,y=65) #ボタンを作る button1=tk.Button(root, text="Check", font=("Arial", 14), command=ButtonClick) button1.place(x=220, y=65) #ウィンドウを表示する root.mainloop()

投稿2021/01/18 03:14

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2021/01/18 05:51

私の回答が解決の参考になったのであれば、ベストアンサーに選んでいただきたかったです。残念です。
退会済みユーザー

退会済みユーザー

2021/01/18 16:40 編集

meg_様 申し訳ありません。meg_様の回答をベストアンサーに選んだつもりでしたが、操作を間違えていたようで自分の回答を投稿した際に、ベストアンサーを選ばずに投稿してしまったようです。今からでも変更しようと調べてみたのですが、私の調べ方が悪かったのかやり方が分かりませんでした。 折角教えていただいたのに、大変失礼な事をしてしまいすみませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問