こんにちは!
はるさらと申します。
最近、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つ揃った場合にポップアップを表示して
勝者を知らせています。
その後、ウィンドウを強制的に閉じて
ゲーム終了としています。
今日はここまで
次回は、現在、どちらのターンなのかを表示させたいと思います。
それではまたー!!
〇×ゲームの初回記事はこちらになります♪