python(tkinter)で〇×ゲームを作成-3(勝利判定)

こんにちは!

はるさらと申します。

 

 

最近、pythonを勉強し始めたため

学びがてら、PyChameを使用しつつ

〇×ゲーム(三目並べ)を

 

作成していきたいと思います。

  第2回では〇、✕が描写されるまでを作成しました。

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

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

 

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

 

【今回完成イメージ】        

 

 

以下、ソース

# coding: UTF-8
import tkinter as tk

# インスタンス化、画面サイズの設定など
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)

    print(result)

    # ターンの判定
    if marubatsu == '○':
        marubatsu = '✕'
    else:
        marubatsu = '○'


# 枠を作成(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()

24~25行目 結果を格納する配列を作成しています。

012

345

678

の、要素番号の個所に、〇、✕が格納されていきます。

 

32~54行目にて、

〇、✕が格納された配列を確認して

縦、横、斜めのいずれかに マークがそろっているのかを確認しています。

 

そろっていた場合、コンソールに

「〇の勝利」と 出力させるように値を代入しています。

 

 

今回作成したソースを実行すると

最初に表示していたように コンソール上に、

決着がついていない時は「勝負中」

記号がそろったときは「~の勝利」 と、

出力されるようになります。

 

もちろん、コンソールに出ているだけでは 分かりにくいため・・・

次回、勝利したときは ポップアップを表示させ、

ゲームの終了までもっていきたいと思います。

 

それではまたー!!