Python学習5日目(3/20)プログラムを組んでみる

電卓プログラムを元に組んでみました。

レイアウトから入ろうと思って一応絵にはしてみましたが、細部の変更があるかもしれないのでまずは基本のコードから書いてみました。

プログラム

from tkinter import *
import random
root = Tk()
root.title("numeron")
def func(v):
   check_num =var1.get()
   #文字数チェック
   if len(check_num) <3:
       #重複チェック
       if len(check_num+v) == len(set(check_num+v)):
           var1.set(var1.get() + v)

#ACの機能
def all_clear():
   var1.set("")

def result():
   print("判定チェックが走る")
   check_num = var1.get()
   if len(check_num)!=3:
       exit
   list_str = list(var1.get())
   list_ver1 = [int(s) for s in list_str]
   print(list_ver1)
   #比較
   x =0
   y =0
   hit=0
   bite=0
   while x <3:
       while y <3:
           if list_ver1[x] ==ns[y]:
               if x == y:
                   hit +=1
               else:
                   bite +=1
           y+=1
       y =0
       x +=1
   print("hit:"+str(hit) +"," +"bite:"+str(bite))
   var1.set("")
   if hit ==3:
       var1.set("正解!"+check_num)
#起動時に実行
ns = []
while len(ns) < 3:
   n = random.randint(0, 9)
   if not n in ns:
       ns.append(n)
print(ns)

#表示画面
var1 = StringVar()
label = Label(root, textvariable=var1, fg="#ffffff", bg="#000000", anchor=E, height=5)
label.grid(row=0, column=0, columnspan=8, sticky="EW")

btn_7 = Button(root, text="7", command=lambda: func("7"), width=5, height=2)
btn_7.grid(row=2, column=0)
btn_8 = Button(root, text="8", command=lambda: func("8"), width=5, height=2)
btn_8.grid(row=2, column=1)
btn_9 = Button(root, text="9", command=lambda: func("9"), width=5, height=2)
btn_9.grid(row=2, column=2)
btn_4 = Button(root, text="4", command=lambda: func("4"), width=5, height=2)
btn_4.grid(row=3, column=0)
btn_5 = Button(root, text="5", command=lambda: func("5"), width=5, height=2)
btn_5.grid(row=3, column=1)
btn_6 = Button(root, text="6", command=lambda: func("6"), width=5, height=2)
btn_6.grid(row=3, column=2)

btn_1 = Button(root, text="1", command=lambda: func("1"),width=5, height=2)
btn_1.grid(row=4, column=0)
btn_2 = Button(root, text="2", command=lambda: func("2"), width=5, height=2)
btn_2.grid(row=4, column=1)
btn_3 = Button(root, text="3", command=lambda: func("3"), width=5, height=2)
btn_3.grid(row=4, column=2)

#5列目
btn_0 = Button(root, text="0", command=lambda: func("0"), width=5, height=2)
btn_0.grid(row=5, column=0)
btn_ac = Button(root, text="AC", command=all_clear, width=5, height=2)
btn_ac.grid(row=5, column=1)
btn_eq = Button(root, text="◎", command=result, width=5, height=2)
btn_eq.grid(row=5, column=2)

root.mainloop()


使った関数

set


       #重複チェック
       if len(check_num+v) == len(set(check_num+v)):

重複チェックに使った

重複あり文字数=重複なし文字数を比較して、数が合っていたら重複なしとする

参考にしたサイト



random.randint

while len(ns) < 3:
   n = random.randint(0, 9)
   if not n in ns:
       ns.append(n)

ランダムに重複なし3桁を設定

参考にしたサイト



フローチャートとの変更点

以下の記事で作成したフローチャートとの変更点を書きます。


・重複チェック
送信時に行う→入力時に行う
文字制限も入力時にする関係で、まとめてやってしまったほうが良いと思ったから
入力時に文字数制限がないと見切れるまで文字を入力できてしまうし、オーバーフローを避けた


・文字チェック
hit,biteを画面に出す欄を作っていないのでコマンドプロンプトの表示結果を見て判別している
仮にでもいいから後で結果を表示する欄を作る


・終了時処理

すべてヒットした場合に正解!と出るようにした

すぐ終了するのではなく、キー入力で終了したほうが良いと思った

これは今検討中で、テンキーの1を入力で終了にして2を入力で再度遊ぶ、もしくは画面上に別途yes/noウインドゥを表示させてもよいと思った

前者だと関数呼び出しのときの処理が面倒で複雑になるので、シンプルに動かせるように後者を選ぼうかなと思っているがUI関連で別途表示させるのがどうしたらいいのかよくわかっていない

前者の場合は、正解したことを判定させるために返り値を設定する必要があるが、引数の受け渡しがまだ曖昧で改変させようとすると労力を要したのと、別途ウインドゥを表示させてみたいと思ったので後者にしてみようと思う


今後したいこと

クラスにする

トップ画面からヌメロンをプレイ→画面遷移→クラスを実行 という形でスマートにしたい

クラスはこのサイトとかこのサイト、self,__init__まわりが曖昧なのでこのサイトあたりで予習しておく


レイアウトの編集

おしゃれに色付けしたり、場所を変える、足りない点を追加する

仕様を固める

とりあえず作ってみたところフローに変更が出そうだったので改変しておく

今後また変更続きだと大変なので、固められる部分はなるべく固めたい

とはいえわからない部分も多いので、仮ぎめしてすすめる→徐々に固めていくスタンスも良いなと思えた

スケジュールの見直し

わかりそうなところから、楽しくできそうなところからやったほうがモチベ続くし、決めすぎても疲れるなと思うので再設定をもくろみつつもなくてもいいかなと思った。


またでてきたら追記しようと思います。今日はこのへんで。



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