人機博弈 吃子棋遊戲(二)算氣

2021-09-07 13:15:52 字數 1501 閱讀 7551

演算法步驟例如以下。輸入計算棋氣的起始子。檢查我方棋子其周邊的空白,並檢視此空白是否已經計算過氣了。假設沒有計算過氣加一,假設已經計算則略過。進而遞迴呼叫計算我方棋子上下左右子的氣,最後演算法會返回棋串的子數和氣數。演算法凝視十分詳盡。

這個計算棋子氣的演算法,參考結合我們自身的應用須要優化和改動。這篇博文介紹了很多其它關於圍棋的演算法,有興趣的朋友能夠進一步閱讀。

原文suanqi函式會反覆計算已經計算過的棋串效率不高。應該對已經算過氣的函式不在反覆算氣。而且我們須要知道棋串的長度。

#include #include #define edge 19

int go[edge][edge];//棋盤資料,0為黑棋。1為白棋。2為空白

int gokong[edge][edge]; //0=該空點未曾計算過氣,1=已計算。避免反覆計算公氣

int gozi[edge][edge]; //0=該子未計算串氣。1=已計算。避免反覆計算同乙個子的氣

int goqi; //此棋串氣數

int gozilength;//此棋串子數

int g_gozi[edge][edge];

void str_qi(int x,int y,int hb)

else if ((go[x+1][y]==hb)&&(gozi[x+1][y]==0))

//否則假設右臨點為和本子同色子而且該子未曾計算過氣則

str_qi(x+1,y,hb); //遞迴呼叫到右臨子

}/左臨子

if (x-1>=1) //果沒有超出棋盤邊線

else if ((go[x-1][y]==hb)&&(gozi[x-1][y]==0))

//否則假設左臨點為和本子同色子而且該子未曾計算過氣則

str_qi(x-1,y,hb); //遞迴呼叫到左臨子

}下臨子

if (y-1>=1)//假設沒有超出棋盤邊線

else if ((go[x][y-1]==hb)&&(gozi[x][y-1]==0))

//否則假設下臨子點為和本子同色子而且該子未曾計算過氣則

str_qi(x,y-1,hb); //遞迴呼叫到下臨子

}上臨點

if (y+1<=19)//假設沒有超出棋盤邊線

else if ((go[x][y+1]==hb)&&(gozi[x][y+1]==0))

//否則假設上臨點為和本子同色子而且該子未曾計算過氣則

str_qi(x,y+1,hb); //遞迴呼叫到上臨子

}} std::pairstr_lib(int x,int y, int hb)

goqi=0; //棋串氣初值

gozilength=0;//棋串初始子數

str_qi(x,y,hb); //呼叫串氣子程式

for(int i=0;i(goqi,gozilength);

} void suanqi()

for (int i = 0; i for (int j = 0; j }

}

人機博弈,吃子棋遊戲(一)基本介紹

吃子棋,是小孩子學圍棋的入門棋,其規則部分取自於圍棋,但比圍棋簡單很多。1.吃子棋,在行棋時,若一方棋子沒有被打吃,則其必須落子在能夠緊對方棋子氣的位置。2.吃子棋,當一方棋子處於被打吃的狀態,則可以逃命,而不用緊對方棋子的氣。3.吃子棋,當一方棋子被吃提,則輸贏即分,吃子方勝。4.吃子棋,一般有兩...

人機博弈之(二) 棋盤表示

棋盤表示主要 的是使用什麼資料結構來表示棋盤上的資訊。一般來說與具體的棋類相關。通常,用來描述棋盤及其上棋子資訊的是乙個二維陣列。中國象棋可以用9x10個位元組的二維陣列來表示中國象棋的棋盤,陣列中每乙個位元組代表棋盤上的乙個交點,其值表明這個交點上放置的是乙個什麼棋子或是沒有棋子。但在中國象棋中,...

人機博弈之(二) 棋盤表示

棋盤表示主要 的是使用什麼資料結構來表示棋盤上的資訊。一般來說與具體的棋類相關。通常,用來描述棋盤及其上棋子資訊的是乙個二維陣列。中國象棋可以用9x10個位元組的二維陣列來表示中國象棋的棋盤,陣列中每乙個位元組代表棋盤上的乙個交點,其值表明這個交點上放置的是乙個什麼棋子或是沒有棋子。但在中國象棋中,...