标签:
pyuic4 -x -o main_page.py untitled.ui
命令将设计好的xml文件转换为python程序。QtGui.QWidget
实现它的paintEvent
接口,在此接口中可进行Widget的绘制。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
采用MVC的模式
controller:UI的相关控制,相当于C的作用
libs: 各项判定条件的算法,充当了一部分Model的作用
resource:图片资源文件夹
ui:UI相关代码,View的作用
阿萨德 - 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/
标签:
原文地址:http://www.cnblogs.com/cyhhao/p/5939521.html