pyuic4 -x -o main_page.py untitled.ui
命令将设计好的xml文件转换为python程序。QtGui.QWidget
实现它的paintEvent
接口,在此接口中可进行Widget的绘制。4条线分为8个方向,两两对称。由于状况不少,因此我构造了两个数组,dx和dy,如图:python
将数组从[0,3][4,7]分为两部分,分别对应四条线每条线的两个方向。算法
如此只需循环遍历8个方向,每一个方向出发的4个棋子子,统计这些棋子有多少和中心棋子颜色相同,每一个方向的除以4取余数的存储计算结果。设计模式
若是某个方向上第x个棋子已经与中心棋子不一样,当即跳出循环,再也不继续遍历该方向。数组
核心判断代码:app
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的做用ui
resource:图片资源文件夹spa
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/