五子棋小遊戲和簡單AI思路

2021-07-06 02:07:01 字數 2820 閱讀 3049

//若有錯誤請指出

首先最重要的是儲存五子棋的狀態,標準棋盤是15*15的,那麼我們用乙個二維int陣列如arrchessboard【】【】,用012分別表示空黑白即可,在棋盤上新增棋子後在陣列中加上資料即可。

為了實現悔棋功能,我們可以用另外乙個一維陣列arrstep【】來記錄每一步記錄,簡單起見每下一步往陣列中push兩個資料,分別為i,j,即當前步數的座標,也就是說陣列的大小剛好是已下步數的兩倍。這樣的話在悔棋時直接pop兩個末尾資料,記得在原陣列arrchessboard【】【】中也消去對應資料。擁有了arrstep陣列後,也可以實現棋局重現和儲存棋局到本地的功能(將arrstep儲存為本地xml或txt即可)。

判定輸贏功能,這裡提供一種字串對比的思路,落棋后,以橫向為例,從當前點(i-4)到(i+4)一共9個點,將從arrchessboard陣列中取出的int值合併為字串str,(請注意處理陣列越界空指標問題)若str.indexof(five)> 0,則表示在str字串中存在連續5個棋子,即五子連珠。另外該思路也在單機ai有所應用。

另外,也可以用臨時int temptotal=0來記錄,遇到非本方棋子後重置為0,否則temptotal ++1。若讀取到temptotal>4,則五子連珠。

ai方面,首先建立兩個陣列arraiweight【】【】和arrplayerweight【】【】,ai在每一次aimove()的時候,遍歷15*15的arrchessboard,兩個陣列都在每乙個點儲存三個資料,即權重和兩個座標(weight,i,j),兩個陣列都有各自的side屬性因此每個點都有不同的權重值。若遍歷到不是空位則權重設為0,意為不再考慮落該點。

若遍歷到為空棋位,則對該點計算權重getscore(),該點從4個方向開始考慮,讀取到每個方向的狀況轉化為字串後(比如010121100),將字串在權重表中索引,比如權重表中five為五子連珠,為11111或22222(1和2分別表示黑棋白棋),在先前的字串 str = 010121100中,str.inddexof(11111). 沒有連續的11111和22222,則匹配失敗並開始下個匹配直到結束。

每個方向的權重相加後返回到陣列中。兩個陣列arraiweight【】【】和arrplayerweight【】【】都有各自15*15的權重點並以{weight,i,j)儲存。以weight為關鍵字對陣列排序得到黑棋和白棋各自最大的權重點,比較後ai落點在最大權重點以實現防守和攻擊。

附上權重表,語言為actionscript 3.0,源自網路。

//以下注釋中 * 為本方棋子,o 為對方棋子,_ 為空格。012分別對應空,黑,白棋。

// *****

var five:string = (side * 11111).tostring();

// _****

var four:string = "0" + (side * 1111).tostring() + "0";

// _***_

var three:string = "0" + (side * 111).tostring() + "0";

// _**_

var two:string = "0" + (side * 11).tostring() + "0";

// _*_*_

var jtwo:string = "0" + (side * 101).tostring() + "0";

// ****_

var lfour:string = otherside.tostring() + (side * 1111).tostring() + "0";

// _****

var rfour:string = "0" + (side * 1111).tostring() + otherside.tostring();

// *_***

var l_four:string = (side * 10111).tostring();

// ***_*

var r_four:string = (side * 11101).tostring();

// o***_

var lthree:string = otherside.tostring() + (side * 111).tostring() + "0";

// _***o

var rthree:string = "0" + (side * 111).tostring() + otherside.tostring();

// o**_

var ltwo:string = otherside.tostring() + (side * 11).tostring() + "0";

// _**o

var rtwo:string = "0" + (side * 11).tostring() + otherside.tostring();

// ***_o

var rfthree:string = (side * 111).tostring() + "0" + otherside.tostring();

// o_***

var lfthree:string = otherside.tostring() + "0" + (side * 111).tostring();

const stwo:int = 2;//眠二

const ftwo:int = 4;//假活二

const sthree:int = 5;//眠三

const two:int = 8;//活二

const sfour:int = 12;//衝四

const fthree:int = 14;//假活三

const three:int = 40;//活三

const four:int = 90;//活四

const five:int = 200;//五連

簡單的五子棋小遊戲

chess類 public class chess public intgetxpos public void setxpos int xpos public intgetypos public void setypos int ypos public string getchesstype pub...

五子棋的小遊戲

感想 終於寫出人生中第乙個小遊戲來了 include include include include using namespace std const int x 21 棋盤行數 const int y 21 棋盤列數 char p x y 定義棋盤 int m 0 定義臨時點,儲存輸入座標 in...

python五子棋小遊戲

話不多說,直接上 全部工程檔案,在github 五子棋 效果預覽 判斷上下左右左上右上左下右下8個方向 i x 1 while i 0 if darray i y 1 num1 1 i 1 else break i x 1 while i 19 if darray i y 1 num1 1 i 1 ...