2018年8月3日 星期五

Python(2)--Python小遊戲_井字棋


    這是一個經典的小遊戲井字棋,在九宮格上玩家與電腦輪流畫OXO,當每列或每行或是兩個對角成一線時便是獲勝。

本程式由Python3.5.2 +Pyqt5 製作而成,範例代碼可由下面連結取得

https://github.com/Ashing00/tictactoe/tree/master

程式執行畫面如下圖所示:
    程式提供了兩種人工智慧選擇,一個是強人工智慧另一個是弱人工智慧,選擇強人工智慧,如果電腦先下,玩家可以說是沒有贏的可能,因此特地弄出一個弱人工智慧選項,一來增加遊戲的趣味,一來可以比較這兩者在程式設計上的差異。選擇弱人工智慧,玩家通常可以簡單的獲勝。
    遊戲一開始還須得選擇O或X,然後會隨機選擇玩家先下或是電腦先下。







整個程式最主要的核心在於如何決定電腦如何落子,也就是人工智慧實現的部分,這部分的程式落在底下程式,function:getComputerMove(self,board) 是實現強人工智慧的方法。他有幾個判斷步驟,首先:

第一步驟:程式代碼165~170 ,先判斷該次落子"電腦"是否有獲勝的可能,用迴圈尋訪所有
    可落子地方,若有可獲勝的可能則在該地方落子

第二步驟:程式代碼172~178 ,先判斷該次落子"玩家"是否有獲勝的可能,用迴圈尋訪所有
    可落子地方,若"玩家"有可獲勝的可能則在該地方落子,目的是為了阻止玩家獲勝

若上述兩個動作都不成立,則接著判斷以下步驟落子

第三步驟:程式代碼180~183,[1,3,7,9]代表著在九宮格的四個角的編號 ,此段程式在
    此四個角落隨機選擇一地方下子

第四步驟:程式代碼185~187,[5]代表著在九宮格的中間位置的編號 ,此段程式判斷中
    間位置是否可落子

第五步驟:程式代碼189~190,[2,4,6,8]代表著在九宮格的四個邊的編號 ,此段程式在
    此四個邊落隨機選擇一地方下子

 透過判斷以上五個步驟的落子選擇ˊ,可以讓電腦無論是先手或是後手都可以處於不敗之地。




底下程式,function:getComputerMove_2(self,board) 則是實現弱人工智慧的方法,其實也就是改變上述強人工智慧的方法,只保留第一步驟規則,其餘落子則是隨機選擇。




另一個重要的程式片段如下266~276,用來判斷是否勝出,也就是判斷每列或每行或是對角線
是否有相同的O或X即可獲勝。




這是一個小遊戲的範例,或許也稱不上人工智慧,主要是拿來練習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)手寫數字辨識