ヒットとブローの当たり判定を移植しよう!ウィンドウを消すdestroy()も覚えるよ

ヒットとブローの当たり判定を移植しよう!ウィンドウを消すdestroy()も覚えるよ

前のバージョンを移植しよう!

以前の記事で一度ウィンドウ表示をつかわないバージョンのヒットアンドブローゲームは完成させたよね。今回はそのときに使った当たり判定のプログラムを移植するよ。ただコピペするだけじゃなくて、調整も必要なので書き方を見ていこう!

入力欄の書き方を調整する

前のバージョンとの大きな違いは、入力欄の書き方が変わったことだ。前はinput()を使ってたけど今作ってるのはtkinterのEntry()だったね。Entryでは入力した内容を取得するのに「getメソッド」を使うんだ。実際に書くとこんな感じ。

entry_01 = tk.Entry(width = 4, font=("Helvetica",28))
entry_01.place(x=20, y=45)

b = entry_01.get()

前に入力欄の名前を「entry_01」で作ったから、「entry_01.get()」で入力した内容を取得できるんだね。「b = 」ってしてるのは、変数bに取得した内容を代入してるって意味だ。

これを前回の記事で書いたプログラムに使ってみよう。こんな感じになるよ。

# codeing=utf-8
import tkinter as tk
import tkinter.messagebox as tkmsg

root = tk.Tk()
root.geometry("480x160")
root.title("数当てゲーム")

#ボタンをクリックしたとき
def ButtonClick():
    b = entry_01.get()
    tkmsg.showinfo("メッセージ", b)

label_01 = tk.Label(root, text="4桁の数字をいれてね", font=("Helvetica",14))
label_01.place(x=20, y=20)

entry_01 = tk.Entry(width = 4, font=("Helvetica",28))
entry_01.place(x=20, y=45)

button_01 = tk.Button(root, text="チェック", font=("Helvetica",20), command=ButtonClick)
button_01.place(x=100, y=54)

root.mainloop()

11,12行目が前回から変わったところだ。11行目でget()を使って入力した内容を取得して変数bに代入してる。12行目ではshowinfo()の引数にbを入れてメッセージの内容にしてるんだね。実際に実行してみると、自分が入力した内容がメッセージとして出て来るから確認してみよう!

ウィンドウ表示版のヒットアンドブローゲーム

それじゃあ、前のバージョンのプログラムと合体させてみるよ。

# codeing=utf-8
import random
import tkinter as tk
import tkinter.messagebox as tkmsg

root = tk.Tk()
root.geometry("480x160")
root.title("数当てゲーム")

#ボタンをクリックしたとき
def ButtonClick():
    
    #入力欄の内容を取得
    b = entry_01.get()
    
    #正しい入力か判定する
    input_ok = False
    if len(b) != 4:
        tkmsg.showerror("エラー", "4桁の数字を入れてね")
    else:
        input_ok = True
        for i in range(4):
            if(b[i]<"0") or (b[i]>"9"):
                    input_ok = False
                    tkmsg.showerror("エラー", "数字じゃないよ")
                    break
                 
    #ヒットとブローを判定する①②
    if input_ok == 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:
            #メッセージをだしてウィンドウを閉じる
            tkmsg.showinfo("アタリ", "アタリです!")
            root.destroy()
        else:
            #ヒット数とブロー数を表示
            tkmsg.showinfo("ヒント","ヒット:"+str(hit)+" / ブロー:"+str(blow))
        

#4桁のランダムな数字をつくる
a = [random.randint(0,9),
     random.randint(0,9),
     random.randint(0,9),
     random.randint(0,9)]

#ウィンドウを作る
label_01 = tk.Label(root, text="4桁の数字をいれてね", font=("Helvetica",14))
label_01.place(x=20, y=20)

#入力欄を作る
entry_01 = tk.Entry(width = 4, font=("Helvetica",28))
entry_01.place(x=20, y=45)

#ボタンを作る
button_01 = tk.Button(root, text="チェック", font=("Helvetica",20), command=ButtonClick)
button_01.place(x=100, y=54)

root.mainloop()

解説

まず最初の変更点としては、前のバージョンではヒット数などのメッセージをprint()で表示してたよね。移植するときにすべてshowinfo()とshowerror()にして、ウィンドウで表示させるようにした。

それと、ヒットが4になったときはゲームクリアだから入力欄用のウィンドウは閉じるようにしたよ。それが48行目のdestroy()の部分だ。

        #ヒットが4なら終了
        if hit==4:
            #メッセージをだしてウィンドウを閉じる
            tkmsg.showinfo("アタリ", "アタリです!")
            root.destroy()

ウィンドウを消したいときは、下の書き方でできるから覚えておこう!

消したいウィンドウ.destroy()
今日のまとめ

  • 前のバージョンから移植してみよう!
  • 「destroy()」でウィンドウを消そう!