Python五子棋程序实现详解
- 电脑硬件
- 2025-07-21 19:04:39

Python五子棋程序实现详解 引言功能实现显示棋盘点击落子判断胜负游戏结束判断交替落子 运行结果完整代码总结 引言
五子棋是一种广泛传播的策略棋类游戏,两人对弈,通过在棋盘上落子,以先形成连续的相同颜色的五子棋为胜利条件。本文将介绍如何使用Python编写一个简单的五子棋程序,实现了五子棋游戏的基本功能。
功能实现 显示棋盘首先,我们需要在程序中显示一个19x19的五子棋棋盘。使用tkinter库可以快速实现可视化界面的搭建。
# 定义常量 ROWS = 19 COLS = 19 PADDING = 30 GRID_SIZE = 20 # 创建棋盘 board = [[0] * COLS for _ in range(ROWS)] # 创建窗口 window = tk.Tk() window.title("五子棋") window.geometry(str(COLS * GRID_SIZE + PADDING * 2) + "x" + str(ROWS * GRID_SIZE + PADDING * 2 + 40)) # 创建画布 canvas = tk.Canvas(window, width=COLS * GRID_SIZE + PADDING * 2, height=ROWS * GRID_SIZE + PADDING * 2, bg="burlywood") canvas.place(x=0, y=PADDING) # 绘制棋盘线 for i in range(ROWS): canvas.create_line(PADDING, i * GRID_SIZE + PADDING, COLS * GRID_SIZE + PADDING - GRID_SIZE, i * GRID_SIZE + PADDING) for i in range(COLS): canvas.create_line(i * GRID_SIZE + PADDING, PADDING, i * GRID_SIZE + PADDING, ROWS * GRID_SIZE + PADDING - GRID_SIZE) # 绘制黑点 for i in range(3, ROWS, 6): for j in range(3, COLS, 6): canvas.create_oval(j * GRID_SIZE + PADDING - 3, i * GRID_SIZE + PADDING - 3, j * GRID_SIZE + PADDING + 3, i * GRID_SIZE + PADDING + 3, fill="black")以上代码使用tkinter库创建了一个窗口,并在窗口内创建了一个棋盘。我们使用了Canvas组件来绘制棋盘上的线条和黑点。
点击落子接下来,我们需要实现在棋盘上点击鼠标落子的功能。
def on_click(event): # 处理鼠标点击事件 row = round((event.y - PADDING) / GRID_SIZE) col = round((event.x - PADDING) / GRID_SIZE) if row < 0 or row >= ROWS or col < 0 or col >= COLS: # 落子在棋盘外侧 messagebox.showinfo("提示", "不可以落子在棋盘外哦!") return if not is_valid_move(row, col): # 提示落子位置已有棋子 messagebox.showinfo("提示", "此处已有棋子,不可重复落子") return global current_player if current_player == 1: # 蓝方玩家 color = "blue" label.config(text="红方玩家的回合") else: # 红方玩家 color = "red" label.config(text="蓝方玩家的回合") board[row][col] = current_player x = col * GRID_SIZE + PADDING y = row * GRID_SIZE + PADDING canvas.create_oval(x - GRID_SIZE // 2, y - GRID_SIZE // 2, x + GRID_SIZE // 2, y + GRID_SIZE // 2, fill=color) if is_winner(current_player): if current_player == 1: messagebox.showinfo("游戏结束", "蓝方玩家获胜") else: messagebox.showinfo("游戏结束", "红方玩家获胜") window.quit() else: current_player = 2 if current_player == 1 else 1 # 绑定鼠标点击事件 canvas.bind("<Button-1>", on_click) # 左键点击 canvas.bind("<Button-3>", on_click) # 右键点击以上代码定义了一个on_click函数来处理鼠标点击事件。函数首先根据点击的位置计算出对应的行列索引,然后检查是否落子在有效位置上。如果位置无效(落子在棋盘外侧或已有棋子),则弹出提示信息。如果位置有效,根据当前玩家的不同,设置棋子的颜色,并绘制出棋子。然后检查是否有玩家获得胜利,如果有,则弹出提示信息并退出游戏。如果没有胜利,切换当前玩家。
判断胜负接下来,我们需要编写一个函数来判断当前是否有玩家已经胜利。
def is_winner(player): # 检查玩家是否胜利 for row in range(ROWS): for col in range(COLS): if board[row][col] == player: # 检查水平方向 if col + 4 < COLS and all(board[row][col + i] == player for i in range(5)): return True # 检查垂直方向 if row + 4 < ROWS and all(board[row + i][col] == player for i in range(5)): return True # 检查对角线方向(左上到右下) if row + 4 < ROWS and col + 4 < COLS and all(board[row + i][col + i] == player for i in range(5)): return True # 检查对角线方向(右上到左下) if row + 4 < ROWS and col - 4 >= 0 and all(board[row + i][col - i] == player for i in range(5)): return True return False以上代码定义了一个is_winner函数来判断指定玩家是否获胜。函数首先遍历棋盘上的每个位置,如果该位置的棋子颜色与指定玩家相同,则进行进一步检查。检查水平方向、垂直方向以及两个对角线方向上是否有连续的五个相同颜色的棋子,如果有,则返回True表示获胜,否则返回False表示未获胜。
游戏结束判断在on_click函数中,每当有玩家落子后,会检查是否有玩家获胜,如果有,则弹出提示信息并退出游戏。
交替落子在on_click函数中,每当有玩家落子后,会切换当前玩家。这通过全局变量current_player实现,初始值为1(蓝方玩家),当某一方落子后,将current_player的值切换为另一方(2表示红方玩家)。
运行结果通过以上的代码实现,我们可以得到一个能够实现基本五子棋功能的程序。
程序运行时,会弹出一个窗口,窗口中显示了一个19x19的五子棋棋盘。玩家可以通过鼠标左键或右键点击棋盘上的格子进行落子。每当有玩家落子后,程序会自动判断是否有玩家获胜,并在弹出提示信息后结束游戏。
在程序运行过程中,程序会在窗口底部显示当前是哪一方玩家的回合,玩家可以根据该提示进行操作,避免出现误操作。同时,程序还会对一些错误的操作给出相应的提示,提高了游戏的友好度。
完整代码 import tkinter as tk from tkinter import messagebox # 定义常量 ROWS = 19 COLS = 19 PADDING = 30 GRID_SIZE = 20 # 创建棋盘 board = [[0] * COLS for _ in range(ROWS)] def is_valid_move(row, col): # 检查落子是否有效 return board[row][col] == 0 def is_winner(player): # 检查玩家是否胜利 for row in range(ROWS): for col in range(COLS): if board[row][col] == player: # 检查水平方向 if col + 4 < COLS and all(board[row][col + i] == player for i in range(5)): return True # 检查垂直方向 if row + 4 < ROWS and all(board[row + i][col] == player for i in range(5)): return True # 检查对角线方向(左上到右下) if row + 4 < ROWS and col + 4 < COLS and all(board[row + i][col + i] == player for i in range(5)): return True # 检查对角线方向(右上到左下) if row + 4 < ROWS and col - 4 >= 0 and all(board[row + i][col - i] == player for i in range(5)): return True return False def on_click(event): # 处理鼠标点击事件 row = round((event.y - PADDING) / GRID_SIZE) col = round((event.x - PADDING) / GRID_SIZE) if row < 0 or row >= ROWS or col < 0 or col >= COLS: # 落子在棋盘外侧 messagebox.showinfo("提示", "不可以落子在棋盘外哦!") return if not is_valid_move(row, col): # 提示落子位置已有棋子 messagebox.showinfo("提示", "此处已有棋子,不可重复落子") return global current_player if current_player == 1: # 蓝方玩家 color = "blue" label.config(text="红方玩家的回合") else: # 红方玩家 color = "red" label.config(text="蓝方玩家的回合") board[row][col] = current_player x = col * GRID_SIZE + PADDING y = row * GRID_SIZE + PADDING canvas.create_oval(x - GRID_SIZE // 2, y - GRID_SIZE // 2, x + GRID_SIZE // 2, y + GRID_SIZE // 2, fill=color) if is_winner(current_player): if current_player == 1: messagebox.showinfo("游戏结束", "蓝方玩家获胜") else: messagebox.showinfo("游戏结束", "红方玩家获胜") window.quit() else: current_player = 2 if current_player == 1 else 1 # 创建窗口 window = tk.Tk() window.title("五子棋") window.geometry(str(COLS * GRID_SIZE + PADDING * 2) + "x" + str(ROWS * GRID_SIZE + PADDING * 2 + 40)) # 创建画布 canvas = tk.Canvas(window, width=COLS * GRID_SIZE + PADDING * 2, height=ROWS * GRID_SIZE + PADDING * 2, bg="burlywood") canvas.place(x=0, y=PADDING) # 绘制棋盘线 for i in range(ROWS): canvas.create_line(PADDING, i * GRID_SIZE + PADDING, COLS * GRID_SIZE + PADDING - GRID_SIZE, i * GRID_SIZE + PADDING) for i in range(COLS): canvas.create_line(i * GRID_SIZE + PADDING, PADDING, i * GRID_SIZE + PADDING, ROWS * GRID_SIZE + PADDING - GRID_SIZE) # 绘制黑点 for i in range(3, ROWS, 6): for j in range(3, COLS, 6): canvas.create_oval(j * GRID_SIZE + PADDING - 3, i * GRID_SIZE + PADDING - 3, j * GRID_SIZE + PADDING + 3, i * GRID_SIZE + PADDING + 3, fill="black") # 绑定鼠标点击事件 canvas.bind("<Button-1>", on_click) # 左键点击 canvas.bind("<Button-3>", on_click) # 右键点击 # 创建游戏信息标签 label = tk.Label(window, text="蓝方玩家的回合", font=("宋体", 14)) label.place(x=PADDING, y=PADDING * 2 + ROWS * GRID_SIZE + 10) # 初始化当前玩家为蓝方玩家 current_player = 1 # 运行窗口的主循环 window.mainloop() 总结本文通过使用Python编写了一个简单的五子棋程序,实现了五子棋游戏的基本功能。通过tkinter库创建了一个可视化界面,实现了显示棋盘和点击落子的功能。通过编写相应的函数实现了胜负判断和游戏结束判断的功能。整个游戏流程简洁明了,代码结构清晰。通过本文的学习,相信读者们已经掌握了使用Python编写简单游戏的基本方法。希望本文的内容对读者们有所帮助,谢谢阅读!
Python五子棋程序实现详解由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Python五子棋程序实现详解”