Python標準モジュールでまるばつゲームを作る

Python

はじめに

Pythonの標準モジュールであるtkinterのみを使用してマルバツゲームを作成します。

仕様

・リセットボタンで初期化

・先攻は〇、後攻は×

・〇/×は交互

・同じ記号が縦・横・斜めでそろうと結果を表示

コード

import tkinter

class marubatsu_game():
    def __init__(self, size=3):
        self.size = size  # マスのサイズ
        self.app = tkinter.Tk()  # Tkinterのお約束
        self.app.title("o/x game")  # タイトル
        self.turn = "o"  # マルから開始
        self.v = [["" for y in range(size)] for x in range(size)]  # 初期化
        self.text = [[tkinter.StringVar() for y in range(size)] for x in range(size)]  #初期化

    def _reset_button(self):  # Resetを押したときの処理
        self.winner.set("")
        self.turn = "o"
        for c in range(self.size):
            for r in range(self.size):
                self.text[r][c].set("")

    def closure(self, text):  # マスをクリックしたときの処理
        def _push_button():
            if text.get() == "":
                text.set(self.turn)
                self.check()
                self.turn = "o" if self.turn == "x" else "x"
        return _push_button

    def run(self):
        self.reset_button = tkinter.Button(
            self.app, text="Reset", command=self._reset_button)
        self.reset_button.grid(row=0, column=0)  # Resetボタンを作成

        self.winner = tkinter.StringVar()
        self.label = tkinter.Label(self.app, textvariable=self.winner)
        self.label.grid(row=0, column=1)  # 勝者ラベルを作成

        for c in range(self.size):
            for r in range(self.size):
                self.text[r][c].set("")
                self.v[r][c] = tkinter.Button(
                    self.app,
                    textvariable=self.text[r][c],
                    fg="black",
                    width=10,
                    height=5,
                    command=self.closure(self.text[r][c]),
                )
                self.v[r][c].grid(row=r+1, column=c)  # マスを作成

        self.app.mainloop()

    def check(self):  # マルバツを置いたときに勝利したかを判定
        for i in range(self.size):
            # yoko
            if [self.text[i][x].get() for x in range(self.size)].count(self.turn) == self.size:
                self.winner.set(f"{self.turn} is winner")
            # tate
            if [self.text[x][i].get() for x in range(self.size)].count(self.turn) == self.size:
                self.winner.set(f"{self.turn} is winner")
        # naname
        if [self.text[x][x].get() for x in range(self.size)].count(self.turn) == self.size:
            self.winner.set(f"{self.turn} is winner")
        if [self.text[x][self.size - 1 - x].get() for x in range(self.size)].count(self.turn) == self.size:
            self.winner.set(f"{self.turn} is winner")

if __name__ == "__main__":
    a = marubatsu_game(3)  # マスのサイズを指定します。
    a.run()

実行結果

実行するとGUIが立ち上がります。

適当なマスをクリックすると〇が表示されます。

次に、別なマスをクリックすると×が表示されます。

これを繰り返して〇が勝つと勝利マークが出ます。

ゲームが終わったらResetを押せば最初からになります。

まとめ

マルバツゲームをPython標準モジュールで作成しました。

文字を大きくしたり他のエフェクトを追加していくとどんどんそれっぽくなると思いますよ。

コメント

タイトルとURLをコピーしました