Python学習13日目(5/18)まいにちゲームづくり5日目 グリコゲームGUI化

毎日といいつつ土日を挟んでめっちゃ三日坊主みたいですが続行します。

遊びや交友も別の学びではあるし、機会損失が嫌だなと思って取り組みましたが、習慣を続けないというのは良くないので難しいところですね。

とはいえ土日はとても楽しく実りのある2日だったので良しです。今日から再開していきます。


今日は前回作ったグリコゲームを改良しました。

GUIで動かせるように色々組んでみました。


"""
ゲーム制作5日目
グリコの編集
・すること
マス目を30マスにする、エラー修正、GUI化など
マス目:進むのが30マスだからOK 残り何マスか表示
エラー修正:任意の文字が入力されていない場合、エラーでもう一度入力を受け付ける
GUI化:してみる マス目の表記はテキストボックスに出力
GUI化した
・消した処理
自動であいこの時に入力を受け付けるようにしたのを消した
入力処理を連続し続ける処理を消した
・加えた処理
ボタンをクリックすると関数が実行して引数を渡せるようにした
関数名だけだと自動ではされないけど、()を付けると自動で実行する(jankenならOKだけどjanken("グー")なら()があるので自動実行)
そこで、関数にlambda:と付けることで、プログラム実行時に関数が動作しなくなるようにした
現状だと1回目に実行したデータが失われてしまっているので、どこかに保持しておく必要がある
解決法:
https://stackoverrun.com/ja/q/10677585
このサイトに乗っているグローバル変数という考え方を用いるのが良い

"""
import tkinter
import random
def janken(choice):
   global jibun_count
   global aite_count
   jyanken_list = ["グー","チョキ","パー"]
   random_choice = jyanken_list[random.randrange(3)]
   print("相手の手:"+random_choice)
   if choice =="グー"and random_choice =="パー":
       aite_count +=6
       print("負け")
   elif choice =="チョキ"and random_choice =="グー":
       aite_count +=3
       print("負け")
   elif choice =="パー"and random_choice =="チョキ":
       aite_count +=5
       print("負け")
   elif random_choice =="グー"and choice =="パー":
       jibun_count +=6
       print("勝ち")
   elif random_choice =="チョキ"and choice =="グー":
       jibun_count +=3
       print("勝ち")
   elif random_choice =="パー"and choice =="チョキ":
       jibun_count +=5
       print("勝ち")
   if choice == random_choice:
       print("あいこで")
   else:
       print(jibun_count*"○"+"□"+(30-jibun_count)*"○")
       print("あと"+str(30-jibun_count)+"マス")
       print(aite_count*"○"+"■"+(30-aite_count)*"○")
       print("あと"+str(30-aite_count)+"マス")
       if jibun_count >=30:
           print("自分の勝ち!")
       elif aite_count >=30:
           print("相手の勝ち!")

tk = tkinter.Tk()
tk.geometry('400x300')
tk.title('グリコ')
jibun_count=0
aite_count=0
#ボタンをクリックしたら関数を実行させ、テキストボックスに結果を出力
btn_g = tkinter.Button(tk, text='グー', command = lambda:janken("グー"))
btn_g.place(x=50, y=50)
btn_c = tkinter.Button(tk, text='チョキ', command = lambda:janken("チョキ"))
btn_c.place(x=100, y=50)
btn_p = tkinter.Button(tk, text='パー', command = lambda:janken("パー"))
btn_p.place(x=150, y=50)
txt = tkinter.Entry(width=20)
txt.place(x=50, y=100)
btn_end = tkinter.Button(tk, text='終了',command = tk.destroy)
btn_end.place(x=50, y=150)
tk.mainloop()

画像1

実装した処理

CUI用の処理(ループ処理など)を削除して、一度だけ処理を行うよう修正
ボタンをクリックしたら結果を送信
グローバル変数で進んだマス数を保持

実装していない処理

画面に結果を出力


グローバル変数のところで躓いていて、やっと攻略できました。
とりあえず休憩しようと思うので、その前にアウトプットとして書いてます。

細かいところは休憩したら見えてきそうなので、現状できそうな実装箇所は終わってないけど一旦まとめてしまいます。


ちょっと面倒でしたけどわかった時の爽快感はたまらないですね。

難しそうな書き方だからといって敬遠したサイトに答えがありました。

翻訳されていて日本語がたどたどしいのと、他人のコードを読み解くのは面倒に思ってしまい拒否反応が出ましたが、抽象的に例題をまとめてくれているのでちゃんと読めばすぐ分かりました。

質問系サイトで質問するのも良かったんですが、問題解決力を身につけるために自分で読み解こうと思っていました。
質問サイトで他の方が質問した内容を見て、自分のことに当てはまるかどうか検討するのは問題解決力を身につけるという意味でとても重要でした。

抽象化させるのが大事だと思っていたのが成果に出たかなと思います。嬉しいです。


この記事が気に入ったらサポートをしてみませんか?