自学内容网 自学内容网

用python实现一个带图形界面的五子棋游戏,棋盘大小可自定义

要用Python实现一个带图形用户界面的可自定义棋盘大小的五子棋游戏,可以使用 tkinter 库。下面是一个完整的代码示例,实现了带图形用户界面的五子棋游戏。

import tkinter as tk
from tkinter import simpledialog, messagebox

class Gomoku:
    def __init__(self, root, size=20):
        self.size = size
        self.board = [['.' for _ in range(size)] for _ in range(size)]
        self.current_player = 'X'
        self.root = root
        self.canvas = tk.Canvas(root, width=30*size, height=30*size)
        self.canvas.pack()
        self.canvas.bind("<Button-1>", self.click)
        self.draw_board()
        self.root.title("五子棋")

    def draw_board(self):
        self.canvas.delete("all")
        for i in range(self.size):
            for j in range(self.size):
                x0, y0 = i * 30, j * 30
                x1, y1 = x0 + 30, y0 + 30
                self.canvas.create_rectangle(x0, y0, x1, y1, outline="black")
                if self.board[i][j] != '.':
                    self.canvas.create_text(x0 + 15, y0 + 15, text=self.board[i][j], font=("Arial", 20))

    def is_valid_move(self, x, y):
        return 0 <= x < self.size and 0 <= y < self.size and self.board[x][y] == '.'

    def place_stone(self, x, y):
        if self.is_valid_move(x, y):
            self.board[x][y] = self.current_player
            return True
        return False

    def check_winner(self, x, y):
        def count_stones(dx, dy):
            count = 0
            nx, ny = x + dx, y + dy
            while 0 <= nx < self.size and 0 <= ny < self.size and self.board[nx][ny] == self.current_player:
                count += 1
                nx += dx
                ny += dy
            return count

        directions = [(1, 0), (0, 1), (1, 1), (1, -1)]
        for dx, dy in directions:
            if count_stones(dx, dy) + count_stones(-dx, -dy) + 1 >= 5:
                return True
        return False

    def switch_player(self):
        self.current_player = 'O' if self.current_player == 'X' else 'X'

    def click(self, event):
        x, y = event.x // 30, event.y // 30
        if self.place_stone(x, y):
            self.draw_board()
            if self.check_winner(x, y):
                messagebox.showinfo("游戏结束", f"玩家 {self.current_player} 获胜!")
                self.reset()
            else:
                self.switch_player()

    def reset(self):
        self.board = [['.' for _ in range(self.size)] for _ in range(self.size)]
        self.current_player = 'X'
        self.draw_board()

if __name__ == "__main__":
    root = tk.Tk()
    size = simpledialog.askinteger("棋盘大小", "请输入棋盘大小(如20):", minvalue=5, maxvalue=50)
    if size:
        game = Gomoku(root, size)
        root.mainloop()

说明
初始化棋盘:

init 方法初始化棋盘和当前玩家。
使用 tk.Canvas 创建绘制棋盘的画布,并绑定鼠标点击事件。

绘制棋盘:
draw_board 方法绘制棋盘和棋子。
使用 create_rectangle 和 create_text 方法在画布上绘制格子和棋子。

有效移动检查:
is_valid_move 方法检查在给定坐标是否可以放置棋子。

放置棋子:
place_stone 方法在给定坐标放置当前玩家的棋子。

胜利检查:
check_winner 方法检查当前玩家是否在给定坐标获胜。通过在四个方向(水平、垂直、两条对角线)上计数连续的棋子数来判断是否满足五子连珠的条件。

玩家切换:
switch_player 方法在两个玩家之间切换。

鼠标点击事件处理:
click 方法处理鼠标点击事件,计算点击位置的坐标,并调用 place_stone 和 check_winner 方法更新棋盘状态和检查胜利条件。

游戏重置:
reset 方法重置游戏状态,清空棋盘。

主程序:
使用 tk.Tk 创建主窗口。

使用 simpledialog.askinteger 提示用户输入棋盘大小。

实例化 Gomoku 类并启动主循环。

运行这个代码,你将获得一个带图形用户界面的五子棋游戏,棋盘大小可由用户输入自定义。


原文地址:https://blog.csdn.net/roc_ever/article/details/140546707

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!