作为一名程序员,闲暇时用代码实现个小游戏是件很有成就感的事。今天就带大家用Python的Tkinter库,从零开始开发一个简单的五子棋游戏,适合新手入门练手。
开发准备
首先明确我们的技术栈:
- 编程语言:Python 3.x(跨平台且语法简洁)
- GUI库:Tkinter(Python自带,无需额外安装,适合快速开发)
- 开发工具:任意Python编辑器均可,推荐PyCharm(调试方便)
不需要复杂的环境配置,确保Python环境正常即可开始。
核心功能设计
一个基础的五子棋游戏需要实现这几个核心功能:
- 绘制15×15的标准棋盘
- 实现黑白棋子交替落子逻辑
- 判定落子合法性(不能落在已有棋子的位置)
- 胜负判定(横/竖/斜向五子连珠)
代码实现步骤
第一步:搭建基础框架
先创建游戏主类,初始化窗口和画布:
import tkinter as tk
from tkinter import messagebox
class Gobang:
def __init__(self, root):
self.root = root
self.root.title("五子棋")
self.canvas = tk.Canvas(root, width=600, height=600, bg="#E8C090") # 棋盘用木色背景
self.canvas.pack(padx=10, pady=10)
# 初始化棋盘数据:0-空,1-黑棋,2-白棋
self.board = [[0 for _ in range(15)] for _ in range(15)]
self.current_player = 1 # 1-黑棋先行
self.init_game()
def init_game(self):
# 绘制棋盘
self.draw_board()
# 绑定鼠标点击事件
self.canvas.bind("", self.handle_click)
第二步:绘制棋盘与棋子
棋盘是15×15的网格,我们需要计算好间距确保美观:
def draw_board(self):
# 绘制网格线
for i in range(15):
# 横线
self.canvas.create_line(30, 30 + i*40, 30 + 14*40, 30 + i*40, width=2)
# 竖线
self.canvas.create_line(30 + i*40, 30, 30 + i*40, 30 + 14*40, width=2)
# 绘制天元和星位(增强棋盘辨识度)
dots = [(3,3), (3,11), (7,7), (11,3), (11,11)]
for x,y in dots:
self.canvas.create_oval(
30 + x*40 - 5, 30 + y*40 -5,
30 + x*40 +5, 30 + y*40 +5,
fill="black"
)
落子功能需要处理鼠标点击坐标转换:
def handle_click(self, event):
# 将鼠标坐标转换为棋盘坐标(15×15网格)
x = round((event.x - 30) / 40)
y = round((event.y - 30) / 40)
# 校验落子合法性
if 0<=x<15 and 0<=y<15 and self.board[x][y] == 0:
self.place_piece(x, y)
# 检查是否获胜
if self.check_win(x, y):
winner = "黑棋" if self.current_player == 1 else "白棋"
messagebox.showinfo("游戏结束", f"{winner}获胜!")
self.root.destroy()
return
# 切换玩家
self.current_player = 2 if self.current_player == 1 else 1
def place_piece(self, x, y):
# 绘制棋子
color = "black" if self.current_player == 1 else "white"
self.canvas.create_oval(
30 + x*40 - 18, 30 + y*40 -18,
30 + x*40 + 18, 30 + y*40 + 18,
fill=color, outline="black", width=2
)
# 更新棋盘数据
self.board[x][y] = self.current_player
第三步:胜负判定逻辑
这是游戏的核心算法,需要检查横、竖、斜向是否有五子连珠:
def check_win(self, x, y):
player = self.current_player
directions = [
[(0,1), (0,-1)], # 水平方向
[(1,0), (-1,0)], # 垂直方向
[(1,1), (-1,-1)], # 对角线1
[(1,-1), (-1,1)] # 对角线2
]
for dir_pair in directions:
count = 1 # 当前位置已有1颗棋子
# 检查两个相反方向
for dx, dy in dir_pair:
nx, ny = x + dx, y + dy
while 0<=nx<15 and 0<=ny<15 and self.board[nx][ny] == player:
count +=1
nx += dx
ny += dy
if count >=5:
return True
return False
第四步:完善程序入口
最后添加主程序入口代码,让游戏能够运行:
if __name__ == "__main__":
root = tk.Tk()
game = Gobang()
root.mainloop()
功能扩展建议
这个基础版本实现了核心玩法,大家可以尝试扩展这些功能:
- 增加悔棋功能(记录每一步操作)
- 实现人机对战(用简单的AI算法)
- 添加计时功能和步数统计
- 支持游戏存档与读档
开发总结
通过这个项目,我们掌握了:
- Tkinter的基本绘图功能(线条、椭圆等)
- 事件绑定与坐标计算
- 二维数组的数据处理
- 胜负判定的算法逻辑
整个开发过程难度适中,代码量不大,非常适合Python初学者练手。