本程式由Python3.5.2 +Pyqt5 製作而成,範例代碼可由下面連結取得
https://github.com/Ashing00/Othello/tree/master
程式執行畫面如下圖所示:
重要的程式片段如下:
判斷一次落子是否有效:
def isValidMove(self,board, tile, xstart, ystart):
為了成為一個有效的移動,在該方向上的移動第一步必須滿足以下條件,(1)位置必須在遊戲棋盤上,(2)必須至少能夠翻轉對手一個棋子,否則若沒有任何可供翻轉的棋子,該落子點就不是有效的落子位置,於是下面程式就是用來判斷落子位置是否為有效位置,如果是有效位置還會記錄需翻轉的棋子位置到tilesToFlip[] 串列清單。
棋盤資料為一二維的串列結構board[x][y] ,x與y分別代表0~7.
第192行為一迴圈,目的是會從落子點沿著,上、下、左、右、右斜上、右斜下、左斜上、左斜下、八個方向尋找及判斷是否有對手的棋子,8 次迴圈的執行,每一次便是尋找同一方向上是否有對手的棋子,如果有則記錄每一個經過的x,y座標,直到碰到同顏色的棋子為止,最後會存入tilesToFlip[] 串列清單,若最後tilesToFlip[] 串列沒有紀錄任何x,y座標資料,則返回False,表示該次落子非有效落子點。
計算棋盤得分:
def getScoreOfBoard(self,board):
以下程式則是計算每下一子,玩家與電腦A.I的得分,也就是棋子數,該函數簡單,其作用可以用來判斷最後誰輸誰贏,以及另一個重要的作用則是作為電腦A.I下子的判斷依據。
電腦A.I的下子:
def getComputerMove(self,board, computerTile):
電腦AI落子的判斷如下,其實並不複雜,首先在271行從 self.getValidMoves(board, computerTile)函數得到可落子的的位置清單,並將所有可下的位置隨機洗牌,接下來兩點策略判斷決定了電腦的落子(1)如果可落子清單裡,有可下在最角落的四個點,那麼就下在那個位置。
不然的話,(2)計算該落子是否可獲得較高的得分,這時便會使用到上述getScoreOfBoard()函數來模擬得分,如果該落子點可得分最高,便落在該點。
以上就是簡單的解釋黑百棋小遊戲程式運作的方式,這也許也稱不上人工智慧,主要就是拿來練習Python程式及PyQt5的應用.
FB 專頁:
https://www.facebook.com/arbu00/
<其他文章>
人工神經網路(1)--使用Python實作perceptron(感知器)
人工神經網路(2)--使用Python實作後向傳遞神經網路演算法(Backprogation artificial neature network)
深度學習(1)-如何在windows安裝Theano +Keras +Tensorflow並使用GPU加速訓練神經網路
深度學習(2)--使用Tensorflow實作卷積神經網路(Convolutional neural network,CNN)
深度學習(3)--循環神經網絡(RNN, Recurrent Neural Networks)
深度學習(4)--使用Tensorflow實現類Lenet5手寫數字辨識
深度學習(5)--使用Tensorflow實現類AlexNet手寫數字辨識
深度學習(6)--使用Tensorflow實現類AlexNet model 訓練Cifar10數據集
機器學習(1)--使用OPENCV KNN實作手寫辨識
機器學習(2)--使用OPENCV SVM實作手寫辨識
機器學習(4)--資料標準常態化與隨機梯度下降法( standardization & Stochastic Gradient descent)
機器學習(5)--邏輯斯迴歸,過度適合與正規化( Logistic regression,overfitting and regularization)
機器學習(6)--主成分分析(Principal component analysis,PCA)
機器學習(7)--利用核主成分分析(Kernel PCA)處理非線性對應
機器學習(8)--實作多層感知器(Multilayer Perceptron,MLP)手寫數字辨識