總的來說,要讓電腦知道該在哪一點下子,就要根據盤面的形勢,為每一可能落子的點計算其重要程度,也就是當這子落下後會形成什麼棋型(如:「衝四」、「活三」等),然後通覽全盤選出最重要的一點,這便是最基本的演算法。
當然,僅靠當前盤面進行判定是遠遠不夠的,這樣下棋很輕易掉進玩家設下的陷阱,因為它沒有考慮以後的變化。
所以在此基礎上我們加入遞迴呼叫,即:在電腦中猜測出今後幾步的各種走法,以便作出最佳選擇,這也是我們下棋時常說的「想了幾步」。
如此一來您的程式便具有一定的水平了。
什麼?不信!過來試試吧! 總體思路弄清之後,下面進行具體討論:
一:資料結構 先來看看資料結構,我們需要哪些變數?
首先得為整個棋盤建立一張**用以記錄棋子資訊,我們使用乙個15*15的二維陣列 table[15][15] (15*15是五子棋棋盤的大小),陣列的每乙個元素對應棋盤上的乙個交叉點,用『0』表示空位、『1』代表己方的子、『2』代表對方的子;
這張表也是今後分析的基礎。 在此之後還要為電腦和玩家雙方各建立一張棋型表computer[15][15][4]和player[15][15][4],用來存放棋型資料,就是剛才所說的重要程度,
比如用『20』代表「衝四」的點,用『15』代表「活三」的點,那麼在計算重要性時,就可以根據20>15得出前者比後者重要,下子時電腦便會自動選擇「衝四」的點。
那為什麼棋型表要使用三維陣列呢?
因為棋盤上的每乙個點都可以與橫、豎、左斜、右斜四個方向的棋子構成不同的棋型,所以乙個點總共有4個記錄;這樣做的另乙個好處是可以輕易判定出復合棋型,
例如:假如同一點上有2個『15』就是雙
三、有乙個『15』和乙個『20』就是四三。
怎麼樣!3個陣列構成了程式的基本資料骨架,今後只要再加入一些輔助變數便可以應付自如了。
應該不會太難吧?ok!有了這麼多有用的資料,我們就可以深入到程式的流程中去了。
二:程式流程 我們主要討論五子棋的核心演算法,即:人工智慧部分,而其他像圖形顯示、鍵盤滑鼠控制等,因較為簡單,所以就不作過多介紹了。
我們看到本程式由六個基本功能模組構成,各模組的具體分析如下:
(1)初始化:首先,建立盤面陣列table[15][15]、對戰雙方的棋型表computer[15][15][4]和player[15][15][4]並將它們清零以備使用;
然後初始化顯示器、鍵盤、鼠等輸入輸出裝置並在螢幕上畫出棋盤。
(2)主迴圈控制模組:控制下棋順序,當輪到某方下子時,負責將程式轉到相應的模組中去,主要擔當乙個排程者的角色。
(3)玩家下子:當輪到玩家下時,您通過鍵盤或滑鼠在棋盤上落子,程式會根據該點的位置,在table[15][15]陣列的相應地方記錄『2』,以表明該子是玩家下的。
(4)盤面分析填寫棋型表:本程式核心模組之一,人工智慧演算法的根本依據!其具體實現方法如下:
您在下五子棋時,一定會先根據棋盤上的情況,找出當前最重要的一些點位,如「活三」、「衝四」等;
然後再在其中選擇落子點。但是,電腦不會像人一樣分析問題,要讓它知道哪是「活三」、哪是「衝四」,就得在棋盤上逐點計算,一步一步的教它。
左邊完成後再向右進行同樣的操作;最後把左右兩邊的記錄合併起來,得到的資料就是該點橫向上的棋型,然後把棋型的編號填入到computer[x][y][n]中就行了(x、y代表座標,n=0、1、2、3分別代表橫、豎、左斜、右斜四個方向)。
而其他三個方向的棋型也可用同樣的方法得到,當搜尋完整張棋盤後,己方棋型表也就填寫完畢了。
然後再用同樣的方法填寫對方棋型表。
注重:所有棋型的編號都要事先定義好,越重要的號數越大! ok! 怎麼樣?有點累了吧?不過千萬別洩氣!因為好戲還在後頭。
let's go!
(5)電腦下子:有了上面填寫的兩張棋型表,現在要作的就是讓電腦知道在哪一點下子了。
其中最簡單的計算方法,就是遍歷棋型表computer[15][15][4]和player[15][15][4]找出其中數值最大的一點,在該點下子即可。
但這種演算法的弱點非常明顯,只顧眼前利益,不能顧全大局,這就和許多五子棋初學者一樣犯了「目光短淺」的毛病。 要解決這個問題,我們引入『今後幾步猜測法』,具體方法是這樣的:
首先, 讓電腦分析乙個可能的點,假如在這兒下子將會形成對手不得不防守的棋型(例如:『衝四』、『活三』);
那麼下一步對手就會照您的思路下子來防守您,如此一來便完成了第一步的猜測。
這時再呼叫模組4對猜測後的棋進行盤面分析,假如出現了『四三』、『雙三』或『雙四』等制勝點,那麼己方就可以獲勝了(當然對黑棋而言『雙三』、『雙四』是禁手,另當別論);
否則照同樣的方法向下分析,就可猜測出第二步、第三步……
等一等,要是盤面上沒有對手必須防的棋型,哪該怎麼辦呢?
進攻不成的話就得考慮防守了,將自己和對手調換一下位置,然後用上面的方法來猜測對手的棋,這樣既可以防住對手巧妙的攻擊,又能侍機發動反擊,何樂而不為呢!
猜測法的運算量相當之大,據我的經驗,用pentium-100猜測3步的走法平均需要15秒以上時間,所以建議猜測量在5步以內。
可別小瞧了這5步,有時它甚至會走出讓您拍手叫絕的妙著呢!
(6)勝敗判定:務須多言,某方形成五子連即獲勝;
若黑棋走出『雙三』、『雙四』或長連即以禁手判負。
到現在為止,整個五子棋軟體就基本完成了,其水平大約在中級上下。
當然,這種演算法並不是最好的,但我相信它的基本思路是正確的。
中國象棋2
using system using system.collections.generic using system.linq using system.text using system.drawing namespace chinesechess public override bool mov...
中國象棋 題解
中國象棋這道題才看到的時候,畏難情緒很重啊,先介紹題目,大意是在n行 m列的棋盤上,放若干個炮可以是 0個,使得沒有任何乙個炮可以攻擊另乙個炮。請問有多少種放置方法。考試的時候沒有其他的想法,就只想暴力騙分,用乙個一維的標記陣列,再用乙個遞迴,每排最多放兩個。後面想來,完全可以把每排最多放兩個的情況...
DP 中國象棋
這次小可可想解決的難題和中國象棋有關。在乙個 n 行 m 列的棋盤上,讓你放若干個炮 可以是 0 個 使得沒有任何乙個炮可以攻擊另乙個炮,請問有多少種放置方法。大家肯定很清楚,在中國象棋中炮的行走方式是 乙個炮能攻擊到另乙個炮,當且僅當它們在同一行或同一列中,且它們之間恰好有乙個棋中。你也來和小可可...