2018年8月10日 星期五

Python(3)--Python小遊戲_黑白棋

    這是一個經典的小遊戲黑白棋,在8x8 格子上玩家與電腦輪流下子,本示例程式用O,X來替代黑子與白子。遊戲玩法為黑子玩家與白子玩家輪流下自己顏色的棋子,在新下的棋子與同顏色的另一個棋子之間,如果有任何對手的棋子,都將其反轉,遊戲的目標是讓玩家自己的棋子盡可能的多。最後留下的棋子數最多者為贏家。

本程式由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實作手寫辨識
機器學習(3)--適應線性神經元與梯度下降法(Adaline neuron and Gradient descent)
機器學習(4)--資料標準常態化與隨機梯度下降法( standardization & Stochastic Gradient descent)
機器學習(5)--邏輯斯迴歸,過度適合與正規化( Logistic regression,overfitting and regularization)
機器學習(6)--主成分分析(Principal component analysis,PCA)
機器學習(7)--利用核主成分分析(Kernel PCA)處理非線性對應
機器學習(8)--實作多層感知器(Multilayer Perceptron,MLP)手寫數字辨識