關於Flash中的黑白棋AI編寫心得

       最近幾天終於把老早開始做的黑白棋AI大致完成了,黑白棋的人人對戰版本和五子棋相比並沒有太大的本質上的區別。難點主要在吃子等方面我在前面的博客也講了一部分了。這篇博客主要講的還是在寫人機對戰的時候遇到的一些問題。

       首先界面模式問題。遊戲還是一個,但分成了兩個模式,所以之前還要再加一幀用來使玩家選擇。由於在之前已經寫好了人人對戰部分的代碼,但吃子,勝負判定等等都是一個原理。所以我設立一個變量gamemode,如果玩家選擇人人對戰,則其值爲1,隨後人人對戰的落子部分前面加一個判斷if (gamemode == 1),人機對戰同理。同時在界面上根據遊戲模式顯示出當前遊戲模式(可以用visible實現)。

       隨後我們要做的是在gamemode=2的情況下人和電腦落子的代碼。因爲默認玩家是黑方,所以應該吧電腦白子落子寫在黑方落子的監聽後面保持連貫。爲了效果,這裏要在玩家落子後1秒,電腦才落子。於是這裏就需要一個暫停程序的代碼:

       這段代碼的意思就是暫停1000毫秒後執行tr函數,把電腦落子函數寫在裏面即可。

       接下來,我們要讓電腦下棋,分這麼3步:0.判斷哪些點是可以下白子的,篩選出來。1.選出其中的“最值得落子”的地點。2.落子,並且像人人對戰一樣觸發吃子等函數效果。接下來我來逐一講講梗概。首先我先做的黑白棋人人對戰版本,會有代碼判斷玩家點擊的地方是否在邏輯上允許落子。這個代碼其實和我們要求的目的已經很接近了。但由於我當時沒有意識到,於是把判斷和落子是寫在一起的,於是把判斷部分提取出來花了我一段時間(所以保持良好的編程習慣很重要啊,程序要分塊寫)。把這個判斷作用於所有的未落子的格點便可以選出目標了。

       然後是判斷價值,AI的強大與否就主要在這個上面體現了。我的想法還是比較簡單的,那個點吃的子最多,就價值最高,同時要注意佔據角,邊等有利位置(也要防止玩家獲得)。這一部分在程序完成後任然可以不斷改進完善。重要的是算法思想,語言編寫對新手也是沒有什麼困難的。

       最後是一些後續的效果觸發,這就要求我們在之前有良好的習慣,分類分塊的寫代碼,這個時候就只要引用代碼就行了,會省事很多(反正我是有重新把之前的一大堆監聽什麼的又改成了函數。。。。)。吃子,記錄邏輯座標等等就不提了,爲了悔棋,棋盤記錄函數要調用。還有數子函數等等,具體看你自己的黑白棋有哪些功能而定,畢竟人機模式又是一套新的流程。

       至於其他的一些輔助功能,比如倒計時,換手等等,原理都不難。我在這裏稍微再講一下倒計時。人人對戰時,我留給雙方的時間是10秒逾期就換手,於是就要有一個倒計時的鐘表。我們可以加入一個影片剪輯(鐘錶的樣子),然後對這個影片剪輯進行編輯,例如是每秒鐘面改變一次。我就可以在第一幀鐘面放上"10",然後隔24幀(這個視你的幀頻而定)把上面改成“9”.做出來是這樣子的:

需要注意的是,因爲不在一個場景內,所以彼此引用變量的時候,需要運用特殊的引用方式,例如:

if裏面表示的是主時間軸裏面的exhand函數。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章