c語言掃雷函數功能,掃雷c語言最簡單代碼

本文目錄一覽:

c語言掃雷需要介面嗎

C語言掃累不需要介面,基本思路如下。

1、構建一個遊戲菜單。

2、創建一個test函數,利用switch語句實現進入遊戲和退出遊戲的操作。

3、創建棋盤,列印棋盤。

4、初始化一個二維數組。

5、布置雷,排雷即可。

如何用C語言編程 掃雷!~

俄羅斯方快

掃雷

#includestdio.h

#includegraphics.h

#includestdlib.h

struct list

{

int x;

int y;

int num;

int bomb;

int wa;

};

struct list di[10][10];

int currentx=210;

int currenty=130;

void initxy(void)

{

int i,j;

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

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

{

di[j].x=i*20+200;

di[j].y=j*20+120;

di[j].wa=0;

di[j].bomb=0;

}

}

void initmu(void)

{

int i,j;

setcolor(2);

rectangle(200,120,400,320);

rectangle(190,110,410,330);

setfillstyle(8,14);

floodfill(191,111,2);

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

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

rectangle(di[j].x,di[j].y,di[j].x+19,di[j].y+19);

outtextxy(450,200,”press ‘enter’ to kick”);

outtextxy(450,250,”press ‘\’ to mark”);

}

void randbomb(void)

{

int k;

int i,j;

randomize();

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

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

{

k=random(5);

if(k==2)

di[j].bomb=1;

}

}

void jisuan(void)

{

int k=0;

int i,j;

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

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

{

if(ijdi[i-1][j-1].bomb)

k=k+1;

if(idi[i-1][j].bomb)

k=k+1;

if(jdi[j-1].bomb)

k=k+1;

if(i=8di[i+1][j].bomb)

k=k+1;

if(j=8di[j+1].bomb)

k=k+1;

if(i=8j=8di[i+1][j+1].bomb)

k=k+1;

if(ij=8di[i-1][j+1].bomb)

k=k+1;

if(i=8jdi[i+1][j-1].bomb)

k=k+1;

di[j].num=k;

k=0;

}

}

void xianbomb(void)

{

int i,j;

char biaoji[2];

char znum[2];

biaoji[0]=1;

biaoji[1]=NULL;

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

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

{

if(di[j].bomb==1)

outtextxy(di[j].x+2,di[j].y+2,biaoji);

else

{

itoa(di[j].num,znum,10);

setfillstyle(1,0);

bar(i*20+202,j*20+122,i*20+218,j*20+138);

outtextxy(i*20+202,j*20+122,znum);

}

}

}

void move(void)

{

int key;

key=bioskey(1);

if(key)

key=bioskey(0);

if(key==0x4800)

{

if(currenty130)

{

setcolor(0);

circle(currentx,currenty,5);

currenty-=20;

setcolor(4);

circle(currentx,currenty,5);

}

else

{

setcolor(0);

circle(currentx,currenty,5);

currenty=310;

setcolor(4);

circle(currentx,currenty,5);

}

}

if(key==0x4b00)

{

if(currentx210)

{

setcolor(0);

circle(currentx,currenty,5);

currentx-=20;

setcolor(4);

circle(currentx,currenty,5);

}

else

{

setcolor(0);

circle(currentx,currenty,5);

currentx=390;

setcolor(4);

circle(currentx,currenty,5);

}

}

if(key==0x4d00)

{

if(currentx390)

{

setcolor(0);

circle(currentx,currenty,5);

currentx+=20;

setcolor(4);

circle(currentx,currenty,5);

}

else

{

setcolor(0);

circle(currentx,currenty,5);

currentx=210;

setcolor(4);

circle(currentx,currenty,5);

}

}

if(key==0x5000)

{

if(currenty310)

{

setcolor(0);

circle(currentx,currenty,5);

currenty+=20;

setcolor(4);

circle(currentx,currenty,5);

}

else

{

setcolor(0);

circle(currentx,currenty,5);

currenty=130;

setcolor(4);

circle(currentx,currenty,5);

}

}

if(key==0x1c0d)

{

int i,j;

char snum[2];

snum[0]=NULL;

snum[1]=NULL;

i=(currentx-210)/20;

j=(currenty-130)/20;

if(di[j].bomb==1)

{

outtextxy(100,100,”game over”);

xianbomb();

sleep(2);

exit(0);

}

if(di[j].bomb==0)

{

di[j].wa=1;

setfillstyle(1,0);

bar(currentx-8,currenty-8,currentx+8,currenty+8);

setcolor(15);

itoa(di[j].num,snum,10);

outtextxy(currentx-8,currenty-8,snum);

setcolor(4);

circle(currentx,currenty,5);

}

}

if(key==0x2b5c)

{

char biaoji[2];

biaoji[0]=1;

biaoji[1]=NULL;

setcolor(0);

bar(currentx-8,currenty-8,currentx+8,currenty+8);

setcolor(4);

outtextxy(currentx-8,currenty-8,biaoji);

circle(currentx,currenty,5);

}

}

void success(void)

{

int k=1;

int i,j;

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

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

if(di[j].bomb==0di[j].wa==0)

k=0;

if(k==1)

{

outtextxy(100,100,”success good”);

xianbomb();

sleep(2);

exit(0);

}

}

void main(void)

{

int gd=DETECT,gm;

initgraph(gd,gm,””);

initxy();

initmu();

randbomb();

jisuan();

setcolor(4);

circle(210,130,5);

while(1)

{

move();

success();

}

}

C語言開發掃雷遊戲,C語言設計

源代碼#include graphics.h

#include stdlib.h

#include dos.h

#define LEFTPRESS 0xff01

#define LEFTCLICK 0xff10

#define LEFTDRAG 0xff19

#define MOUSEMOVE 0xff08

struct

{

int num;/*格子當前處於什麼狀態,1有雷,0已經顯示過數字或者空白格子*/

int roundnum;/*統計格子周圍有多少雷*/

int flag;/*右鍵按下顯示紅旗的標誌,0沒有紅旗標誌,1有紅旗標誌*/

}Mine[10][10];

int gameAGAIN=0;/*是否重來的變數*/

int gamePLAY=0;/*是否是第一次玩遊戲的標誌*/

int mineNUM;/*統計處理過的格子數*/

char randmineNUM[3];/*顯示數字的字元串*/

int Keystate;

int MouseExist;

int MouseButton;

int MouseX;

int MouseY;

void Init(void);/*圖形驅動*/

void MouseOn(void);/*滑鼠游標顯示*/

void MouseOff(void);/*滑鼠游標隱藏*/

void MouseSetXY(int,int);/*設置當前位置*/

int LeftPress(void);/*左鍵按下*/

int RightPress(void);/*滑鼠右鍵按下*/

void MouseGetXY(void);/*得到當前位置*/

void Control(void);/*遊戲開始,重新,關閉*/

void GameBegain(void);/*遊戲開始畫面*/

void DrawSmile(void);/*畫笑臉*/

void DrawRedflag(int,int);/*顯示紅旗*/

void DrawEmpty(int,int,int,int);/*兩種空格子的顯示*/

void GameOver(void);/*遊戲結束*/

void GameWin(void);/*顯示勝利*/

int MineStatistics(int,int);/*統計每個格子周圍的雷數*/

int ShowWhite(int,int);/*顯示無雷區的空白部分*/

void GamePlay(void);/*遊戲過程*/

void Close(void);/*圖形關閉*/

void main(void)

{

Init();

Control();

Close();

}

void Init(void)/*圖形開始*/

{

int gd=DETECT,gm;

initgraph(gd,gm,”c:\\program files\\winyes\\tc20h\\bgi”);

}

void Close(void)/*圖形關閉*/

{

closegraph();

}

void MouseOn(void)/*滑鼠游標顯示*/

{

_AX=0x01;

geninterrupt(0x33);

}

void MouseOff(void)/*滑鼠游標隱藏*/

{

_AX=0x02;

geninterrupt(0x33);

}

void MouseSetXY(int x,int y)/*設置當前位置*/

{

_CX=x;

_DX=y;

_AX=0x04;

geninterrupt(0x33);

}

int LeftPress(void)/*滑鼠左鍵按下*/

{

_AX=0x03;

geninterrupt(0x33);

return(_BX1);

}

int RightPress(void)/*滑鼠右鍵按下*/

{

_AX=0x03;

geninterrupt(0x33);

return(_BX2);

}

void MouseGetXY(void)/*得到當前位置*/

{

_AX=0x03;

geninterrupt(0x33);

MouseX=_CX;

MouseY=_DX;

}

void Control(void)/*遊戲開始,重新,關閉*/

{

int gameFLAG=1;/*遊戲失敗後判斷是否重新開始的標誌*/

while(1)

{

if(gameFLAG)/*遊戲失敗後沒判斷出重新開始或者退出遊戲的話就繼續判斷*/

{

GameBegain(); /*遊戲初始畫面*/

GamePlay();/*具體遊戲*/

if(gameAGAIN==1)/*遊戲中重新開始*/

{

gameAGAIN=0;

continue;

}

}

MouseOn();

gameFLAG=0;

if(LeftPress())/*判斷是否重新開始*/

{

MouseGetXY();

if(MouseX280MouseX300MouseY65MouseY85)

{

gameFLAG=1;

continue;

}

}

if(kbhit())/*判斷是否按鍵退出*/

break;

}

MouseOff();

}

void DrawSmile(void)/*畫笑臉*/

{

setfillstyle(SOLID_FILL,YELLOW);

fillellipse(290,75,10,10);

setcolor(YELLOW);

setfillstyle(SOLID_FILL,BLACK);/*眼睛*/

fillellipse(285,75,2,2);

fillellipse(295,75,2,2);

setcolor(BLACK);/*嘴巴*/

bar(287,80,293,81);

}

void DrawRedflag(int i,int j)/*顯示紅旗*/

{

setcolor(7);

setfillstyle(SOLID_FILL,RED);

bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5);

setcolor(BLACK);

line(198+j*20,95+i*20,198+j*20,95+i*20+10);

}

void DrawEmpty(int i,int j,int mode,int color)/*兩種空格子的顯示*/

{

setcolor(color);

setfillstyle(SOLID_FILL,color);

if(mode==0)/*沒有單擊過的大格子*/

bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);

else

if(mode==1)/*單擊過後顯示空白的小格子*/

bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);

}

void GameBegain(void)/*遊戲開始畫面*/

{

int i,j;

cleardevice();

if(gamePLAY!=1)

{

MouseSetXY(290,70); /*滑鼠一開始的位置,並作為它的初始坐標*/

MouseX=290;

MouseY=70;

}

gamePLAY=1;/*下次按重新開始的話滑鼠不重新初始化*/

mineNUM=0;

setfillstyle(SOLID_FILL,7);

bar(190,60,390,290);

for(i=0;i10;i++)/*畫格子*/

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

DrawEmpty(i,j,0,8);

setcolor(7);

DrawSmile();/*畫臉*/

randomize();

for(i=0;i10;i++)/*100個格子隨機賦值有沒有地雷*/

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

{

Mine[i][j].num=random(8);/*如果隨機數的結果是1表示這個格子有地雷*/

if(Mine[i][j].num==1)

mineNUM++;/*現有雷數加1*/

else

Mine[i][j].num=2;

Mine[i][j].flag=0;/*表示沒紅旗標誌*/

}

sprintf(randmineNUM,”%d”,mineNUM); /*顯示這次總共有多少雷數*/

setcolor(1);

settextstyle(0,0,2);

outtextxy(210,70,randmineNUM);

mineNUM=100-mineNUM;/*變數取空白格數量*/

MouseOn();

}

void GameOver(void)/*遊戲結束畫面*/

{

int i,j;

setcolor(0);

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

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

if(Mine[i][j].num==1)/*顯示所有的地雷*/

{

DrawEmpty(i,j,0,RED);

setfillstyle(SOLID_FILL,BLACK);

fillellipse(200+j*20,100+i*20,7,7);

}

}

void GameWin(void)/*顯示勝利*/

{

setcolor(11);

settextstyle(0,0,2);

outtextxy(230,30,”YOU WIN!”);

}

int MineStatistics(int i,int j)/*統計每個格子周圍的雷數*/

{

int nNUM=0;

if(i==0j==0)/*左上角格子的統計*/

{

if(Mine[0][1].num==1)

nNUM++;

if(Mine[1][0].num==1)

nNUM++;

if(Mine[1][1].num==1)

nNUM++;

}

else

if(i==0j==9)/*右上角格子的統計*/

{

if(Mine[0][8].num==1)

nNUM++;

if(Mine[1][9].num==1)

nNUM++;

if(Mine[1][8].num==1)

nNUM++;

}

else

if(i==9j==0)/*左下角格子的統計*/

{

if(Mine[8][0].num==1)

nNUM++;

if(Mine[9][1].num==1)

nNUM++;

if(Mine[8][1].num==1)

nNUM++;

}

else

if(i==9j==9)/*右下角格子的統計*/

{

if(Mine[9][8].num==1)

nNUM++;

if(Mine[8][9].num==1)

nNUM++;

if(Mine[8][8].num==1)

nNUM++;

}

else if(j==0)/*左邊第一列格子的統計*/

{

if(Mine[i][j+1].num==1)

nNUM++;

if(Mine[i+1][j].num==1)

nNUM++;

if(Mine[i-1][j].num==1)

nNUM++;

if(Mine[i-1][j+1].num==1)

nNUM++;

if(Mine[i+1][j+1].num==1)

nNUM++;

}

else if(j==9)/*右邊第一列格子的統計*/

{

if(Mine[i][j-1].num==1)

nNUM++;

if(Mine[i+1][j].num==1)

nNUM++;

if(Mine[i-1][j].num==1)

nNUM++;

if(Mine[i-1][j-1].num==1)

nNUM++;

if(Mine[i+1][j-1].num==1)

nNUM++;

}

else if(i==0)/*第一行格子的統計*/

{

if(Mine[i+1][j].num==1)

nNUM++;

if(Mine[i][j-1].num==1)

nNUM++;

if(Mine[i][j+1].num==1)

nNUM++;

if(Mine[i+1][j-1].num==1)

nNUM++;

if(Mine[i+1][j+1].num==1)

nNUM++;

}

else if(i==9)/*最後一行格子的統計*/

{

if(Mine[i-1][j].num==1)

nNUM++;

if(Mine[i][j-1].num==1)

nNUM++;

if(Mine[i][j+1].num==1)

nNUM++;

if(Mine[i-1][j-1].num==1)

nNUM++;

if(Mine[i-1][j+1].num==1)

nNUM++;

}

else/*普通格子的統計*/

{

if(Mine[i-1][j].num==1)

nNUM++;

if(Mine[i-1][j+1].num==1)

nNUM++;

if(Mine[i][j+1].num==1)

nNUM++;

if(Mine[i+1][j+1].num==1)

nNUM++;

if(Mine[i+1][j].num==1)

nNUM++;

if(Mine[i+1][j-1].num==1)

nNUM++;

if(Mine[i][j-1].num==1)

nNUM++;

if(Mine[i-1][j-1].num==1)

nNUM++;

}

return(nNUM);/*把格子周圍一共有多少雷數的統計結果返回*/

}

int ShowWhite(int i,int j)/*顯示無雷區的空白部分*/

{

if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有紅旗或該格處理過就不對該格進行任何判斷*/

return;

mineNUM–;/*顯示過數字或者空格的格子就表示多處理了一個格子,當所有格子都處理過了表示勝利*/

if(Mine[i][j].roundnum==0Mine[i][j].num!=1)/*顯示空格*/

{

DrawEmpty(i,j,1,7);

Mine[i][j].num=0;

}

else

if(Mine[i][j].roundnum!=0)/*輸出雷數*/

{

DrawEmpty(i,j,0,8);

sprintf(randmineNUM,”%d”,Mine[i][j].roundnum);

setcolor(RED);

outtextxy(195+j*20,95+i*20,randmineNUM);

Mine[i][j].num=0;/*已經輸出雷數的格子用0表示已經用過這個格子*/

return ;

}

/*8個方向遞歸顯示所有的空白格子*/

if(i!=0Mine[i-1][j].num!=1)

ShowWhite(i-1,j);

if(i!=0j!=9Mine[i-1][j+1].num!=1)

ShowWhite(i-1,j+1);

if(j!=9Mine[i][j+1].num!=1)

ShowWhite(i,j+1);

if(j!=9i!=9Mine[i+1][j+1].num!=1)

ShowWhite(i+1,j+1);

if(i!=9Mine[i+1][j].num!=1)

ShowWhite(i+1,j);

if(i!=9j!=0Mine[i+1][j-1].num!=1)

ShowWhite(i+1,j-1);

if(j!=0Mine[i][j-1].num!=1)

ShowWhite(i,j-1);

if(i!=0j!=0Mine[i-1][j-1].num!=1)

ShowWhite(i-1,j-1);

}

void GamePlay(void)/*遊戲過程*/

{

int i,j,Num;/*Num用來接收統計函數返回一個格子周圍有多少地雷*/

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

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

Mine[i][j].roundnum=MineStatistics(i,j);/*統計每個格子周圍有多少地雷*/

while(!kbhit())

{

if(LeftPress())/*滑鼠左鍵盤按下*/

{

MouseGetXY();

if(MouseX280MouseX300MouseY65MouseY85)/*重新來*/

{

MouseOff();

gameAGAIN=1;

break;

}

if(MouseX190MouseX390MouseY90MouseY290)/*當前滑鼠位置在格子範圍內*/

{

j=(MouseX-190)/20;/*x坐標*/

i=(MouseY-90)/20;/*y坐標*/

if(Mine[i][j].flag==1)/*如果格子有紅旗則左鍵無效*/

continue;

if(Mine[i][j].num!=0)/*如果格子沒有處理過*/

{

if(Mine[i][j].num==1)/*滑鼠按下的格子是地雷*/

{

MouseOff();

GameOver();/*遊戲失敗*/

break;

}

else/*滑鼠按下的格子不是地雷*/

{

MouseOff();

Num=MineStatistics(i,j);

if(Num==0)/*周圍沒地雷就用遞歸演算法來顯示空白格子*/

ShowWhite(i,j);

else/*按下格子周圍有地雷*/

{

sprintf(randmineNUM,”%d”,Num);/*輸出當前格子周圍的雷數*/

setcolor(RED);

outtextxy(195+j*20,95+i*20,randmineNUM);

mineNUM–;

}

MouseOn();

Mine[i][j].num=0;/*點過的格子周圍雷數的數字變為0表示這個格子已經用過*/

if(mineNUM1)/*勝利了*/

{

GameWin();

break;

}

}

}

}

}

if(RightPress())/*滑鼠右鍵鍵盤按下*/

{

MouseGetXY();

if(MouseX190MouseX390MouseY90MouseY290)/*當前滑鼠位置在格子範圍內*/

{

j=(MouseX-190)/20;/*x坐標*/

i=(MouseY-90)/20;/*y坐標*/

MouseOff();

if(Mine[i][j].flag==0Mine[i][j].num!=0)/*本來沒紅旗現在顯示紅旗*/

{

DrawRedflag(i,j);

Mine[i][j].flag=1;

}

else

if(Mine[i][j].flag==1)/*有紅旗標誌再按右鍵就紅旗消失*/

{

DrawEmpty(i,j,0,8);

Mine[i][j].flag=0;

}

}

MouseOn();

sleep(1);

}

}

}

要個掃雷的c語言演算法

先把你上次問的圍棋的給你,這個掃雷的我再寫

*主函數*/ void main() { int press; int bOutWhile=FALSE;/*退出循環標誌*/

Init();/*初始化圖象,數據*/

while(1) { press=GetKey();/*獲取用戶的按鍵值*/ switch(CheckKey(press))/*判斷按鍵類別*/ { /*是退出鍵*/ case KEYEXIT: clrscr();/*清屏*/ bOutWhile = TRUE; break;

/*是落子鍵*/ case KEYFALLCHESS: if(ChessGo(gPlayOrder,gCursor)==FALSE)/*走棋*/ DoError();/*落子錯誤*/ else { DoOK();/*落子正確*/

/*如果當前行棋方贏棋*/ if(JudgeWin(gPlayOrder,gCursor)==TRUE) { DoWin(gPlayOrder); bOutWhile = TRUE;/*退出循環標誌置為真*/ } /*否則*/ else /*交換行棋方*/ ChangeOrder(); } break;

/*是游標移動鍵*/ case KEYMOVECURSOR: MoveCursor(gPlayOrder,press); break;

/*是無效鍵*/ case KEYINVALID: break; }

if(bOutWhile==TRUE) break; }

/*遊戲結束*/ EndGame(); } /**********************************************************/

/*界面初始化,數據初始化*/ void Init(void) { int i,j; char *Msg[]= { “Player1 key:”, ” UP—-w”, ” DOWN–s”, ” LEFT–a”, ” RIGHT-d”, ” DO—-space”, “”, “Player2 key:”, ” UP—-up”, ” DOWN–down”, ” LEFT–left”, ” RIGHT-right”, ” DO—-ENTER”, “”, “exit game:”, ” ESC”, NULL, };

/*先手方為1號玩家*/ gPlayOrder = CHESS1; /*棋盤數據清零, 即棋盤上各點開始的時候都沒有棋子*/ for(i=0;i19;i++) for(j=0;j19;j++) gChessBoard[i][j]=CHESSNULL; /*游標初始位置*/ gCursor.x=gCursor.y=0;

/*畫棋盤*/ textmode(C40); DrawMap();

/*顯示操作鍵說明*/ i=0; textcolor(BROWN); while(Msg[i]!=NULL) { gotoxy(25,3+i); cputs(Msg[i]); i++; }

/*顯示當前行棋方*/ ShowOrderMsg(gPlayOrder); /*游標移至棋盤的左上角點處*/ gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT); }

/*畫棋盤*/ void DrawMap(void) { int i,j;

clrscr();

for(i=0;i19;i++) for(j=0;j19;j++) DrawCross(i,j);

}

/*畫棋盤上的交叉點*/ void DrawCross(int x,int y) { gotoxy(x+MAPXOFT,y+MAPYOFT); /*交叉點上是一號玩家的棋子*/ if(gChessBoard[x][y]==CHESS1) { textcolor(LIGHTBLUE); putch(CHESS1); return; } /*交叉點上是二號玩家的棋子*/ if(gChessBoard[x][y]==CHESS2) { textcolor(LIGHTBLUE); putch(CHESS2); return; }

textcolor(GREEN);

/*左上角交叉點*/ if(x==0y==0) { putch(CROSSLU); return; }

/*左下角交叉點*/ if(x==0y==18) { putch(CROSSLD); return; } /*右上角交叉點*/ if(x==18y==0) { putch(CROSSRU); return; }

/*右下角交叉點*/ if(x==18y==18) { putch(CROSSRD); return; }

/*左邊界交叉點*/ if(x==0) { putch(CROSSL); return; }

/*右邊界交叉點*/ if(x==18) { putch(CROSSR); return; }

/*上邊界交叉點*/ if(y==0) { putch(CROSSU); return; }

/*下邊界交叉點*/ if(y==18) { putch(CROSSD); return; }

/*棋盤中間的交叉點*/ putch(CROSS); }

/*交換行棋方*/ int ChangeOrder(void) { if(gPlayOrder==CHESS1) gPlayOrder=CHESS2; else gPlayOrder=CHESS1;

return(gPlayOrder); }

/*獲取按鍵值*/ int GetKey(void) { char lowbyte; int press;

while (bioskey(1) == 0) ;/*如果用戶沒有按鍵,空循環*/

press=bioskey(0); lowbyte=press0xff; press=press0xff00 + toupper(lowbyte); return(press); }

/*落子錯誤處理*/ void DoError(void) { sound(1200); delay(50); nosound(); }

/*贏棋處理*/ void DoWin(int Order) { sound(1500);delay(100); sound(0); delay(50); sound(800); delay(100); sound(0); delay(50); sound(1500);delay(100); sound(0); delay(50); sound(800); delay(100); sound(0); delay(50); nosound();

textcolor(RED+BLINK); gotoxy(25,20); if(Order==CHESS1) cputs(“PLAYER1 WIN!”); else cputs(“PLAYER2 WIN!”); gotoxy(25,21); cputs(” /”\\^+^/”); getch(); }

/*走棋*/ int ChessGo(int Order,struct point Cursor) { /*判斷交叉點上有無棋子*/ if(gChessBoard[Cursor.x][Cursor.y]==CHESSNULL) { /*若沒有棋子, 則可以落子*/ gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT); textcolor(LIGHTBLUE); putch(Order); gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT); gChessBoard[Cursor.x][Cursor.y]=Order; return TRUE; } else return FALSE; }

/*判斷當前行棋方落子後是否贏棋*/ int JudgeWin(int Order,struct point Cursor) { int i; for(i=0;i4;i++) /*判斷在指定方向上是否有連續5個行棋方的棋子*/ if(JudgeWinLine(Order,Cursor,i)) return TRUE; return FALSE; }

/*判斷在指定方向上是否有連續5個行棋方的棋子*/ int JudgeWinLine(int Order,struct point Cursor,int direction) { int i; struct point pos,dpos; const int testnum = 5; int count;

switch(direction) { case 0:/*在水平方向*/ pos.x=Cursor.x-(testnum-1); pos.y=Cursor.y; dpos.x=1; dpos.y=0; break; case 1:/*在垂直方向*/ pos.x=Cursor.x; pos.y=Cursor.y-(testnum-1); dpos.x=0; dpos.y=1; break; case 2:/*在左下至右上的斜方向*/ pos.x=Cursor.x-(testnum-1); pos.y=Cursor.y+(testnum-1); dpos.x=1; dpos.y=-1; break; case 3:/*在左上至右下的斜方向*/ pos.x=Cursor.x-(testnum-1); pos.y=Cursor.y-(testnum-1); dpos.x=1; dpos.y=1; break; }

count=0; for(i=0;itestnum*2+1;i++) { if(pos.x=0pos.x=18pos.y=0pos.y=18) { if(gChessBoard[pos.x][pos.y]==Order) { count++; if(count=testnum) return TRUE; } else count=0; } pos.x+=dpos.x; pos.y+=dpos.y; }

return FALSE; }

/*移動游標*/ void MoveCursor(int Order,int press) { switch(press) { case PLAY1UP: if(Order==CHESS1gCursor.y0) gCursor.y–; break; case PLAY1DOWN: if(Order==CHESS1gCursor.y18) gCursor.y++; break; case PLAY1LEFT: if(Order==CHESS1gCursor.x0) gCursor.x–; break; case PLAY1RIGHT: if(Order==CHESS1gCursor.x18) gCursor.x++; break;

case PLAY2UP: if(Order==CHESS2gCursor.y0) gCursor.y–; break; case PLAY2DOWN: if(Order==CHESS2gCursor.y18) gCursor.y++; break; case PLAY2LEFT: if(Order==CHESS2gCursor.x0) gCursor.x–; break; case PLAY2RIGHT: if(Order==CHESS2gCursor.x18) gCursor.x++; break; }

gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT); }

/*遊戲結束處理*/ void EndGame(void) { textmode(C80); }

/*顯示當前行棋方*/ void ShowOrderMsg(int Order) { gotoxy(6,MAPYOFT+20); textcolor(LIGHTRED); if(Order==CHESS1) cputs(“Player1 go!”); else cputs(“Player2 go!”);

gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT); }

/*落子正確處理*/ void DoOK(void) { sound(500); delay(70); sound(600); delay(50); sound(1000); delay(100); nosound(); }

/*檢查用戶的按鍵類別*/ int CheckKey(int press) { if(press==ESCAPE) return KEYEXIT;/*是退出鍵*/

else if ( ( press==PLAY1DO gPlayOrder==CHESS1) || ( press==PLAY2DO gPlayOrder==CHESS2) ) return KEYFALLCHESS;/*是落子鍵*/

else if ( press==PLAY1UP || press==PLAY1DOWN || press==PLAY1LEFT || press==PLAY1RIGHT || press==PLAY2UP || press==PLAY2DOWN || press==PLAY2LEFT || press==PLAY2RIGHT ) return KEYMOVECURSOR;/*是游標移動鍵*/

else return KEYINVALID;/*按鍵無效*/ }

掃雷C語言

#include stdio.h

#define N 40

int a[N][2];

int num;

void display()

{

for(int j=0; j num; j++)

{

printf(“%d “, a[j][1]);

}

printf(“\n”);

}

void test(int i)

{

if(i == num)

{

int j;

int flag = 1;

if(a[0][1]+a[1][1]!=a[0][0]a[num-1][1]+a[num-2][1]!=a[num-1][0])

{

}

for(j = 1; j num – 1; j++)

{

if(a[j-1][1] + a[j][1] + a[j+1][1] != a[j][0])

flag = 0;

}

if(flag)

display();

}

for(; i num; i++)

{

if(a[i][1] == 0)

{

if(i == 0)

{

if(a[i][1]+a[i+1][1] != a[i][0])

{

a[i][1] = 1;

test(i+1);

a[i][1] = 0;

}

}

if(i 0)

{

if(a[i-1][1] + a[i][1] + a[i+1][1] != a[i][0])

{

a[i][1] = 1;

test(i+1);

a[i][1] = 0;

}

}

}

}

}

int main()

{

int i;

printf(“輸入個數:\n”);

scanf(“%d”,num);

printf(“輸入數據(0~3):\n”);

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

{

scanf(“%d”,a[i][0]);

a[i][1]=0;

}

for(i = 1; i num – 1; i++)

{

if(a[i][0] == 3)

{

a[i-1][1] = 1;

a[i][1] = 1;

a[i+1][1] = 1;

}

}

test(0);

}

演算法思想:

1、如果有輸入數字是3則輸出數字中對應上中下都必為1

2、輸出數組中只有為0的才能為1;

3、用回溯法判斷成立條件,成功則輸出。

急求用c語言編寫掃雷詳細代碼

/*5.3.4 源程序*/

#include graphics.h

#include stdlib.h

#include dos.h

#define LEFTPRESS 0xff01

#define LEFTCLICK 0xff10

#define LEFTDRAG 0xff19

#define MOUSEMOVE 0xff08

struct

{

int num;/*格子當前處於什麼狀態,1有雷,0已經顯示過數字或者空白格子*/

int roundnum;/*統計格子周圍有多少雷*/

int flag;/*右鍵按下顯示紅旗的標誌,0沒有紅旗標誌,1有紅旗標誌*/

}Mine[10][10];

int gameAGAIN=0;/*是否重來的變數*/

int gamePLAY=0;/*是否是第一次玩遊戲的標誌*/

int mineNUM;/*統計處理過的格子數*/

char randmineNUM[3];/*顯示數字的字元串*/

int Keystate;

int MouseExist;

int MouseButton;

int MouseX;

int MouseY;

void Init(void);/*圖形驅動*/

void MouseOn(void);/*滑鼠游標顯示*/

void MouseOff(void);/*滑鼠游標隱藏*/

void MouseSetXY(int,int);/*設置當前位置*/

int LeftPress(void);/*左鍵按下*/

int RightPress(void);/*滑鼠右鍵按下*/

void MouseGetXY(void);/*得到當前位置*/

void Control(void);/*遊戲開始,重新,關閉*/

void GameBegain(void);/*遊戲開始畫面*/

void DrawSmile(void);/*畫笑臉*/

void DrawRedflag(int,int);/*顯示紅旗*/

void DrawEmpty(int,int,int,int);/*兩種空格子的顯示*/

void GameOver(void);/*遊戲結束*/

void GameWin(void);/*顯示勝利*/

int MineStatistics(int,int);/*統計每個格子周圍的雷數*/

int ShowWhite(int,int);/*顯示無雷區的空白部分*/

void GamePlay(void);/*遊戲過程*/

void Close(void);/*圖形關閉*/

void main(void)

{

Init();

Control();

Close();

}

void Init(void)/*圖形開始*/

{

int gd=DETECT,gm;

initgraph(gd,gm,”c:\\tc”);

}

void Close(void)/*圖形關閉*/

{

closegraph();

}

void MouseOn(void)/*滑鼠游標顯示*/

{

_AX=0x01;

geninterrupt(0x33);

}

void MouseOff(void)/*滑鼠游標隱藏*/

{

_AX=0x02;

geninterrupt(0x33);

}

void MouseSetXY(int x,int y)/*設置當前位置*/

{

_CX=x;

_DX=y;

_AX=0x04;

geninterrupt(0x33);

}

int LeftPress(void)/*滑鼠左鍵按下*/

{

_AX=0x03;

geninterrupt(0x33);

return(_BX1);

}

int RightPress(void)/*滑鼠右鍵按下*/

{

_AX=0x03;

geninterrupt(0x33);

return(_BX2);

}

void MouseGetXY(void)/*得到當前位置*/

{

_AX=0x03;

geninterrupt(0x33);

MouseX=_CX;

MouseY=_DX;

}

void Control(void)/*遊戲開始,重新,關閉*/

{

int gameFLAG=1;/*遊戲失敗後判斷是否重新開始的標誌*/

while(1)

{

if(gameFLAG)/*遊戲失敗後沒判斷出重新開始或者退出遊戲的話就繼續判斷*/

{

GameBegain(); /*遊戲初始畫面*/

GamePlay();/*具體遊戲*/

if(gameAGAIN==1)/*遊戲中重新開始*/

{

gameAGAIN=0;

continue;

}

}

MouseOn();

gameFLAG=0;

if(LeftPress())/*判斷是否重新開始*/

{

MouseGetXY();

if(MouseX280MouseX300MouseY65MouseY85)

{

gameFLAG=1;

continue;

}

}

if(kbhit())/*判斷是否按鍵退出*/

break;

}

MouseOff();

}

void DrawSmile(void)/*畫笑臉*/

{

setfillstyle(SOLID_FILL,YELLOW);

fillellipse(290,75,10,10);

setcolor(YELLOW);

setfillstyle(SOLID_FILL,BLACK);/*眼睛*/

fillellipse(285,75,2,2);

fillellipse(295,75,2,2);

setcolor(BLACK);/*嘴巴*/

bar(287,80,293,81);

}

void DrawRedflag(int i,int j)/*顯示紅旗*/

{

setcolor(7);

setfillstyle(SOLID_FILL,RED);

bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5);

setcolor(BLACK);

line(198+j*20,95+i*20,198+j*20,95+i*20+10);

}

void DrawEmpty(int i,int j,int mode,int color)/*兩種空格子的顯示*/

{

setcolor(color);

setfillstyle(SOLID_FILL,color);

if(mode==0)/*沒有單擊過的大格子*/

bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);

else

if(mode==1)/*單擊過後顯示空白的小格子*/

bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);

}

void GameBegain(void)/*遊戲開始畫面*/

{

int i,j;

cleardevice();

if(gamePLAY!=1)

{

MouseSetXY(290,70); /*滑鼠一開始的位置,並作為它的初始坐標*/

MouseX=290;

MouseY=70;

}

gamePLAY=1;/*下次按重新開始的話滑鼠不重新初始化*/

mineNUM=0;

setfillstyle(SOLID_FILL,7);

bar(190,60,390,290);

for(i=0;i10;i++)/*畫格子*/

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

DrawEmpty(i,j,0,8);

setcolor(7);

DrawSmile();/*畫臉*/

randomize();

for(i=0;i10;i++)/*100個格子隨機賦值有沒有地雷*/

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

{

Mine[i][j].num=random(8);/*如果隨機數的結果是1表示這個格子有地雷*/

if(Mine[i][j].num==1)

mineNUM++;/*現有雷數加1*/

else

Mine[i][j].num=2;

Mine[i][j].flag=0;/*表示沒紅旗標誌*/

}

sprintf(randmineNUM,”%d”,mineNUM); /*顯示這次總共有多少雷數*/

setcolor(1);

settextstyle(0,0,2);

outtextxy(210,70,randmineNUM);

mineNUM=100-mineNUM;/*變數取空白格數量*/

MouseOn();

}

void GameOver(void)/*遊戲結束畫面*/

{

int i,j;

setcolor(0);

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

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

if(Mine[i][j].num==1)/*顯示所有的地雷*/

{

DrawEmpty(i,j,0,RED);

setfillstyle(SOLID_FILL,BLACK);

fillellipse(200+j*20,100+i*20,7,7);

}

}

void GameWin(void)/*顯示勝利*/

{

setcolor(11);

settextstyle(0,0,2);

outtextxy(230,30,”YOU WIN!”);

}

int MineStatistics(int i,int j)/*統計每個格子周圍的雷數*/

{

int nNUM=0;

if(i==0j==0)/*左上角格子的統計*/

{

if(Mine[0][1].num==1)

nNUM++;

if(Mine[1][0].num==1)

nNUM++;

if(Mine[1][1].num==1)

nNUM++;

}

else

if(i==0j==9)/*右上角格子的統計*/

{

if(Mine[0][8].num==1)

nNUM++;

if(Mine[1][9].num==1)

nNUM++;

if(Mine[1][8].num==1)

nNUM++;

}

else

if(i==9j==0)/*左下角格子的統計*/

{

if(Mine[8][0].num==1)

nNUM++;

if(Mine[9][1].num==1)

nNUM++;

if(Mine[8][1].num==1)

nNUM++;

}

else

if(i==9j==9)/*右下角格子的統計*/

{

if(Mine[9][8].num==1)

nNUM++;

if(Mine[8][9].num==1)

nNUM++;

if(Mine[8][8].num==1)

nNUM++;

}

else if(j==0)/*左邊第一列格子的統計*/

{

if(Mine[i][j+1].num==1)

nNUM++;

if(Mine[i+1][j].num==1)

nNUM++;

if(Mine[i-1][j].num==1)

nNUM++;

if(Mine[i-1][j+1].num==1)

nNUM++;

if(Mine[i+1][j+1].num==1)

nNUM++;

}

else if(j==9)/*右邊第一列格子的統計*/

{

if(Mine[i][j-1].num==1)

nNUM++;

if(Mine[i+1][j].num==1)

nNUM++;

if(Mine[i-1][j].num==1)

nNUM++;

if(Mine[i-1][j-1].num==1)

nNUM++;

if(Mine[i+1][j-1].num==1)

nNUM++;

}

else if(i==0)/*第一行格子的統計*/

{

if(Mine[i+1][j].num==1)

nNUM++;

if(Mine[i][j-1].num==1)

nNUM++;

if(Mine[i][j+1].num==1)

nNUM++;

if(Mine[i+1][j-1].num==1)

nNUM++;

if(Mine[i+1][j+1].num==1)

nNUM++;

}

else if(i==9)/*最後一行格子的統計*/

{

if(Mine[i-1][j].num==1)

nNUM++;

if(Mine[i][j-1].num==1)

nNUM++;

if(Mine[i][j+1].num==1)

nNUM++;

if(Mine[i-1][j-1].num==1)

nNUM++;

if(Mine[i-1][j+1].num==1)

nNUM++;

}

else/*普通格子的統計*/

{

if(Mine[i-1][j].num==1)

nNUM++;

if(Mine[i-1][j+1].num==1)

nNUM++;

if(Mine[i][j+1].num==1)

nNUM++;

if(Mine[i+1][j+1].num==1)

nNUM++;

if(Mine[i+1][j].num==1)

nNUM++;

if(Mine[i+1][j-1].num==1)

nNUM++;

if(Mine[i][j-1].num==1)

nNUM++;

if(Mine[i-1][j-1].num==1)

nNUM++;

}

return(nNUM);/*把格子周圍一共有多少雷數的統計結果返回*/

}

int ShowWhite(int i,int j)/*顯示無雷區的空白部分*/

{

if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有紅旗或該格處理過就不對該格進行任何判斷*/

return;

mineNUM–;/*顯示過數字或者空格的格子就表示多處理了一個格子,當所有格子都處理過了表示勝利*/

if(Mine[i][j].roundnum==0Mine[i][j].num!=1)/*顯示空格*/

{

DrawEmpty(i,j,1,7);

Mine[i][j].num=0;

}

else

if(Mine[i][j].roundnum!=0)/*輸出雷數*/

{

DrawEmpty(i,j,0,8);

sprintf(randmineNUM,”%d”,Mine[i][j].roundnum);

setcolor(RED);

outtextxy(195+j*20,95+i*20,randmineNUM);

Mine[i][j].num=0;/*已經輸出雷數的格子用0表示已經用過這個格子*/

return ;

}

/*8個方向遞歸顯示所有的空白格子*/

if(i!=0Mine[i-1][j].num!=1)

ShowWhite(i-1,j);

if(i!=0j!=9Mine[i-1][j+1].num!=1)

ShowWhite(i-1,j+1);

if(j!=9Mine[i][j+1].num!=1)

ShowWhite(i,j+1);

if(j!=9i!=9Mine[i+1][j+1].num!=1)

ShowWhite(i+1,j+1);

if(i!=9Mine[i+1][j].num!=1)

ShowWhite(i+1,j);

if(i!=9j!=0Mine[i+1][j-1].num!=1)

ShowWhite(i+1,j-1);

if(j!=0Mine[i][j-1].num!=1)

ShowWhite(i,j-1);

if(i!=0j!=0Mine[i-1][j-1].num!=1)

ShowWhite(i-1,j-1);

}

void GamePlay(void)/*遊戲過程*/

{

int i,j,Num;/*Num用來接收統計函數返回一個格子周圍有多少地雷*/

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

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

Mine[i][j].roundnum=MineStatistics(i,j);/*統計每個格子周圍有多少地雷*/

while(!kbhit())

{

if(LeftPress())/*滑鼠左鍵盤按下*/

{

MouseGetXY();

if(MouseX280MouseX300MouseY65MouseY85)/*重新來*/

{

MouseOff();

gameAGAIN=1;

break;

}

if(MouseX190MouseX390MouseY90MouseY290)/*當前滑鼠位置在格子範圍內*/

{

j=(MouseX-190)/20;/*x坐標*/

i=(MouseY-90)/20;/*y坐標*/

if(Mine[i][j].flag==1)/*如果格子有紅旗則左鍵無效*/

continue;

if(Mine[i][j].num!=0)/*如果格子沒有處理過*/

{

if(Mine[i][j].num==1)/*滑鼠按下的格子是地雷*/

{

MouseOff();

GameOver();/*遊戲失敗*/

break;

}

else/*滑鼠按下的格子不是地雷*/

{

MouseOff();

Num=MineStatistics(i,j);

if(Num==0)/*周圍沒地雷就用遞歸演算法來顯示空白格子*/

ShowWhite(i,j);

else/*按下格子周圍有地雷*/

{

sprintf(randmineNUM,”%d”,Num);/*輸出當前格子周圍的雷數*/

setcolor(RED);

outtextxy(195+j*20,95+i*20,randmineNUM);

mineNUM–;

}

MouseOn();

Mine[i][j].num=0;/*點過的格子周圍雷數的數字變為0表示這個格子已經用過*/

if(mineNUM1)/*勝利了*/

{

GameWin();

break;

}

}

}

}

}

if(RightPress())/*滑鼠右鍵鍵盤按下*/

{

MouseGetXY();

if(MouseX190MouseX390MouseY90MouseY290)/*當前滑鼠位置在格子範圍內*/

{

j=(MouseX-190)/20;/*x坐標*/

i=(MouseY-90)/20;/*y坐標*/

MouseOff();

if(Mine[i][j].flag==0Mine[i][j].num!=0)/*本來沒紅旗現在顯示紅旗*/

{

DrawRedflag(i,j);

Mine[i][j].flag=1;

}

else

if(Mine[i][j].flag==1)/*有紅旗標誌再按右鍵就紅旗消失*/

{

DrawEmpty(i,j,0,8);

Mine[i][j].flag=0;

}

}

MouseOn();

sleep(1);

}

}

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/197362.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-03 16:32
下一篇 2024-12-03 16:33

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python字元串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字元串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字元串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字元串操作中,capitalize函數常常被用到,這個函數可以使字元串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變數和數…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 單片機列印函數

    單片機列印是指通過串口或並口將一些數據列印到終端設備上。在單片機應用中,列印非常重要。正確的列印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的列印數據可以幫助我們快速…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變數時顯示的指定變數類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29

發表回復

登錄後才能評論