要用Python实现一个带图形用户界面的可自定义棋盘大小的五子棋游戏,可以使用 tkinter 库。下面是一个完整的代码示例,实现了带图形用户界面的五子棋游戏。
import tkinter as tk
from tkinter import simpledialog, messageboxclass Gomoku:def __init__(self, root, size=20):self.size = sizeself.board = [['.' for _ in range(size)] for _ in range(size)]self.current_player = 'X'self.root = rootself.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 * 30x1, y1 = x0 + 30, y0 + 30self.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_playerreturn Truereturn Falsedef check_winner(self, x, y):def count_stones(dx, dy):count = 0nx, ny = x + dx, y + dywhile 0 <= nx < self.size and 0 <= ny < self.size and self.board[nx][ny] == self.current_player:count += 1nx += dxny += dyreturn countdirections = [(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 Truereturn Falsedef 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 // 30if 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 类并启动主循环。
运行这个代码,你将获得一个带图形用户界面的五子棋游戏,棋盘大小可由用户输入自定义。