VB.NET實現五子棋的人工智慧(1)

來源:互聯網
上載者:User
  人工智慧也就是所謂的AI(Artificial Intelligence),它是一門很抽象的技術,AI程式的編寫不需要依據任何既定的思考模式或者規則。尤其是遊戲中的AI可以完全依程式設計者本身的思考邏輯製作。我個人認為人工智慧的核心應該是使電腦具有自動的處理事件的能力,而我們的所有的研究也應該圍繞著這一方向。我們今天討論的是策略類的人工智慧。

  策略類人工智慧可以說是AI中比較複雜的一種,最常見的策略類AI遊戲就是棋盤式遊戲。在這類遊戲中,通常的策略類AI程式都是使電腦判斷目前狀況下所有可走的棋與可能的獲勝狀況,並計算當前電腦可走棋步的獲勝分數或者玩家可走棋步的獲勝分數,然後再決定出一個最佳走法。下面我們先介紹一下五子棋的AI構想。

  五子棋的AI構想

  有句話叫“當局者迷,旁觀者清。”,但這句話在由AI所控制的電腦玩家上是不成立的,因為電腦必須知道有那些獲勝方式,並計算出每下一步棋到棋盤上任一格子的獲勝幾率,也就是說,一個完整的五子棋的AI構想必須:
 
  1、能夠知道所有的獲勝組合;

  2、建立和使用獲勝表;

  3、設定獲勝的分數;

  4、使電腦具有攻擊和防守的能力;

  一、求五子棋的獲勝組合

  在一場五子棋的遊戲中,電腦必須要知道有那些的獲勝組合,因此我們必須求得獲勝組合的總數。我們假定當前的棋盤為10*10。

  (1)計算水平方向的獲勝組合數,每一列的獲勝組合是:6,共10列,所以水平方向的獲勝組合數為:6*10=60

  (2)計算垂直方向的獲勝組合總數,每一行的獲勝組合是:6,共10行,則垂直方向的獲勝組合數為:6*10=60

  (3)計算正對角線方向的獲勝組合總數,正對角線上的獲勝組合總數為6+(5+4+3+2+1)*2=36

  (4)計算反對角線方向的獲勝組合總數,反對角線上的獲勝組合總數為6+(5+4+3+2+1)*2=36 ,這樣所有的獲勝組合數為:60+60+36+36=192

  二、建立和使用獲勝表

  我們已經計算出了一個10*10的五子棋盤會有192種獲勝方式,這樣我們可以利用數組建立獲勝表,獲勝表的主要作用是:1,判斷當前的獲勝方式是否有效;2,判斷當前的獲勝方式中到底有多少子落入該獲勝組合中。詳細的使用您將在後面的程式中可以看出。

  三,分數的設定

  在遊戲中為了讓電腦能夠決定下一步最佳的走法,必須先計算出電腦下到棋盤上任一空格的分數,而其中最高分數便是電腦下一步的最佳走法。

  原理:我們判定當前討論的空格與當前討論的點有幾種獲勝的方式,有幾種該空格就加幾分。這種原理初聽起來似乎是無法入手,沒關係,當您瞭解我們後面的程式後您就會明白這種決策原理了。

  這種決策有一些缺陷,因為如果只根據這個模型設計,就有可能出現電腦或玩家有三個子連成一線的時候,電腦卻判斷不出,它認為其他某些空格是當前的獲勝的最佳位置而不去攻擊或防守。沒關係我們完全可以通過一個加強演算法來改變當前的分值情況,也就是說當電腦或玩家有三個子或四個子連成一線時,我們通過加強演算法將當前與三個子或四個子有關的空格的分值提高,從而可以彌補這一缺憾。

  四、攻擊與防守

  以上的方式,事實上電腦只是計算出了最佳的攻擊位置,為了防守我們還應計算當前玩家的最佳的攻擊位置。這樣有什麼用呢?道理很簡單,如果玩家最佳攻擊位置的分數大於電腦最佳攻擊位置上的分數,那麼電腦就將下一步的棋子擺在玩家的最佳攻擊位上以阻止玩家的進攻,否則電腦便將棋子下在自己的最佳攻擊位置上進行攻擊。

  事實上,這個AI構想是很強大的如果你不是很厲害的五子棋高手的話,可能很快會被電腦打敗。我在聯眾上可是中級棋手啊,跟這種構想打的時候勝率也不是很高。

使用vb.net編寫五子棋

  一、編寫前的準備:

  1、用電腦的思想描述整個下棋的過程

  考慮步驟:

  (1)為了簡便我們可以先讓電腦先走第一步棋,電腦每走一步就會封掉許多玩家的獲勝可能情況。

  (2)當玩家走棋的時候我們首先應該考慮玩家走棋的合法性。

  (3)如果合法,那麼玩家也會封掉許多電腦的獲勝的可能情況。

  (4)電腦的思考路徑:首先判斷當前玩家和電腦的所有獲勝組合是否需要進行加強賦值,
是進行加強賦值,否則進行普通的賦值。

  (5)比較當前玩家和電腦誰的分值最大。將分值最大的點作為電腦的下一步走法。

  2、利用vb.net表單和圖形工具建立五子棋的棋盤介面

  (1)添加一個picturebox控制項

  作用:使用picturebox控制項繪製棋子和棋盤

  (2)添加一個label控制項

  作用:顯示當前的獲勝標誌,也就是當某一方獲勝或和棋時顯示此標籤。

  (3)添加一個mainmenu控制項

  作用:控制遊戲的開始或結束

  (4)添加一個mediaplay組件

  作用:使程式可以播放音樂。

  3、設定整體框價

  我們採取10*10的棋盤,為主要的平台。利用數組定義整個棋盤案頭,利用數組定義獲勝組合以及獲勝標誌等。

  二,聲明全域數組和變數

  定義虛擬桌面:

Dim table(9, 9) As Integer

  定義當前玩家案頭空格的分數:

Dim pscore(9, 9) As Integer

  定義當前電腦案頭空格的分數:

Dim cscore(9, 9) As Integer

  定義玩家的獲勝組合:

Dim pwin(9, 9, 191) As Boolean

  定義電腦的獲勝組合:

Dim cwin(9, 9, 191) As Boolean

  定義玩家的獲勝組合標誌:

Dim pflag(191) As Boolean

  定義電腦的獲勝組合標誌:
Dim cflag(191) As Boolean

  定義遊戲有效標誌:

Dim theplayflag As Boolean

三、初始化遊戲

'*****************************************************************************
'** 模組名稱: initplayenvironment
'**
'** 描述: 此函數主要功能如下:
'** 1. 設定背景音樂。
'** 2. 設定遊戲狀態有效。
'** 3. 初始化遊戲狀態標籤。
'** 4. 直接指定電腦的第一步走法。
'** 5. 初始化基本得分案頭。
'** 6. 電腦和玩家獲勝標誌初始化。
'** 7. 初始化所有獲勝組合。
'** 8. 重新設定玩家的獲勝標誌。
'**
'*****************************************************************************
Sub initplayenvironment()
player.FileName = ".\music\zhyu01.mid"
player.Play()
theplayflag = True
'遊戲有效
Label1.Visible = False
'遊戲狀態標籤不顯示
PictureBox1.Refresh()
'清空picturebox1的內容
yuandian(130, 130)
'調用繪圖函數繪製當前電腦先走的位置
Dim i, j, m, n As Integer
For i = 0 To 9
For j = 0 To 9
table(i, j) = 0
Next
Next
'案頭初始化
For i = 0 To 191
pflag(i) = True
cflag(i) = True
Next
'獲勝標誌初始化
table(4, 4) = 1
'由於我們設定電腦先手,並下了4,4位所以將其值設為1
''' ******** 初始化獲勝組合 ********
n = 0
For i = 0 To 9
For j = 0 To 5
For m = 0 To 4
pwin(j + m, i, n) = True
cwin(j + m, i, n) = True
Next
n = n + 1
Next
Next
For i = 0 To 9
For j = 0 To 5
For m = 0 To 4
pwin(i, j + m, n) = True
cwin(i, j + m, n) = True
Next
n = n + 1
Next
Next
For i = 0 To 5
For j = 0 To 5
For m = 0 To 4
pwin(j + m, i + m, n) = True
cwin(j + m, i + m, n) = True
Next
n = n + 1
Next
Next
For i = 0 To 5
For j = 9 To 4 Step -1
For m = 0 To 4
pwin(j - m, i + m, n) = True
cwin(j - m, i + m, n) = True
Next
n = n + 1
Next
Next
''' ******** 初始化獲勝組合結束 ********
For i = 0 To 191
If pwin(4, 4, i) = True Then
pflag(i) = False
End If
Next
'由於電腦已下了4,4位所以我們需要重新設定玩家的獲勝標誌
End Sub


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

11.11 Big Sale for Cloud

Get Unbeatable Offers with up to 90% Off,Oct.24-Nov.13 (UTC+8)

Get It Now >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。