免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

c語言五子棋判斷函數 用c語言編寫五子棋程序

C語言五子棋算法

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

創新互聯公司專注于企業全網營銷推廣、網站重做改版、連山網站定制設計、自適應品牌網站建設、HTML5、商城網站制作、集團公司官網建設、外貿網站制作、高端網站制作、響應式網頁設計等建站業務,價格優惠性價比高,為連山等各大城市提供網站開發制作服務。

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){ TCHAR win[20]; int a,b; if(stone[x][y]==1) wcscpy_s(win,_T("黑棋勝利!")); else wcscpy_s(win,_T("白棋勝利!")); for(a=x-4;a=x+4;a++)//判斷橫 if(stone[a][y]==colorstone[a+1][y]==colorstone[a+2][y]==colorstone[a+3][y]==colorstone[a+4][y]==color) {MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK);return;} for(b=y-4;b=y+4;b++)//判斷豎 if(stone[x][b]==colorstone[x][b+1]==colorstone[x][b+2]==colorstone[x][b+3]==colorstone[x][b+4]==color) {MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK);return;} for(a=x-4,b=y-4;a=x+4;a++,b++)//判斷右斜 if(stone[a][b]==colorstone[a+1][b+1]==colorstone[a+2][b+2]==colorstone[a+3][b+3]==colorstone[a+4][b+4]==color) {MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK);return;} for(a=x-4,b=y+4;a=x+4;a++,b--)//判斷左斜 if(stone[a][b]==colorstone[a+1][b-1]==colorstone[a+2][b-2]==colorstone[a+3][b-3]==colorstone[a+4][b-4]==color) {MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK);return;}}

C語言五子棋判斷勝負。給個具體思路也行。我知道是要5個子同一列或同一行或同一斜線。。

給個思路吧:

對每一條輸入進行判斷是否構成五連珠,也就是對每一條輸入去搜索它的橫豎斜三個方向去檢查是否存在五個連續點。存儲的數據結構使用二維數組即可,注意要區分雙方的不同(可以奇數步使用0,偶數步使用1標記)。橫方向即x不變,y增減;豎方向即y不變,x增減;斜方向有兩個,一個是x,y同增減,另一個是xy增減相反。

C語言五子棋

我瀏覽了一下你的代碼,你對勝利的判斷采用的是檢查整個棋盤的方式,這樣做的最大弊端自然是低效,而且在編寫斜方向判斷的時候比較復雜。我建議你采用下子后判斷的方式,即玩家1下了一個字后,像該子周圍8個方向檢查是否存在5子的情況,只需要一個判斷方法,而且較為簡單。

void chooseONE()

{

printf("第一玩家請選擇下棋位置\n");

printf("第幾個直的\n");

scanf("%d",co);

printf("第幾個橫的\n");

scanf("%d",ro);

while(arr[ro][co]==1||arr[ro][co]==2)

{

printf("重復了!!!\n");

printf("第幾個直的\n");

scanf("%d",co);

printf("第幾個橫的\n");

scanf("%d",ro);

}

arr[ro][co]=1;

//這里加判斷代碼,建議用一個判斷函數,我給你寫個吧

}

//我這里這個方法寫了個大概,你看一下和你的代碼結合一下就可以了,我用i和j作為for循環的變量,你用來做最大的長寬值,這些你都要改一下。

flag作為判斷是否勝利的標志,playerNum是玩家的標志,分1和2,這個函數只寫了左和左上的判斷,其他方向樓主仿照著寫

int win(int row, int col, int playerNum){

int i = 0,j = 0;

int flag = 1;

if(row - 4 = 0){

flag = 1;

for(i = row; i = 0; i--){

if(arr[i][j] != playerNum){

flag = 0;

break;

}

}

if(flag == 1){

return 1;

}

}

if(row - 4 = 0 col - 4 = 0){

flag = 1;

for(i = row ,j = col ; i = 0j=0; i--,j--){

if(arr[i][j] != playerNum){

flag = 0;

break;

}

}

if(flag == 1){

return 1;

}

}

}

c語言基礎,求五子棋詳細代碼

/*一個月就想做五子棋,有點難啊,希望你能看懂,這是代碼*/

#include?stdlib.h

#include?stdio.h

#include?conio.h

#include?string.h

#define?MAXIMUS?15?//定義棋盤大小

int?p[MAXIMUS][MAXIMUS];//存儲對局信息

char?buff[MAXIMUS*2+1][MAXIMUS*4+3];//輸出緩沖器

int?Cx,Cy;//當前光標位置

int?Now;//當前走子的玩家,1代表黑,2代表白

int?wl,wp;//當前寫入緩沖器的列數和行數位置

char*?showText;//在棋盤中央顯示的文字信息

int?count;//回合數

char*?Copy(char*?strDest,const?char*?strSrc)//修改過的字符串復制函數,會忽略末端的\0

{

char*?strDestCopy?=?strDest;

while?(*strSrc!='\0')

{

*strDest++=*strSrc++;

}

return?strDestCopy;

}

void?Initialize()//初始化一個對局函數

{

int?i,j;//循環變量

showText="";//重置顯示信息

count=0;//回合數歸零

for(i=0;iMAXIMUS;i++)//重置對局數據

{

for(j=0;jMAXIMUS;j++)

{

p[i][j]=0;

}

}

Cx=Cy=MAXIMUS/2;//重置光標到中央

Now=1;//重置當前為黑方

}

char*?getStyle(int?i,int?j)//獲得棋盤中指定坐標交點位置的字符,通過制表符拼成棋盤

{

if(p[i][j]==1)//1為黑子

return?"●";

else?if(p[i][j]==2)//2為白子

return?"○";

else?if(i==0j==0)//以下為邊緣棋盤樣式

return?"┏";

else?if(i==MAXIMUS-1j==0)

return?"┓";

else?if(i==MAXIMUS-1j==MAXIMUS-1)

return?"┛";

else?if(i==0j==MAXIMUS-1)

return?"┗";

else?if(i==0)

return?"┠";

else?if(i==MAXIMUS-1)

return?"┨";

else?if(j==0)

return?"┯";

else?if(j==MAXIMUS-1)

return?"┷";

return?"┼";//中間的空位

}

char*?getCurse(int?i,int?j)//獲得指定坐標交點位置左上格的樣式,通過制表符來模擬光標的顯示

{

if(i==Cx)

{

if(j==Cy)

return?"┏";

else?if?(j==Cy+1)

return?"┗";

}

else?if(i==Cx+1)

{

if(j==Cy)

return?"┓";

else?if?(j==Cy+1)

return?"┛";

}

return?" ";//如果不在光標附近則為空

}

void?write(char*?c)//向緩沖器寫入字符串

{

Copy(buff[wl]+wp,c);

wp+=strlen(c);

}

void?ln()//緩沖器寫入位置提行

{

wl+=1;

wp=0;

}

void?Display()//將緩沖器內容輸出到屏幕

{

int?i,l=strlen(showText);//循環變量,中間文字信息的長度

int?Offset=MAXIMUS*2+2-l/2;//算出中間文字信息居中顯示所在的橫坐標位置

if(Offset%2==1)//如果位置為奇數,則移動到偶數,避免混亂

{

Offset--;

}

Copy(buff[MAXIMUS]+Offset,showText);//講中間文字信息復制到緩沖器

if(l%2==1)//如果中間文字長度為半角奇數,則補上空格,避免混亂

{

*(buff[MAXIMUS]+Offset+l)=0x20;

}

system("cls");//清理屏幕,準備寫入

for(i=0;iMAXIMUS*2+1;i++)//循環寫入每一行

{

printf("%s",buff[i]);

if(iMAXIMUS*2)//寫入完每一行需要換行

printf("\n");

}

}

void?Print()//將整個棋盤算出并儲存到緩沖器,然后調用Display函數顯示出來

{

int?i,j;//循環變量

wl=0;

wp=0;

for(j=0;j=MAXIMUS;j++)//寫入出交點左上角的字符,因為需要打印棋盤右下角,所以很以橫縱各多一次循環

{

for(i=0;i=MAXIMUS;i++)

{

write(getCurse(i,j));//寫入左上角字符

if(j==0||j==MAXIMUS)//如果是棋上下盤邊緣則沒有連接的豎線,用空格填充位置

{

if(i!=MAXIMUS)

write(" ");

}

else//如果在棋盤中間則用豎線承接上下

{

if(i==0||i==MAXIMUS-1)//左右邊緣的豎線更粗

write("┃");

else?if(i!=MAXIMUS)//中間的豎線

write("│");

}

}

if(j==MAXIMUS)//如果是最后一次循環,則只需要處理邊側字符,交點要少一排

{

break;

}

ln();//提行開始打印交點內容

write(" ");//用空位補齊位置

for(i=0;iMAXIMUS;i++)//按橫坐標循環正常的次數

{

write(getStyle(i,j));//寫入交點字符

if(i!=MAXIMUS-1)//如果不在最右側則補充一個橫線承接左右

{

if(j==0||j==MAXIMUS-1)

{

write("━");//上下邊緣的橫線更粗

}

else

{

write("—");//中間的橫線

}

}

}

ln();//寫完一行后提行

}

Display();//將緩沖器內容輸出到屏幕

}

int?Put()//在當前光標位置走子,如果非空,則返回0表示失敗

{

if(p[Cx][Cy]==0)

{

p[Cx][Cy]=Now;//改變該位置數據

return?1;//返回1表示成功

}

else

{

return?0;

}

}

int?Check()//勝負檢查,即判斷當前走子位置有沒有造成五連珠的情況

{

int?w=1,x=1,y=1,z=1,i;//累計橫豎正斜反邪四個方向的連續相同棋子數目

for(i=1;i5;i++)//向下檢查

if(Cy+iMAXIMUSp[Cx][Cy+i]==Now)

w++;

else?

break;

for(i=1;i5;i++)//向上檢查

if(Cy-i0p[Cx][Cy-i]==Now)

w++;

else?

break;

if(w=5)//若果達到5個則判斷當前走子玩家為贏家

return?Now;

for(i=1;i5;i++)//向右檢查

if(Cx+iMAXIMUSp[Cx+i][Cy]==Now)

x++;

else?

break;

for(i=1;i5;i++)//向左檢查

if(Cx-i0p[Cx-i][Cy]==Now)

x++;

else?

break;

if(x=5)//若果達到5個則判斷當前走子玩家為贏家

return?Now;

for(i=1;i5;i++)//向右下檢查

if(Cx+iMAXIMUSCy+iMAXIMUSp[Cx+i][Cy+i]==Now)

y++;

else?

break;

for(i=1;i5;i++)//向左上檢查

if(Cx-i0Cy-i0p[Cx-i][Cy-i]==Now)

y++;

else?

break;

if(y=5)//若果達到5個則判斷當前走子玩家為贏家

return?Now;

for(i=1;i5;i++)//向右上檢查

if(Cx+iMAXIMUSCy-i0p[Cx+i][Cy-i]==Now)

z++;

else?

break;

for(i=1;i5;i++)//向左下檢查

if(Cx-i0Cy+iMAXIMUSp[Cx-i][Cy+i]==Now)

z++;

else?

break;

if(z=5)//若果達到5個則判斷當前走子玩家為贏家

return?Now;

return?0;//若沒有檢查到五連珠,則返回0表示還沒有玩家達成勝利

}

int?RunGame()//進行整個對局,返回贏家信息(雖然有用上)

{

int?input;//輸入變量

int?victor;//贏家信息

Initialize();//初始化對局

while(1)//開始無限回合的死循環,直到出現勝利跳出

{

Print();//打印棋盤

input=getch();//等待鍵盤按下一個字符

if(input==27)//如果是ESC則退出程序

{

exit(0);

}

else?if(input==0x20)//如果是空格則開始走子

{

if(Put())//如果走子成功則判斷勝負

{

victor=Check();

Now=3-Now;//輪換當前走子玩家

count++;

if(victor==1)//如果黑方達到勝利,顯示提示文字并等待一次按鍵,返回勝利信息

{

showText="黑方獲得了勝利!";

Print();

if(getch()==0xE0)

{

getch();

}

return?Now;

}

else?if(victor==2)//如果白方達到勝利,顯示提示文字并等待一次按鍵,返回勝利信息

{

showText="白方獲得了勝利!";

Display();

if(getch()==0xE0)

{

getch();

}

return?Now;

}

else?if(count==MAXIMUS*MAXIMUS)//如果回合數達到了棋盤總量,即棋盤充滿,即為平局

{

showText="平局!";

Display();

if(getch()==0xE0)

{

getch();

}

return?0;

}

}

}

else?if(input==0xE0)//如果按下的是方向鍵,會填充兩次輸入,第一次為0xE0表示按下的是控制鍵

{

input=getch();//獲得第二次輸入信息

switch(input)//判斷方向鍵方向并移動光標位置

{

case?0x4B:

Cx--;

break;

case?0x48:

Cy--;

break;

case?0x4D:

Cx++;

break;

case?0x50:

Cy++;

break;

}

if(Cx0)//如果光標位置越界則移動到對側

Cx=MAXIMUS-1;

if(Cy0)

Cy=MAXIMUS-1;

if(CxMAXIMUS-1)

Cx=0;

if(CyMAXIMUS-1)

Cy=0;

}

}

}

int?main()//主函數

{

system("title?簡易五子棋?——Etsnarl制作");//設置標題

system("mode?con?cols=63?lines=32");//設置窗口大小

system("color?E0");//設置顏色

while(1)//循環執行游戲

{

RunGame();

}

return?0;

}

C語言五子棋勝利判斷式

按照五子棋規則,當一方的棋子,在橫向,縱向或斜向連續五個均為同一用戶的棋子時,代表勝利。

另外,勝利判斷只需要在一個新子落子時判斷,且僅需要判斷新子所在的四條線上(縱橫加兩個斜線)是否滿足條件即可。

所以,可以以新子坐標為基準點,判斷四次。

比如橫向的,需要判斷左側和右側連續的同類棋子個數,如果左側+右側+1(自身)總數=5,則為勝利。

參考代碼如下:

static?int?map[100][100];?//?全局變量棋盤。未下子時值為0,下子時值為1或2,區分下子人。

int?check_win(int?m,?int?n)

{

int?total?=?1;?

int?i;

for(i?=?m-1;?i?=?0;?i?--)//統計同行左側連續同樣棋子個數。

if(map[i][n]?==?map[m][n])?total++;

else?break;

for(i?=?m+1;?i??100;?i?++)//統計同行右側連續同樣棋子個數。

if(map[i][n]?==?map[m][n])?total++;

else?break;

if(total=5)?return?1;//勝利。

return?0;?//沒有勝利。

}

其它類似。

c語言五子棋判斷誰贏算法的疑問

下一個新的子在weizhi處,然后以這個子為基準來判斷,case

0為例,橫著判斷-》贏得可能性有:這個子是5個子最右邊的子……這個子是五個子最左邊的子。所以贏得可能性中,那最左邊的子的坐標就是weizhi.x-4,weizhi.y

即count=4,然后一次判斷左邊第三個子,第二個子,……右邊第四個子,如果有連續的5個子(通過count2或3的值來判斷)就算贏了。

當前題目:c語言五子棋判斷函數 用c語言編寫五子棋程序
轉載來于:http://m.newbst.com/article10/hjpcdo.html

成都網站建設公司_創新互聯,為您提供搜索引擎優化企業網站制作網站改版微信小程序做網站App開發

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網頁設計公司