這篇博客主要是為了學(xué)習(xí)Python和PyQt,因?yàn)閷?duì)棋類游戲比較熱衷,所以從規(guī)則較簡(jiǎn)單的五子棋入手,利用PyQt5實(shí)現(xiàn)圖形界面,做一個(gè)可以進(jìn)行人機(jī)對(duì)弈的腳本,最后打包成應(yīng)用程序。AI的算法打算用神經(jīng)網(wǎng)絡(luò)來(lái)完成,正在苦學(xué)TensorFlow中。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:國(guó)際域名空間、虛擬空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、德令哈網(wǎng)站維護(hù)、網(wǎng)站推廣。本來(lái)我以為五子棋規(guī)則很簡(jiǎn)單,不就像小學(xué)時(shí)候玩的那樣,五個(gè)棋子連在一起就贏了嘛,但是后來(lái)發(fā)現(xiàn)事情并沒(méi)有那么簡(jiǎn)單,現(xiàn)在的五子棋有禁手這個(gè)規(guī)則 ,“三三禁手” 、“四四禁手”、“長(zhǎng)連禁手”等等,都是為了限制現(xiàn)行一方必勝。我也不是職業(yè)的棋手,對(duì)吧,所以禁手什么的就不考慮了,弄個(gè)簡(jiǎn)單的成品出來(lái)就很滿足了。
代碼全是邊學(xué)習(xí)邊寫的,有瑕疵的地方歡迎提出。
第一步,收集素材
主要就是棋子、棋盤的圖片,還有下棋的音效
音效與代碼一起在最后給出
第二步,五子棋的邏輯類
收集完素材后,不著急界面的編寫,先將五子棋的邏輯寫好,界面和邏輯要分開,這很重要。
先想想在五子棋的邏輯類里要有哪些東西。
首先是棋盤,棋盤用15*15的數(shù)組表示
然后是棋子,黑棋用1表示,白棋用2表示,空白就用0表示
再然后還要獲取指定點(diǎn)的坐標(biāo),獲取指定點(diǎn)的方向等等。
最重要的也是稍微有點(diǎn)難度的部分就是判斷輸贏。結(jié)合網(wǎng)上的方法和我自己的理解,下面貼出我寫的代碼,僅供參考。
chessboard.py
# ---------------------------------------------------------------------- # 定義棋子類型,輸贏情況 # ---------------------------------------------------------------------- EMPTY = 0 BLACK = 1 WHITE = 2 # ---------------------------------------------------------------------- # 定義棋盤類,繪制棋盤的形狀,切換先后手,判斷輸贏等 # ---------------------------------------------------------------------- class ChessBoard(object): def __init__(self): self.__board = [[EMPTY for n in range(15)] for m in range(15)] self.__dir = [[(-1, 0), (1, 0)], [(0, -1), (0, 1)], [(-1, 1), (1, -1)], [(-1, -1), (1, 1)]] # (左 右) (上 下) (左下 右上) (左上 右下) def board(self): # 返回?cái)?shù)組對(duì)象 return self.__board def draw_xy(self, x, y, state): # 獲取落子點(diǎn)坐標(biāo)的狀態(tài) self.__board[x][y] = state def get_xy_on_logic_state(self, x, y): # 獲取指定點(diǎn)坐標(biāo)的狀態(tài) return self.__board[x][y] def get_next_xy(self, point, direction): # 獲取指定點(diǎn)的指定方向的坐標(biāo) x = point[0] + direction[0] y = point[1] + direction[1] if x < 0 or x >= 15 or y < 0 or y >= 15: return False else: return x, y def get_xy_on_direction_state(self, point, direction): # 獲取指定點(diǎn)的指定方向的狀態(tài) if point is not False: xy = self.get_next_xy(point, direction) if xy is not False: x, y = xy return self.__board[x][y] return False def anyone_win(self, x, y): state = self.get_xy_on_logic_state(x, y) # 當(dāng)前落下的棋是黑棋還是白棋,它的狀態(tài)存儲(chǔ)在state中 for directions in self.__dir: # 對(duì)米字的4個(gè)方向分別檢測(cè)是否有5子相連的棋 count = 1 # 初始記錄為1,因?yàn)閯偮湎碌钠逡菜? for direction in directions: # 對(duì)落下的棋子的同一條線的兩側(cè)都要檢測(cè),結(jié)果累積 point = (x, y) # 每次循環(huán)前都要刷新 while True: if self.get_xy_on_direction_state(point, direction) == state: count += 1 point = self.get_next_xy(point, direction) else: break if count >= 5: return state return EMPTY def reset(self): # 重置 self.__board = [[EMPTY for n in range(15)] for m in range(15)]