求五子棋c語言演算法詳細點,求五子棋C語言演算法 詳細點

2021-12-25 03:29:22 字數 6571 閱讀 5937

1樓:

#include

#define n 8

#define m 8

void init(char flag[n][m])else

}flag[i][j]=v;

draw(flag);

}void test(char flag[m],char t)}void main()

}望採納! 不懂可以再問,我定義的五子棋大小為8行8列的

2樓:匿名使用者

任何一種棋類遊戲其關鍵是對當前棋局是否有正確的評分,評分越準確則電腦的ai越高。五子棋遊戲也是如此,但在打分之前,我們先掃描整個棋盤,把每個空位從八個方向上的棋型填入陣列gstyle(2, 15, 15, 8, 2),其中:第一個下標為1時表示黑棋,為2時表示白棋,第二和第三個下標表示(x,y),第四個下標表示8個方向,最後一個下標為1時表示棋子數,為2時表示空格數,如:

gstyle(1,2,2,1,1)=3表示與座標(2,2)在第1個方向上相鄰的黑棋棋子數為3

gstyle(1,2,2,1,2)=4表示與座標(2,2)在第1個方向上的最近的空格數為4

在定義方向時,也應該注意一定的技巧,表示兩個相反的方向的數應該差4,在程式中我是這樣定義的:

const dir_up = 1

const dir_upright = 2

const dir_right = 3

const dir_rightdown = 4

const dir_down = 5

const dir_downleft = 6

const dir_left = 7

const dir_leftup = 8

這樣我們前四個方向可以通過加四得到另一個方向的值。如果你還是不太明白,請看下面的圖:

---------

---------

---oo----

-ox*xx---

---------

---------

圖中的*點從標為(4,4),(打*的位置是空位),則:

gstyle(2,4,4,1,1)=1在(4,4)點相鄰的上方白棋數為1

gstyle(2,4,4,1,2)=2在(4,4)點的上方距上方白棋最近的空格數為2

gstyle(1,4,4,3,1)=2在(4,4)點相鄰的右方黑棋數為2

gstyle(1,4,4,3,2)=1在(4,4)點的右方距右方黑棋最近的空格數為3

...一旦把所有空點的棋型值填完,我們很容易地得出黑棋水平方向上點(4,4)的價值,由一個衝1(我把有界的棋稱為衝)和活2(兩邊無界的

棋稱為活)組成的。對於而白棋在垂直方向上點(4,4)的價值是一個活1,而在/方向也是活1所以,只要我們把該點的對於黑棋和白棋的價值算出

來,然後我們就取棋盤上各個空點的這兩個值的和的最大一點作為下棋的點。然而,對各種棋型應該取什麼值呢?我們可以先作如下假設:

fn 表示先手n個棋子的活棋型,如:f4表示先手活四

fn'表示先手n個棋子的衝棋型,如:f4'表示先手衝四

ln 表示後手n個棋子的活棋型,如:l3表示後手活三

ln'表示後手n個棋子的衝棋型,如:l3'表示後手衝三..

.根據在一行中的棋型分析,得到如下關係:

l1'<=f1'

從這個關係包含了進攻和防守的關係(當然,這個關係是由我定的,你可以自己定義這些關係)。對這些關係再進一步細化,如在一個可下棋的點,其四個方向上都有活三,也比不上一個衝四,所以我們可以又得到4*f3

,這些的關係由於你的定法和我的定法制可能不一樣,這樣計算機的ai也就不一樣,最後我們把分值最小的l1'值定為1,則我們就得到了下面各種棋型的分值,由c語言表示為:

f[2][5]=,};

l[2][5]=,};

f陣列表示先手,第一個下標為0時表示衝型,第二個下標表示棋子數,則f2'對應f[0][2]l陣列表示後手,第一個下標為0時表示衝型,第二個下標表示棋子數,則l2對應f[1][2]ok,棋型的分值關係確定好了以後,我們把每一個可下點的四個方向的棋型值相加(包括先手和後手的分

值),最後選擇一個最大值,並把這一點作為計算機要下的點就ok了:)。

後話:1、得到最大值也許不止一個點,但在我的程式中只選擇第一個最大點,當然你可以用於個隨機數來決定選擇那一個最大值點,也可以對這些最大值點再作進一步的分析。

2、在這個演算法中我只考慮了周圍有棋子的點,而其它點我沒有考慮。

3、可以再更進一步,用這個演算法來**以後的幾步棋,再選擇**值最好的一步,這樣電腦的ai就更高了.

4、這個演算法沒有考慮黑棋的禁手(雙3、雙四和多於五子的連棋)。因為在平時我下的五子棋是沒有這些禁手的。: )

另外,團idc網上有許多產品**,便宜有口碑

3樓:匿名使用者

這是五子棋 祕籍地址 ,看看有好處

c語言五子棋演算法

4樓:浪跡天涯的流星

五子棋勝負的判定,一般有一下兩種演算法:

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--)//判斷左斜

5樓:樂觀的沒有財富

我只給你判斷輸贏的演算法,其他的你自己解決//全域性變數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演算法(原創思路)

6樓:芍藥

我有個簡單的思路: 先定義一條線上棋子的各種佈局,比如初步定義長度為五個子 ◎◎◎◎● ◎◎●◎× ◎●◎×× ◎×◎×◎ 等等。白圈是自己的子,黑圈是對方的子,叉子是未走的格子。

程式裡有個佈局表,再定義各個佈局的分數,比如連五最99分,連三30分等等。 ...

7樓:高金山

五子棋的核心演算法

五子棋是一種受大眾廣泛喜愛的遊戲,其規則簡單,變化多端,非常富有趣味性和消遣性。這裡設計和實現了一個人機對下的五子棋程式,採用了博弈樹的方法,應用了剪枝和最大最小樹原理進行搜尋發現最好的下子位置。介紹五子棋程式的資料結構、評分規則、勝負判斷方法和搜尋演算法過程。

一、相關的資料結構

關於盤面情況的表示,以連結串列形式表示當前盤面的情況,目的是可以允許使用者進行悔棋、回退等操作。

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 編寫五子棋遊戲,C 編寫五子棋遊戲

這個你若是用vc寫的話,有挑戰性啊,首先棋盤的繪製你要想方法,但是有控制元件,不過光看這個控制元件的 就夠你受的,其次就是關鍵中的關鍵啊如何用電腦判斷怎麼走,其實我又想過就是用多維陣列的方法,多層迴圈巢狀,但是沒實踐,還有棋盤的畫法我也想過就是用 框代替,建立棋盤陣列,全用素組的話對應好下標,就轉化...

五子棋怎麼玩,五子棋怎麼玩

對局開始時,先由執黑棋一方將一枚棋子落在天元點上,然後由執白棋一方在黑棋 周圍的交叉點上落子。但是,為了尊重對方和禮貌起見,持白棋的一方通常將盤面的第 二著棋佈在自己河界的一側,即直止或斜止。此後黑白雙方輪流落子,直到某一方首先 在棋盤的橫線 縱線或斜線上形成連續五子或五子以上 僅對白棋而言 則該方...

五子棋著作 20,五子棋的起源

現在關於五子棋的書也有很多了,但是書多就雜了,免不了有一些容易出現誤導的書,建議先買一本 連珠初級講座 那威與彭建國著 裡面有規則,有習題,還有一些初級的棋譜,適合初學者。如果想進一步提升棋力,建議還是多打一些棋譜。隨便找本入門的書來看就行了。首先學習花月蒲月,再學別的就好了。五子棋的起源 相傳中華...