【Python】tkinterでGUIベースの〇×ゲームを作ってみた

プログラミング
広告
広告

皆さんこんにちは!

今回はPythonを使って、GUIベースの〇×ゲーム(Tic-Tac-Toe)を作成する方法を紹介します。

tkinterライブラリを使用して、シンプルで直感的なユーザーインターフェースを構築し、各プレイヤーのマークを色分けすることで視覚的に区別しやすくしました。

この記事を参考にプログラミングの学習に役立ててください!

広告
広告

ゲーム画面

まず、完成した画面を以下に載せます。
〇を青で×を赤で表示しています。

完成したコード

完成したコードを以下に示します。コード全体をコピーして実行することで、GUIベースの〇×ゲームがプレイできます。

import tkinter as tk
from tkinter import messagebox

# ボードの初期化
board = [[" " for _ in range(3)] for _ in range(3)]
current_player = "X"

# 色の定義
colors = {"X": "red", "O": "blue"}

# ボタンがクリックされたときの処理
def on_click(row, col):
    global current_player

    # すでに埋まっている場合は何もしない
    if board[row][col] != " ":
        return

    # ボードを更新し、ボタンにプレイヤーを表示
    board[row][col] = current_player
    buttons[row][col].config(text=current_player, fg=colors[current_player])

    # 勝利チェック
    if check_win(current_player):
        messagebox.showinfo("ゲーム終了", f"プレイヤー {current_player} の勝利!")
        reset_board()
        return

    # 引き分けチェック
    if all(all(cell != " " for cell in row) for row in board):
        messagebox.showinfo("ゲーム終了", "引き分けです!")
        reset_board()
        return

    # プレイヤーの交代
    current_player = "O" if current_player == "X" else "X"

# 勝利条件のチェック
def check_win(player):
    # 行、列、および対角線のチェック
    for i in range(3):
        if all(board[i][j] == player for j in range(3)) or all(board[j][i] == player for j in range(3)):
            return True
    if all(board[i][i] == player for i in range(3)) or all(board[i][2-i] == player for i in range(3)):
        return True
    return False

# ボードのリセット
def reset_board():
    global board, current_player
    board = [[" " for _ in range(3)] for _ in range(3)]
    current_player = "X"
    for row in buttons:
        for button in row:
            button.config(text=" ", fg="black")

# GUIのセットアップ
root = tk.Tk()
root.title("〇×ゲーム")

buttons = [[None for _ in range(3)] for _ in range(3)]

# グリッドにボタンを配置
for i in range(3):
    for j in range(3):
        button = tk.Button(root, text=" ", font=('normal', 40), width=5, height=2, command=lambda i=i, j=j: on_click(i, j))
        button.grid(row=i, column=j)
        buttons[i][j] = button

# メインループの開始
root.mainloop()

コードの解説

ライブラリのインポート

最初に、必要なライブラリをインポートします。tkinterはPythonに標準で含まれているGUIライブラリです。

import tkinter as tk
from tkinter import messagebox

ボードの初期化

ゲームボードを3×3の空のリストとして初期化し、最初のプレイヤーをXに設定します。

board = [[" " for _ in range(3)] for _ in range(3)]
current_player = "X"

色の定義

各プレイヤーの記号に色を割り当てます。XOに設定します。

colors = {"X": "red", "O": "blue"}

ボタンがクリックされたときの処理

ボタンがクリックされたときに実行される関数を定義します。この関数では、プレイヤーのターンを処理し、ボードを更新し、勝利条件や引き分けをチェックします。

def on_click(row, col):
    global current_player

    if board[row][col] != " ":
        return

    board[row][col] = current_player
    buttons[row][col].config(text=current_player, fg=colors[current_player])

    if check_win(current_player):
        messagebox.showinfo("ゲーム終了", f"プレイヤー {current_player} の勝利!")
        reset_board()
        return

    if all(all(cell != " " for cell in row) for row in board):
        messagebox.showinfo("ゲーム終了", "引き分けです!")
        reset_board()
        return

    current_player = "O" if current_player == "X" else "X"

勝利条件のチェック

プレイヤーが勝利したかどうかをチェックします。行、列、および対角線のチェックを行います。

def check_win(player):
    for i in range(3):
        if all(board[i][j] == player for j in range(3)) or all(board[j][i] == player for j in range(3)):
            return True
    if all(board[i][i] == player for i in range(3)) or all(board[i][2-i] == player for i in range(3)):
        return True
    return False

ボードのリセット

ゲームが終了した後、ボードをリセットし、全てのボタンを初期状態に戻します。

def reset_board():
    global board, current_player
    board = [[" " for _ in range(3)] for _ in range(3)]
    current_player = "X"
    for row in buttons:
        for button in row:
            button.config(text=" ", fg="black")

GUIのセットアップ

tkinterを使用してGUIを作成し、ボタンを3×3のグリッドに配置します。各ボタンがクリックされたときに、on_click関数が呼び出されます。

root = tk.Tk()
root.title("〇×ゲーム")

buttons = [[None for _ in range(3)] for _ in range(3)]

for i in range(3):
    for j in range(3):
        button = tk.Button(root, text=" ", font=('normal', 40), width=5, height=2, command=lambda i=i, j=j: on_click(i, j))
        button.grid(row=i, column=j)
        buttons[i][j] = button

root.mainloop()

最後に

このブログ記事では、Pythonのtkinterライブラリを使用してシンプルな〇×ゲームを作成しました。各プレイヤーの記号に色を付けることで、視覚的に区別しやすくしています。このコードを基に、さらに機能を追加して自分だけの〇×ゲームを作成してみてください。

また、pythonでゲームを作ってみたい方は以下の本を参考にしてください。
プログラミング未経験者にもおすすめの本です。

人気ブログランキング

クリックするとブログランキングサイトに移動します。

にほんブログ村 IT技術ブログへ
インターネット・コンピュータランキング
広告
広告
プログラミング
広告
technyankoをフォローする
広告
プロフィール
technyanko

元情シス・SEです。
当ブログではPCに関して困ったことや役立つ情報を発信していきます。
たまにバッチスクリプトやPythonに関する記事も投稿します。

technyankoをフォローする
広告
タイトルとURLをコピーしました