1樓:浪跡天涯的流星
五子棋勝負的判定,一般有一下兩種演算法:
1.掃瞄整個棋盤,分別掃瞄四個方向是否有5個連子。網上找了很多五子棋原始碼都是用此演算法,這意味著每下乙個棋子都要掃瞄一遍19×19的棋盤,複雜而且低效,**略。
2.每下一字,從該子開始掃瞄其四個方向(例如:從該子的(x-4,y)座標開始掃瞄橫向)是否存在5個連子。此演算法較為常用,而且不涉及更為複雜的資料結構。
另外,為解決掃瞄越界的問題,在宣告棋盤棋子位置時,可宣告乙個(4+19+4)×(4+19+4)的棋盤,而讓棋子偏移(4,4)個座標。
演算法2源**如下:
?123456789101112131415161718192021static void ifwin(int x,int y,int color) for(b=y-4;b<=y+4;b++)//判斷豎<=x+4;a++,b++)//判斷右斜<=x+4;a++,b--)//判斷左斜
2樓:樂觀的沒有財富
我只給你判斷輸贏的演算法,其他的你自己解決//全域性變數int curx,cury;//當前下棋的座標 0 <= curx <= 15 0 <= cury <= 15
int ontable[16][16];
void whowin(int collor)}//判斷當前棋子的某個方向上同色棋子有多少int samelinenum(int x,int y)tx = tx + x;ty = ty + y;
}while (x < 0 || j < 0 || i > 15 || j > 15);
do//計算落子一邊同顏色的棋子數 (比如右邊)tx = tx - x;ty = ty - y;
}while (x < 0 || j < 0 || i > 15 || j > 15);
return num;}
求五子棋c語言ai演算法(原創思路)
3樓:芍藥
我有個簡單的思路: 先定義一條線上棋子的各種布局,比如初步定義長度為五個子 ◎◎◎◎● ◎◎●◎× ◎●◎×× ◎×◎×◎ 等等。白圈是自己的子,黑圈是對方的子,叉子是未走的格仔。
程式裡有個布局表,再定義各個布局的分數,比如連五最99分,連三30分等等。 ...
4樓:高金山
五子棋的核心演算法
五子棋是一種受大眾廣泛喜愛的遊戲,其規則簡單,變化多端,非常富有趣味性和消遣性。這裡設計和實現了乙個人機對下的五子棋程式,採用了博弈樹的方法,應用了剪枝和最大最小樹原理進行搜尋發現最好的下子位置。介紹五子棋程式的資料結構、評分規則、勝負判斷方法和搜尋演算法過程。
一、相關的資料結構
關於盤面情況的表示,以鍊錶形式表示當前盤面的情況,目的是可以允許使用者進行悔棋、回退等操作。
clist steplist;
其中step結構的表示為:
struct step
; 以陣列形式儲存當前盤面的情況,
目的是為了在顯示當前盤面情況時使用:
char fivearea[five_max_line][five_max_line];
其中five_max_line表示盤面最大的行數。
同時由於需要在遞迴搜尋的過程中考慮時間和空間有效性,只找出就當前情況來說相對比較好的幾個盤面,而不是對所有的可下子的位置都進行搜尋,這裡用變數countlist來表示當前搜尋中可以選擇的所有新的盤面情況物件的集合:
clist countlist;
其中類cboardsituiton為:
class cboardsituation
二、評分規則
對於下子的重要性評分,需要從六個位置來考慮當前棋局的情況,分別為:-,¦,/,\,//,\\
實際上需要考慮在這六個位置上某一方所形成的子的布局的情況,對於在還沒有子的地方落子以後的當前局面的評分,主要是為了說明在這個地方下子的重要性程度,設定了乙個簡單的規則來表示當前棋面對機器方的分數。
基本的規則如下:
判斷是否能成5, 如果是機器方的話給予100000分,如果是人方的話給予-100000 分;
判斷是否能成活4或者是雙死4或者是死4活3,如果是機器方的話給予10000分,如果是人方的話給予-10000分;
判斷是否已成雙活3,如果是機器方的話給予5000分,如果是人方的話給予-5000 分;
判斷是否成死3活3,如果是機器方的話給予1000分,如果是人方的話給予-1000 分;
判斷是否能成死4,如果是機器方的話給予500分,如果是人方的話給予-500分;
判斷是否能成單活3,如果是機器方的話給予200分,如果是人方的話給予-200分;
判斷是否已成雙活2,如果是機器方的話給予100分,如果是人方的話給予-100分;
判斷是否能成死3,如果是機器方的話給予50分,如果是人方的話給予-50分;
判斷是否能成雙活2,如果是機器方的話給予10分,如果是人方的話給予-10分;
判斷是否能成活2,如果是機器方的話給予5分,如果是人方的話給予-5分;
判斷是否能成死2,如果是機器方的話給予3分,如果是人方的話給予-3分。
實際上對當前的局面按照上面的規則的順序進行比較,如果滿足某一條規則的話,就給該局面打分並儲存,然後退出規則的匹配。注意這裡的規則是根據一般的下棋規律的乙個總結,在實際執行的時候,使用者可以新增規則和對評分機制加以修正。
三、勝負判斷
實際上,是根據當前最後乙個落子的情況來判斷勝負的。實際上需要從四個位置判斷,以該子為出發點的水平,豎直和兩條分別為 45度角和135度角的線,目的是看在這四個方向是否最後落子的一方構成連續五個的棋子,如果是的話,就表示該盤棋局已經分出勝負。具體見下面的圖示:
四、搜尋演算法實現描述
注意下面的核心的演算法中的變數currentboardsituation,表示當前機器最新的盤面情況, countlist表示第一層子節點可以選擇的較好的盤面的集合。核心的演算法如下:
void maindealfunction()
for(i=0;ivalue)
//找出那乙個得到最高分的盤面 }
其中對於search函式的表示如下:實際上核心的演算法是乙個剪枝過程,其中在這個搜尋過程中相關的四個引數為:(1)當前棋局情況;(2)當前的下子方,可以是機器(max)或者是人(min);(3)父節點的值oldvalue;(4)當前的搜尋深度depth。
double search(cboardsituation&
board,int mode,double oldvalue,int depth)
return value;
} else }
注意這裡的goal(board)函式是用來判斷當前盤面是否可以分出勝負,而evlation(board)是對當前的盤面從機器的角度進行打分。
下面是select函式的介紹,這個函式的主要目的是根據 playermode情況,即是機器還是使用者來返回節點的應有的值。
double select(double a,double b,int mode)
五、小結
在windows作業系統下,用vc++實現了這個人機對戰的五子棋程式。和國內許多只是採用規則或者只是採用簡單遞迴而沒有剪枝的那些程式相比,在智力上和時間有效性上都要好於這些程式。同時所討論的方法和設計過程為使用者設計其他的遊戲(如象棋和圍棋等)提供了乙個參考。
c語言五子棋判斷誰贏演算法的疑問
5樓:匿名使用者
下乙個新的子在weizhi處,然後以這個子為基準來判斷,case 0為例,橫著判斷-》贏得可能性有:這個子是5個子最右邊的子……這個子是五個子最左邊的子。所以贏得可能性中,那最左邊的子的座標就是weizhi.
x-4,weizhi.y 即count=4,然後一次判斷左邊第三個子,第二個子,……右邊第四個子,如果有連續的5個子(通過count2或3的值來判斷)就算贏了。
下五子棋有什麼訣竅,五子棋的訣竅?
先從蒲月花月開局開始學起,慢慢擴充套件下去學其他開局,多練多想多學習 一步當先,步步為贏 五子棋開局訣竅 中國連珠 五子棋 網 目標 五子棋多線交匯,那麼你的贏著層出不窮 還有,不要去堵,讓別人去堵。一直堵是肯定會輸的,最好的防守就是進攻,你先練好必勝開局吧,網頁上有.再就是心中有棋局,要會想到對手...
機械迷城如何贏五子棋最好有截圖
第一顆棋的上方不要挨著老頭子的棋子但是填第一顆棋必須挨著他棋子的左邊或者右邊都行,你的菱形中間不要填棋子,那個老頭子不會給你堵上的,基本就可以贏了。機械迷城五子棋詳細攻略 1.號為電腦先走的地方。無論他第一步走在 只要按照下面數字順序走即可 3 號為電腦先走的地方。無論他第一步走在 只要按照下面數字...
五子棋五手兩打用哪幾個開局最好
樓主,上面的回答都不適合你。首先,以前所謂的四大平衡開局中的松月已經被終結了。鬆一鬆三終結,松二走完大定式基本是和棋局面 其次,開斜月,人人都會交換,拿黑走斜月,黑基本不會輸,白基本沒什麼贏的機會 斜一終結,斜二走完大定式基本是和棋局面,白沒什麼機會,斜三黑優 這樣看來最後能下的也就只有疏瑞了,不過...