要用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 类并启动主循环。
运行这个代码,你将获得一个带图形用户界面的五子棋游戏,棋盘大小可由用户输入自定义。