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/