import tkinter as tk
from tkinter import messagebox
# 定义常量
ROWS = 19 # 棋盘行数
COLS = 19 # 棋盘列数
PADDING = 30 # 棋盘边距
GRID_SIZE = 20 # 每个格子的大小
# 创建棋盘,初始化为0表示无棋子
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 = "black"
label.config(text="白子回合")
else: # 白方玩家
color = "white"
label.config(text="黑子回合")
board[row][col] = current_player # 记录棋子
x = col * GRID_SIZE + PADDING # 计算棋子中心x坐标
y = row * GRID_SIZE + PADDING # 计算棋子中心y坐标
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 # 切换玩家
def start_game():
# 开始游戏,隐藏启动页面,显示游戏界面
start_frame.pack_forget()
game_frame.pack()
# 创建窗口
window = tk.Tk()
window.title("五子棋")
window.geometry(str(COLS * GRID_SIZE + PADDING * 2) + "x" + str(ROWS * GRID_SIZE + PADDING * 2 + 40))
window.configure(bg='burlywood')
# 创建启动页面
start_frame = tk.Frame(window)
start_frame.configure(bg='burlywood')
start_frame.pack()
start_label = tk.Label(start_frame, text="五子棋游戏", font=("黑体", 30))
start_label.configure(bg='burlywood')
start_label.pack(pady=100)
start_button = tk.Button(start_frame, text="开始游戏", command=start_game, font=("宋体", 14))
start_button.pack(pady=0)
# 创建游戏页面
game_frame = tk.Frame(window)
# 创建画布
canvas = tk.Canvas(game_frame, width=COLS * GRID_SIZE + PADDING * 2, height=ROWS * GRID_SIZE + PADDING * 2,
bg="burlywood")
canvas.pack(pady=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五子棋案例
资源推荐
资源详情
资源评论
收起资源包目录
五子棋案例.rar (1个子文件)
main.py 5KB
共 1 条
- 1
资源评论
a辰龙a
- 粉丝: 3053
- 资源: 59
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功