おすすめアイテムをいくつか紹介

広告ブロックがONになっていると表示されないことがあります。

【Python-tkinter】〇×ゲームを作成-4(ポップアップの表示とゲーム終了)

こんにちは!
はるさらと申します。

最近、pythonを勉強し始めたため
学びがてら、PyChameを使用しつつ
〇×ゲーム(三目並べ)を
作成していきたいと思います。

 

第3回では並びを見て、
勝利したかの判定をコンソール上に行いました。

今回は、勝利した際にポップアップに表示させ
ゲームを終了するところまで実装していきます。

よかったら参考にしてみて下さい♪

 

他のPythonの記事はこちらから参照できます♪

 

PyCharmを使用して作成しました。
同様の環境であればコピペで動作すると思われます。

 

今回完成イメージ   

 

コーディング

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# coding: UTF-8
import tkinter as tk
 
# インスタンス化、画面サイズの設定など
from tkinter import messagebox
 
base = tk.Tk()
base.geometry('250x250')
base.resizable(0,0)
base.title('まるばつゲーム')
 
 
# メインフレーム作成
mainframe = tk.Frame(
    base,
    relief='groove',
    borderwidth=5
)
mainframe.grid()
 
# フレームの中央配置
base.grid_columnconfigure(0, weight=1)
base.grid_rowconfigure(0, weight=1)
 
 
# 結果格納用リスト
result = ['','','','','','','','','',]
 
# 勝利判定
kekka = ''
 
 
# 勝利判定
def clearCheck(num,kigou):
    global result
    global kekka
    result[num] =kigou
 
    # 横ぞろい 1,2,3 or 4,5,6 or 7,8,9
    if (kigou == result[0] and kigou == result[1] and kigou == result[2])or \
        (kigou == result[3] and kigou == result[4] and kigou == result[5])or\
        (kigou == result[6] and kigou == result[7] and kigou == result[8]):
            kekka = kigou+'の勝利'
 
    # 縦ぞろい 1,4,7 or 2,5,8 or 3,6,9
    if (kigou == result[0] and kigou == result[3] and kigou == result[6])or \
        (kigou == result[1] and kigou == result[4] and kigou == result[7])or\
        (kigou == result[2] and kigou == result[5] and kigou == result[8]):
            kekka = kigou+'の勝利'
 
    # 斜めぞろい 1,5,9 or 3,5,7
    if (kigou == result[0] and kigou == result[4] and kigou == result[8])or \
        (kigou == result[2] and kigou == result[4] and kigou == result[6]):
            kekka = kigou+'の勝利'
 
    return kekka
 
 
# ボタンクリック時のイベント
# ○、✕の変数
marubatsu = '○'
def btn_click(event):
 
    # これを書かないと、グローバル変数に代入ができない
    global marubatsu
 
    # ○、✕を付ける工程
    event.widget.configure(relief = 'ridge', bd = '1')
    bomb_count_label = tk.Label(event.widget, text = marubatsu , bg ='LightGray')
    bomb_count_label.place(width=50, height=50)
 
    # 勝利条件の確認
    result = clearCheck(event.widget.num,marubatsu)
 
 
    # ターンの判定
    if marubatsu == '○':
        marubatsu = '✕'
    else:
        marubatsu = '○'
 
    # 勝利者が出現した場合、ポップアップを表示
    # OKボタン押下でウィンドウを消す
    if result != '':
        messagebox.showinfo('ゲーム終了', result)
        base.destroy()
 
 
 
 
# 枠を作成(3×3マス)
i = 0
for x in range(3):
    for y in range(3):
        # ボタンはフレームで作成。クリック時に見た目を変更して押した感を出す。
        button_frame = tk.Frame(mainframe, width = 50, height = 50, bd = 3, relief ='ridge', bg ='LightGray')
        # rowでヨコ、columnでタテを指定している
        button_frame.grid(row=x, column=y)
        # フレームにイベントを設定するためbindメソッドを使用。
        # 第一引数に<1>を指定すると左クリックした際のイベントとなる
        button_frame.bind("<1>", btn_click)
        button_frame.num = i
        i += 1
 
 
# 下記構文で実行
base.mainloop()

処理の解説

84行目
・clearCheck(勝利者がいるのかの判定)の戻り値に値が入っていたら実行される。
 

85行目
・tkinterでポップアップ(メッセージボックス)を表示するために
tkinter.messageboxをインポートし、「messagebox.showinfo」で
○○の勝利! と表示させています。
 

86行目
・こちらで、ウィンドウをまとめて削除させており、実質ゲーム終了となります。
 

今回作成したソースを実行すると
最初に表示していたように ○、もしくは✕が
3つ揃った場合にポップアップを表示して
勝者を知らせています。

 

その後、ウィンドウを強制的に閉じて
ゲーム終了としています。

 

今日はここまで

次回は、現在、どちらのターンなのかを表示させたいと思います。
それではまたー!!

〇×ゲームの初回記事はこちらになります♪