当前位置: 首页 > article >正文

Python实战:三种GUI库打造可玩性五子棋(附完整源码)

1. 为什么用Python开发五子棋五子棋作为经典策略游戏用Python实现不仅能巩固编程基础还能深入理解游戏逻辑与GUI交互。我最初选择用Python开发五子棋就是看中它快速验证想法的特性——短短几十行代码就能看到棋子落在棋盘上的效果这种即时反馈对初学者特别友好。Python的GUI库生态丰富从内置的tkinter到专业的Pygame再到强大的PyQt不同技术栈能带来截然不同的开发体验。比如用tkinter只需关注棋盘绘制和点击事件而Pygame则要考虑帧率控制和动画效果。我在实际项目中测试发现tkinter版本开发速度最快但Pygame版本用户体验更流畅。对于教学场景五子棋包含的二维数组存储棋盘状态、鼠标事件绑定、胜负判定算法等核心要素都是游戏开发的通用技术。下面这段最简单的胜负判断代码就演示了如何用遍历实现五子连珠检测def check_win(board, x, y): directions [(1,0),(0,1),(1,1),(1,-1)] # 横向、纵向、对角线 for dx, dy in directions: count 1 for step in range(1,5): # 向四个方向检测 if board[xdx*step][ydy*step] board[x][y]: count 1 else: break if count 5: return True return False2. tkinter极简实现方案2.1 基础棋盘绘制tkinter作为Python标准库最大的优势是无需安装依赖。我建议初学者从这里入手先理解游戏基本框架。创建棋盘只需要Canvas组件的create_line方法import tkinter as tk root tk.Tk() canvas tk.Canvas(root, width600, height600, bgburlywood) canvas.pack() # 绘制15x15网格 for i in range(15): canvas.create_line(30, 30i*40, 590, 30i*40) # 横线 canvas.create_line(30i*40, 30, 30i*40, 590) # 竖线这里有个细节优化通过调整bg参数可以改变棋盘材质感比如用burlywood呈现木质纹理。我在实际测试中发现网格间距40像素既保证操作精度又不会显得拥挤。2.2 事件绑定与落子逻辑鼠标点击事件需要处理坐标转换——将物理像素坐标转换为棋盘行列号。这里用整除运算实现def on_click(event): col (event.x-30) // 40 # 换算列号 row (event.y-30) // 40 # 换算行号 if 0 row 15 and 0 col 15: draw_piece(row, col) canvas.bind(Button-1, on_click)落子时要考虑防重复点击我用二维数组board记录状态。交替落子通过全局变量turn实现board [[None]*15 for _ in range(15)] turn black # 黑棋先行 def draw_piece(row, col): global turn if board[row][col]: return # 已有棋子 x, y 30col*40, 30row*40 color black if turn black else white canvas.create_oval(x-15, y-15, x15, y15, fillcolor) board[row][col] color turn white if turn black else black # 切换回合3. Pygame进阶实现方案3.1 游戏循环与动画效果Pygame的双缓冲技术能消除画面闪烁适合需要流畅动画的场景。初始化时需要设置游戏主循环import pygame pygame.init() screen pygame.display.set_mode((630, 630)) clock pygame.time.Clock() running True while running: for event in pygame.event.get(): if event.type pygame.QUIT: running False # 绘制逻辑 pygame.display.flip() # 刷新画面 clock.tick(60) # 60FPS相比tkinter的被动事件驱动Pygame的主动轮询机制更适合实现棋子下落动画。我通过逐帧修改y坐标实现def animate_drop(x, y): for dy in range(0, y, 5): # 每次下落5像素 draw_board() pygame.draw.circle(screen, color, (x, dy), 15) pygame.display.update() pygame.time.delay(30) # 控制动画速度3.2 胜负判定优化Pygame版本可以高亮显示获胜棋子提升用户体验。改进后的check_win函数会返回获胜棋子位置def check_win(board, x, y): # ...同前文判断逻辑... if count 5: return [(xdx*i, ydy*i) for i in range(5)] # 返回连珠位置 return None # 绘制时高亮显示 win_line check_win(board, row, col) if win_line: for r,c in win_line: pygame.draw.rect(screen, (255,0,0), (c*4010, r*4010, 20, 20), 3)4. PyQt专业级实现4.1 面向对象设计PyQt适合构建更复杂的游戏架构。我推荐使用类封装游戏逻辑from PyQt5.QtWidgets import QApplication, QMainWindow class Gobang(QMainWindow): def __init__(self): super().__init__() self.board [[None]*15 for _ in range(15)] self.initUI() def initUI(self): self.setFixedSize(600, 600) self.setWindowTitle(五子棋) def paintEvent(self, event): painter QPainter(self) # 绘制棋盘和棋子...这种结构方便扩展功能比如添加悔棋功能只需要维护操作栈class Gobang: def __init__(self): self.history [] # 记录每一步 def mousePressEvent(self, event): # ...落子逻辑... self.history.append((row, col)) # 记录操作 def undo(self): if self.history: row, col self.history.pop() self.board[row][col] None self.update()4.2 多线程处理AI对战PyQt的QThread可以轻松实现人机对战。AI计算在后台线程运行避免界面卡顿from PyQt5.QtCore import QThread, pyqtSignal class AIThread(QThread): resultReady pyqtSignal(tuple) # 信号返回落子位置 def run(self): # 复杂计算... self.resultReady.emit((best_row, best_col)) # 主窗口中使用 ai AIThread() ai.resultReady.connect(self.on_ai_move) ai.start()5. 三种技术栈对比通过实际开发体验我整理出关键差异点特性tkinterPygamePyQt安装难度Python内置需pip安装需单独安装PyQt5渲染性能较差优秀良好事件处理回调机制轮询机制信号槽机制适合场景快速原型游戏开发复杂应用代码量(相同功能)约150行约200行约300行扩展性低中高从实际体验看tkinter适合教学演示30分钟就能完成基础版本Pygame适合想深入游戏开发的初学者可以学习帧动画和碰撞检测PyQt适合需要发布成EXE的正式项目能做出更专业的界面。我在开发过程中遇到的典型问题包括tkinter版本在密集落子时会出现画面闪烁Pygame的鼠标坐标需要手动校准PyQt的多线程需要注意避免直接操作UI组件6. 完整源码优化建议针对原始代码的不足我做了这些改进增加重新开始功能重置棋盘状态并清空画布def reset_game(): global board, turn board [[None]*15 for _ in range(15)] turn black canvas.delete(all) # 清空画布 draw_board() # 重绘棋盘优化胜负判定效率只检测最后落子点的四个方向添加游戏状态显示在界面底部显示当前回合status tk.Label(root, text黑棋回合, font(Arial, 20)) status.pack(sidebottom)异常处理防止数组越界访问def is_valid_position(row, col): return 0 row 15 and 0 col 15最终推荐的项目结构应该包含/assets存放图片音效main.py主程序入口ai.py人机对战算法constants.py颜色尺寸等配置在PyQt版本中我还建议使用QSS实现样式分离/* style.qss */ QMainWindow { background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #f6e6b4, stop:1 #ed9017); }

相关文章:

Python实战:三种GUI库打造可玩性五子棋(附完整源码)

1. 为什么用Python开发五子棋 五子棋作为经典策略游戏,用Python实现不仅能巩固编程基础,还能深入理解游戏逻辑与GUI交互。我最初选择用Python开发五子棋,就是看中它快速验证想法的特性——短短几十行代码就能看到棋子落在棋盘上的效果&#x…...

SystemVerilog Clocking Block实战:从接口同步到Verdi Delta Cycle调试

1. SystemVerilog Clocking Block基础解析 Clocking Block是SystemVerilog中用于接口同步的核心语法结构,它本质上是一个时序控制单元,能够精确管理信号采样和驱动的时序关系。想象一下,这就像在繁忙的十字路口设置红绿灯,确保不同…...

Unity3D——UGI基础知识(1)

一、六大基础组件介绍1、组件创建在UI中创建一个image,unity就会自动创建一个Canvas和一个EventSystem,这是必不可少的重要UGI内容。下面是他们的组件类别及作用概述。2、了解组件内容1.Canvas组件1.1Canvas组件的作用Canvas是画布,它是UGUI中…...

告别同步慢与数据泄露!2026国内主流企业网盘深度横评

在数字化转型的 2026 年,高效的文档协作已成为企业组织的核心竞争力。面对市面上琳琅满目的选择,主流网盘厂商究竟哪个能够真正适应复杂的业务场景?很多选型者在追求海量空间的同时,往往忽视了同步速度、网络抗并发性、权限管控及…...

ESP32 OTA升级实战:从零搭建一个带版本校验和自动回滚的远程固件更新服务

ESP32 OTA升级实战:构建企业级远程固件更新系统 去年夏天,我们团队的一个智能农业项目差点因为固件更新失败而损失惨重。当时200台部署在农田的ESP32设备因为网络波动导致固件下载不完整,系统陷入启动循环。正是那次经历让我意识到&#xff0…...

D4: 常见误区:管理者最容易踩的 5 个坑

文章目录 D4: 常见误区:管理者最容易踩的 5 个坑 🎯 为什么这个话题重要? 核心内容:管理者最容易踩的 5 个坑 坑 1:把 AI 当万能药,忽视基本功 坑 2:一刀切推行,忽视团队差异 坑 3:只看效率提升,忽视质量风险 坑 4:忽视安全与合规边界 坑 5:期待立竿见影,缺乏长期…...

语音识别入门必看:为什么Mel谱比原始波形和普通频谱图更好用?

语音识别中的Mel谱:为什么它比原始波形和普通频谱更胜一筹? 想象一下,你正在教一个刚学中文的外国朋友分辨"妈妈"和"马"这两个词的发音差异。直接播放原始录音可能让他一头雾水,但如果你把声音的高低变化画成…...

智能编程进入“所见即所得”时代:GPT-4o + Mermaid+AST可视化协同工作流(工业级实践白皮书首发)

第一章:智能编程进入“所见即所得”时代:GPT-4o Mermaid AST可视化协同工作流(工业级实践白皮书首发) 2026奇点智能技术大会(https://ml-summit.org) 传统代码生成范式正被实时、可验证、可交互的语义闭环工作流取代。GPT-4o 的…...

Mind+学习和项目栈1

提示:本内容仅供自己学习使用,以免长时间后,记忆检索困难,特此简单梳理操作思路和具体案例。安装包啥的官网就有,Mind官网 - 一站式满足程序设计、模型训练、界面设计。 0.认识工具了解功能:我觉得没有项目…...

Redis如何降低快照对CPU的影响_合理分配RDB执行时机避开业务高峰期

RDB快照导致CPU飙高源于fork后COW机制在高频写入时触发大量页复制;应禁用主节点自动快照,改由从节点低峰期执行,并关闭rdbcompression、rdbchecksum等加重CPU的默认配置。为什么RDB快照会让CPU突然飙高?Redis 生成 RDB 快照时&…...

AI辅助开发术语体系深度剖析

随着生成式AI与软件开发的深度融合,一系列全新的术语和开发范式应运而生。这些概念并非孤立存在,而是相互关联、层层支撑,共同构成了当前AI编程的新骨架。对于有一定基础的开发者而言,系统性掌握这套术语体系,不仅能提…...

别再手动改代码了!用Postman汉化插件5分钟搞定中文界面(附最新版下载)

5分钟解锁Postman中文界面:零代码汉化全攻略 第一次打开Postman时,满屏的英文术语是否让你望而却步?作为国内开发者,我们常常需要在这款强大的API测试工具和中文思维之间来回切换。其实,只需一个浏览器插件&#xff0…...

别再乱用self了!深入理解Python中@staticmethod和@classmethod的正确使用场景

别再乱用self了!深入理解Python中staticmethod和classmethod的正确使用场景 在Python开发中,我们经常会遇到各种关于方法调用的困惑。特别是当看到"missing 1 required positional argument"这样的错误时,很多开发者会感到一头雾水…...

【生成式编程安全生死线】:从GitHub Copilot到CodeWhisperer,必须启用的4层静态+动态校验机制

第一章:智能代码生成代码安全性检查 2026奇点智能技术大会(https://ml-summit.org) 智能代码生成工具(如Copilot、CodeWhisperer、Tabnine)在提升开发效率的同时,可能引入未经验证的安全隐患——包括硬编码密钥、不安全的反序列化…...

【限时解密】2026奇点大会未公开闭门报告:AI编程助手在金融级代码审计、合规注释生成、跨语言重构三大高危场景的真实失效案例(仅剩97份内部摘要)

第一章:2026奇点智能技术大会:AI编程助手对比评测 2026奇点智能技术大会(https://ml-summit.org) 在2026奇点智能技术大会上,来自全球12家主流厂商的AI编程助手接受了统一基准测试——包括代码补全准确率、跨文件上下文理解、调试建议有效性…...

PyTorch迁移学习避坑指南:修改SqueezeNet分类层时别忘了改这个隐藏参数

PyTorch迁移学习避坑指南:修改SqueezeNet分类层时别忘了改这个隐藏参数 在深度学习领域,迁移学习已经成为提升模型性能的利器。PyTorch作为当前最受欢迎的深度学习框架之一,其丰富的预训练模型库让开发者能够快速实现各种计算机视觉任务。然而…...

全网最细!Maven 编译构建 Java Web 项目从入门到实战一文吃透

使用Maven编译并构建java web项目 一、Maven概述 Maven,是一个专为Java平台设计的项目管理和构建工具。其核心思想在于“约定优于配置,通过提供一套默认的构建和依赖管理规则,降低了项目配置的复杂性,使开发者能够专注于业务逻辑…...

图像滤波实战:用MATLAB玩转频域,5分钟学会低通/高通滤波(附完整代码)

图像滤波实战:用MATLAB玩转频域,5分钟学会低通/高通滤波(附完整代码) 当你面对一张需要去噪或锐化的图片时,频域处理技术能像魔法一样帮你实现这些效果。不同于传统空间域的像素级操作,频域处理让我们能够直…...

如何利用S32DS与NCF Tool高效配置KEA的LIN节点(一)

1. 从零认识LIN总线与KEA系列MCU 第一次接触汽车电子开发的朋友可能会好奇,为什么车窗升降、雨刮控制这些简单功能需要专门的总线协议?其实在车身控制领域,LIN(Local Interconnect Network)总线就像小区里的自行车道—…...

077_D11、卡车小镇.Trucktown.适合3-8岁资料网盘下载

D11、卡车小镇.Trucktown.适合3-8岁资料网盘下载 如果你正在寻找一份适合低龄儿童启蒙观看或亲子共学的英语类动画资源,那么 D11、卡车小镇.Trucktown.适合3-8岁资料网盘下载 这类内容通常会是很多家长关注的方向。尤其是在家庭英语启蒙、日常磨耳朵和兴趣培养场景…...

SDR技术在医学成像OCT中的应用与优化

1. SDR技术与医学成像的跨界融合在医疗设备研发领域,一个令人着迷的现象是:尖端技术往往先在军事或通信领域成熟,随后才逐步渗透到民用医疗领域。这种技术迁移不仅降低了研发成本,更带来了性能的飞跃。软件定义无线电(…...

为端到端API添加Naive RAG 流程

在前文中,我们结合langchain和fastapi搭建了一个端到端的问答API,这个agent可以调用已经封装好的工具函数,可以获取本地数据库,有记忆功能;但是这样的模型训练好了过后只是就固定了,如果没有获取或更新相应…...

AGI Python入门 保姆级教程

你不需要懂微积分,不需要背设计模式,甚至不需要知道什么是“面向对象”。 我们只做三件事:让大模型听懂人话 → 让它选择用哪个工具 → 让Python真正执行那个工具 不用怕数学,不用怕算法,只要你会“顺序、判断、循环…...

5分钟图解数码管驱动:从段选码表到位选扫描实战

1. 数码管驱动基础:从LED到数字显示 数码管本质上是一组排列成特定形状的LED灯。每个数码管由8个LED段组成(包括小数点),通过点亮不同段的组合来显示数字或字母。我第一次接触数码管是在大学电子设计课上,当时为了做一…...

51单片机红外人数统计系统

目录 具体实现功能 设计介绍 51单片机简介 资料内容 原理图(AD19) 仿真实现(protues8.7) 程序(Keil5) 全部资料 资料获取 具体实现功能 由51单片机数码管红外计数传感器按键蜂鸣器等构成。 具体功…...

图解Android蓝牙启动:从App调用enable()到HAL层回调的完整消息传递链路

Android蓝牙启动流程深度解析:从应用层到HAL层的完整链路 在车载系统、智能家居等场景中,蓝牙作为核心无线通信协议,其启动过程的稳定性直接影响用户体验。本文将深入剖析Android蓝牙子系统从应用层调用enable()到HAL层回调的完整消息传递链路…...

【花雕学编程】Arduino BLDC 之多电机扭矩分配(差速驱动机器人)

在机器人工程领域,差速驱动(Differential Drive)因其结构简单、机动性强(可原地转向)而被广泛应用于各类移动机器人。对于采用双BLDC(无刷直流)电机作为驱动核心的差速驱动机器人,“…...

STM32F4 RTC实战:从日历闹钟到低功耗唤醒

1. STM32F4 RTC模块基础入门 第一次接触STM32F4的RTC模块时,我完全被它强大的功能震撼到了。这个看似简单的实时时钟模块,实际上是个功能完整的计时系统。想象一下,你的嵌入式设备即使断电也能保持准确时间,还能在特定时刻自动唤醒…...

从零到一:Keil MDK ARM/51双环境搭建与芯片包全配置实战

1. 环境准备与安装基础 第一次接触Keil MDK时,我对着满屏的英文界面和复杂的配置选项完全无从下手。后来才发现,只要掌握几个关键步骤,搭建双开发环境其实比想象中简单得多。我们先从最基础的软件安装说起,这里有个小技巧&#xf…...

如何导入带系统变量修改的SQL_确保SUPER权限并规避只读变量报错

MySQL 5.7导入SQL报ERROR 1227是因SET GLOBAL语句需SUPER权限,且在read_onlyON实例上必失败;应优先过滤global/session SET语句或改用SESSION级设置。导入SQL时提示 ERROR 1227 (42501): Access denied; you need (at least one of) the SUPER privilege…...