熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> ASP編程 >> 正文

VB.NET實現五子棋的人工智能-1

2013-11-15 12:48:31  來源: ASP編程 

  人工智能也就是所謂的AI(Artificial Intelligence)是一門很抽象的技術AI程序的編寫不需要依據任何既定的思考模式或者規則尤其是游戲中的AI可以完全依程序設計者本身的思考邏輯制作我個人認為人工智能的核心應該是使計算機具有自動的處理事件的能力而我們的所有的研究也應該圍繞著這一方向主體是策略類的人工智能

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

  五子棋的AI構想

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

  建立和使用獲勝表

  設定獲勝的分數

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

  求五子棋的獲勝組合

  在一場五子棋的游戲中計算機必須要知道有那些的獲勝組合因此我們必須求得獲勝組合的總數我們假定當前的棋盤為*

  ()計算水平方向的獲勝組合數每一列的獲勝組合是所以水平方向的獲勝組合數為*=

  ()計算垂直方向的獲勝組合總數每一行的獲勝組合是則垂直方向的獲勝組合數為*=

  ()計算正對角線方向的獲勝組合總數正對角線上的獲勝組合總數為

  +(++++)*=

  ()計算反對角線方向的獲勝組合總數反對角線上的獲勝組合總數為
   +(++++)*= 這樣所有的獲勝組合數為+++=

  建立和使用獲勝表

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

  分數的設定

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

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

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

  攻擊與防守

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

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

  使用編寫五子棋

  編寫前的准備

  用計算機的思想描述整個下棋的過程

  考慮步驟

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

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

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

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

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

  利用窗體和圖形工具建立五子棋的棋盤界面

  ()添加一個picturebox控件

  作用使用picturebox控件繪制棋子和棋盤

  ()添加一個label控件

  作用顯示當前的獲勝標志也就是當某一方獲勝或和棋時顯示此標簽

  ()添加一個mainmenu控件

  作用控制游戲的開始或結束

  ()添加一個mediaplay組件

  作用使程序可以播放音樂

  設置整體框價

  我們采取*的棋盤為主要的平台利用數組定義整個棋盤桌面利用數組定義獲勝組合以及獲勝標志等

  聲明全局數組和變量

  定義虛擬桌面

  Dim table( ) As Integer
  定義當前玩家桌面空格的分數

  Dim pscore( ) As Integer
  定義當前電腦桌面空格的分數

  Dim cscore( ) As Integer
  定義玩家的獲勝組合

  Dim pwin( ) As Boolean
  定義電腦的獲勝組合

  Dim cwin( ) As Boolean
  定義玩家的獲勝組合標志

  Dim pflag() As Boolean
  定義電腦的獲勝組合標志

  Dim cflag() As Boolean
  定義游戲有效標志

  Dim theplayflag As Boolean


From:http://tw.wingwit.com/Article/program/ASP/201311/21668.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.