PyQt写的五子棋
技术路线
GUI的实现
- 使用PyQt技术作为基础。PyQt是一个支持多平台的客户端开发SDK,使用它实现的客户端可以运行在目前几乎所有主流平台之上。
- 使用PyQt,Qt设计器实现UI,通过
pyuic4 -x -o main_page.py untitled.ui
命令将设计好的xml文件转换为python程序。 - 继承纯UI的mainWindow类,重写setupUI方法,在UI建立完成之后进行控件的信号-槽的绑定。
- 在子类中完成各类事件的响应。
棋盘的绘制
- PyQt提供了丰富的控件,如TableView,虽然和棋盘有相似之处,但提供的API过于死板。所以我决定用Widget绘制一个棋盘。
- 建立一个QiPan类,继承于
QtGui.QWidget
实现它的paintEvent
接口,在此接口中可进行Widget的绘制。 - 将QiPan的长宽和棋盘格子数进行计算,绘制横纵的直线,完成棋盘的绘制。
- 将QiPan类实例化,得到的对象在主窗口setupUI的时候添加到上一层的容器内。
落子位置的判定
- 因为用户不可能每次恰好点中横纵线的交点处,所以要对用户点击的位置的坐标进行判定,判断用户想要落子到哪个点
- 如图,我将每个点的有效范围扩充至它到邻点的1/2组成的矩形。如图阴影区域:
- 如此,棋盘中每个点都能映射到对应的交点上。
胜利条件判定算法
- 因为每次落棋都需要判定当前状态是否有一方胜利,所以胜利条件的判定应当在每次落棋之后进行。
- 又因为每次落棋时,落子的一方只有(赢/还没赢)两种状态,所以只需判断落子的一方是否赢得比赛,另一方的棋子无需判断。所以只需从当前落子的棋的4条线上进行判定是否连珠即可。
4条线分为8个方向,两两对称。因为情况很多,所以我构造了两个数组,dx和dy,如图:
将数组从[0,3][4,7]分为两部分,分别对应四条线每条线的两个方向。
如此只需循环遍历8个方向,每个方向出发的4个棋子子,统计这些棋子有多少和中心棋子颜色相同,每个方向的除以4取余数的存储计算结果。
如果某个方向上第x个棋子已经与中心棋子不同,立即跳出循环,不再继续遍历该方向。
核心判断代码:
def check_line(self, x, y, map, width, height):
tag = map[x][y]
dx = [+1, -1, 0, -1, -1, + 1, 0, +1]
dy = [-1, 0, -1, -1, +1, 0, +1, +1]
count = [0] * 4
for k in xrange(0, 8):
for i in xrange(1, 5):
if 0 < x + dx[k] * i < width and 0 < y + dy[k] * i < height and map[x + dx[k] * i][y + dy[k] * i] == tag:
count[k % 4] += 1
else:
break
for k in count:
if k == 4:
return True
return False
悔棋功能的实现
- 建立两个栈,分别用作黑棋和白棋的棋子状态,在每次落子时push进该棋子的状态。
- 当用户点击悔棋按钮时,从相应的栈中pop出来,恢复上一状态。
工程结构
采用MVC的模式
- build: 生成可执行文件目录
controller:UI的相关控制,相当于C的作用
- MyMainWindow.py:继承Ui_MainWindow类,主要控制主窗口
- QiPan.py:棋盘类,继承于QWidget,用于棋盘的相关控制
libs: 各项判定条件的算法,充当了一部分Model的作用
- AI.py:AI类,用来判定输赢条件
- BitmapTools.py:封装了对落子在棋盘map中的位置的判定方法
resource:图片资源文件夹
ui:UI相关代码,View的作用
- main_page.py:UI界面的python代码
- untitled.ui:UI界面的xml代码
阿萨德 - app.py:主函数入口,用于启动MainWindow
设计模式
单例模式
AI类和BitMapTools都采用单例模式: 好处在于可以只用实例化一次,占用资源少。在棋盘初始化的时候就加载这两个工具类,将它们的实例保存为成员,以后可以频繁地使用这个实例。
class BitMapTools:
tools = None
@staticmethod
def getinstance():
if BitMapTools.tools is None:
BitMapTools.tools = BitMapTools()
return BitMapTools.tools
观察者模式
继承UI相关的类,并重写setupUI,在其中订阅各类点击事件,在相关的函数中处理这些事件发生之后的工作。
self.father.restart_btn.clicked.connect(self.restart)
这样每一个事件对应一个函数,使得结构更加清晰。
from: PyQt写的五子棋
blog: http://cyhhao.zhusun.in/
PyQt写的五子棋的更多相关文章
- PyQt写的浏览单web页面的browser - 开源中国社区
PyQt写的浏览单web页面的browser - 开源中国社区 PyQt写的浏览单web页面的browser
- python使用pyqt写带界面工具
上篇介绍的使用python自带tkinter包,来写带界面的工具. 此篇介绍使用pyqt来开发测试工具. tkinter的好处是python官方自带,上手容易(但手写控件复杂),布局和摆放都不直观和容 ...
- 使用pyqt写了一个检查大数据环境的gui
通过pyqt做了一个大数据最佳实践检查的gui界面 1.首先是需要用到的模块 from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets ...
- 用C++基础语句写一个五子棋游戏
(这是一个颜色会变化的呦) #include <iostream> using namespace std; int b[][]; int n; int m; void qipan() { ...
- 基于Blazor写一个简单的五子棋游戏
写这个五子棋游戏,其实主要目的是想尝试一下微软新作Blazor.Blazor对于那些搞.NET的程序员,又想做一些前端工作,真的挺友好,不用一句JS就可搞定前端交互,美哉.现在已经有很流行的前端框架, ...
- 【源码分享】iOS-OC版五子棋
五子棋是程序猿比较熟悉的一款小游戏,相信很多人大学时期就用多种语言写过五子棋小游戏,笔者工作闲暇之余,试着用OC实现了一下,在这里给大家分享一下.有不足之处,欢迎大家提供建议和指点! GitHub源码 ...
- 五子棋-b
五子棋是程序猿比较熟悉的一款小游戏,相信很多人大学时期就用多种语言写过五子棋小游戏.笔者工作闲暇之余,试着用OC实现了一下,在这里给大家分享一下.有不足之处,欢迎大家提供建议和指点!!!GitHub源 ...
- 纯CSS3之五子棋(黑白棋)画法
无聊想用JS写个五子棋玩玩,这边先用CSS3画出了五子棋,感觉挺惊艳的.发上来看看 PS:第一次发博文T-T 此为个人原创. 不多说上图: 代码如下: <!DOCTYPE html> & ...
- C++ 之 简单的五子棋AI程序
本人是大一新生,寒假无聊,抱着试试看的心态(没有想到可以完成),写了C++的简单五子棋程序,开心. 下面是效果图: 一.首先讲讲大致思路. 五子棋实现的基础: ...
随机推荐
- Linux CentOS下如何确认MySQL服务已经启动
Linux CentOS一般做为服务器使用,因此,MySQL服务应该随开机自动启动的.正常情况下,查看开机自动启动的服务使用chkconfig命令,如下: #chkconfig --list 实际使用 ...
- PostgreSQL基础整理(一)
1. 创建数据库: 1)登录bin目录,createdb.exe -U postgres -e mydb; -U 表示本次操作的登录用户名,如果不写会取windows登录的账户,如Administra ...
- STC12C5A60S2笔记4(复位)
1. 基本特性 STC 单片机有5种复位方式: 1) 热启动复位: 1.1)外部RST引脚复位 第一功能复位脚,即管脚9 RST/P4.7,该管脚拉高维持24个时钟周期+10ms后,单片机进入复位状态 ...
- MySQL5:性能优化
性能优化 优化MySQL数据库是数据库管理员和数据库开发人员的必备技能.MySQL优化,一方面是找出系统的瓶颈,提高MySQL数据库的整体性能:一方面需要合理的结构设计和参数调整,以提高用户操作响应的 ...
- EF6(CodeFirst)+MySql开发脱坑指南
废话 话说当年,在一个春光明媚的晌午,邂逅了迷人的丁香姑娘,从此拜倒在了她的石榴裙下,至今不能自拔,这位丁香姑娘就是ORM思想. 所谓ORM思想,我的理解就是根据一定的规则,把程序中的对象和数据库中的 ...
- [stm32] SIM808模块之发短信\GPS\TCP\HTTP研究
SIM8008是四频模块,全球可用.含有TTL电平接口等接口,能够实现发短信.打电话.GPRS传输数据.GPS等功能.[正版资料请找beautifulzzzz·博客园] 一些细节: >> ...
- 我心中的核心组件~HttpHandler和HttpModule实现图像的缩放与Url的重写
回到目录 说在前 对于资源列表页来说,我们经常会把图像做成N多种,大图,小图,中图等等,很是麻烦,在数据迁移时,更是一种痛快,而如果你把图像资源部署到nginx上,那么这种图像缩放就变得很容易了,因为 ...
- 移动h5开发资源整理
这2年来,移动h5开发逐渐成为一种主流,也不断趋向于成熟.硬件和浏览器的不断更新,曾经的浏览器兼容也不再是开发者的噩梦. 接触h5开发一年多,从最初的新手到现在,陆陆续续遇到过很多坑.这里把想到的一些 ...
- 用PHP访问数据库
<?php //1造链接.面向对象 .方式对象方式 //把对象定个名字$db //MySQLi:数据扩展类.在MySQLi里做对象() //host:代表服务器地址也叫做本机[本机服务器loca ...
- telnet命令——连接服务器
Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户提供了在本地计算机上完成远程主机工作的能力.在终端使用者的电脑上使用telnet程序,用它连接 ...