成都创新互联网站制作重庆分公司

C语言扫雷函数流程图,c语言扫雷程序设计

C语言编简单的扫雷

给你一个完整的扫雷源码

站在用户的角度思考问题,与客户深入沟通,找到上杭网站设计与上杭网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站制作、成都网站设计、企业官网、英文网站、手机端网站、网站推广、域名与空间、网络空间、企业邮箱。业务覆盖上杭地区。

#include conio.h

#include graphics.h

#include stdio.h

#include stdlib.h

#include time.h

#include ctype.h

#include "mouse.c"

#define YES 1

#define NO 0

#define XPX 15 /* X pixels by square */

#define YPX 15 /* Y pixels by square */

#define DEFCX 30 /* Default number of squares */

#define DEFCY 28

#define MINE 255-'0' /* So that when it prints, it prints char 0xff */

#define STSQUARE struct stsquare

STSQUARE {

unsigned char value; /* Number of mines in the surround squares */

unsigned char sqopen; /* Square is open */

unsigned char sqpress; /* Square is pressed */

unsigned char sqmark; /* Square is marked */

} *psquare;

#define value(x,y) (psquare+(x)*ncy+(y))-value

#define sqopen(x,y) (psquare+(x)*ncy+(y))-sqopen

#define sqpress(x,y) (psquare+(x)*ncy+(y))-sqpress

#define sqmark(x,y) (psquare+(x)*ncy+(y))-sqmark

int XST, /* Offset of first pixel X */

YST,

ncx, /* Number of squares in X */

ncy,

cmines, /* Mines discovered */

initmines, /* Number of initial mines */

sqclosed, /* Squares still closed */

maxy; /* Max. number of y pixels of the screen */

void Graph_init(void);

void Read_param(int argc, char *argv[]);

void Set_mines(int nminas);

void Set_square(int x, int y, int status);

void Mouse_set(void);

void Draw_squares(void);

int Do_all(void);

void Blow_up(void);

void Open_square(int x, int y);

int Open_near_squares(int x, int y);

/************************************************************************/

void main(int argc, char *argv[])

{

if (!mouse_reset()) {

cputs(" ERROR: I can't find a mouse driver\r\n");

exit(2);

}

Graph_init();

Read_param(argc, argv);

Mouse_set();

do {

randomize();

cleardevice();

Set_mines(cmines=initmines);

mouse_enable();

Draw_squares();

}

while (Do_all() != '\x1b');

closegraph();

}

/*************************************************************************

* *

* F U N C T I O N S *

* *

*************************************************************************/

/*----------------------------------------------------------------------*/

void Graph_init(void)

{

int graphdriver=DETECT, graphmode, errorcode;

if(errorcode 0) {

cprintf("\n\rGraphics System Error: %s\n",grapherrormsg(errorcode));

exit(98);

}

initgraph(graphdriver, graphmode, "");

errorcode=graphresult();

if(errorcode!=grOk) {

printf(" Graphics System Error: %s\n",grapherrormsg(errorcode));

exit(98);

}

maxy=getmaxy();

} /* Graph_init */

/*----------------------------------------------------------------------*/

void Read_param(int argc, char *argv[])

{

int x, y, m;

x=y=m=0;

if (argc!=1) {

if (!isdigit(*argv[1])) {

closegraph();

cprintf("Usage is: %s [x] [y] [m]\r\n\n"

"Where x is the horizontal size\r\n"

" y is the vertical size\r\n"

" m is the number of mines\r\n\n"

" Left mouse button: Open the square\r\n"

"Right mouse button: Mark the square\r\n"

" -The first time puts a 'mine' mark\r\n"

" -The second time puts a 'possible "

"mine' mark\r\n"

" -The third time unmarks the square\r\n"

"Left+Right buttons: Open the surrounded squares only if "

"the count of mines\r\n"

" is equal to the number in the square",argv[0]);

exit (1);

}

switch (argc) {

case 4: m=atoi(argv[3]);

case 3: y=atoi(argv[2]);

case 2: x=atoi(argv[1]);

}

}

XST=100;

ncx=DEFCX;

if (maxy==479) {

YST=30;

ncy=DEFCY;

}

else {

YST=25;

ncy=20;

}

if (x0 xncx)

ncx=x;

if (y0 yncy) {

YST+=((ncy-y)*YPX)1;

ncy=y;

}

initmines= m ? m : ncx*ncy*4/25; /* There are about 16% of mines */

if (((void near*)psquare=calloc(ncx*ncy, sizeof(STSQUARE)))==NULL) {

closegraph();

cputs("ERROR: Not enought memory");

exit(3);

}

} /* Read_param */

/*----------------------------------------------------------------------*/

void Set_mines(int nminas)

{

要个扫雷的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语言扫雷点到空白地方一次打开一大片的算法求解

能把代码再多给点吗?

那8个递归其实可以用两个for来做的

void ClickBlank(int x, int y) {

int i, j;

if (isBlank(x, y)) {

ShowAroundBlock(x, y);

for (i = -1; i = 1; i++) {

for (j = -1; j = 1; j++) {

if (i == 0  j == 0) continue;

ClickBlank(x + i, y + j);

}

}

}

}

而且你应该设访问标记,已经ClickBlank的格子不应再调用ClickBlank

如何用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语言

#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语言 扫雷

#includestdio.h

int main(void)

{

char plat[100][100];  //雷的地图

char plat_new[100][100];  //数字映射图

int n, m;  //存储行、列数

int in, im;

int mark = 0;  //记录该点附近8个坐标雷的总数

int j = 1;

scanf("%d %d", n, m);

getchar();  //消除回车符的影响

do {

if (n == 0  m == 0)

break;

for (in = 0; in  n; in++)

{

for (im = 0; im  m; im++)

{

scanf("%c", plat[in][im]);

}

getchar();

}

for (in = 0; in  n; in++)

for (im = 0; im  m; im++)

{

if (plat[in][im] == '*')  /*该点有雷,无需检测*/

{

plat_new[in][im]= plat[in][im];

continue;

}

if (in - 1 = 0)  //检测上面3个点的雷数

{

if (plat[in - 1][im] == '*')

mark++;

if (im - 1 = 0  plat[in -1][im - 1] == '*')

mark++;

if (im + 1  mplat[in -1][im + 1] == '*')

mark++;

}

if (im - 1 = 0  plat[in][im- 1] == '*')  //检测左右两个点的雷数

mark++;

if (im + 1  m  plat[in][im+ 1] == '*')

mark++;

if (in + 1  n)  //检测下面3个点的雷数

{

if (plat[in + 1][im] == '*')

mark++;

if (im - 1 = 0  plat[in +1][im - 1] == '*')

mark++;

if (im + 1  mplat[in +1][im + 1] == '*')

mark++;

}

switch (mark)

{

case 0:plat_new[in][im] = '0'; break;

case 1:plat_new[in][im] = '1'; break;

case 2:plat_new[in][im] = '2'; break;

case 3:plat_new[in][im] = '3'; break;

case 4:plat_new[in][im] = '4'; break;

case 5:plat_new[in][im] = '5'; break;

case 6:plat_new[in][im] = '6'; break;

case 7:plat_new[in][im] = '7'; break;

case 8:plat_new[in][im] = '8'; break;

}

mark = 0;  //重置雷数

}

if (j != 1)

putchar('\n');

printf("Field#%d:\n", j);

for (in = 0; in  n; in++)  //打印数字地图

{

for (im = 0; im  m; im++)

{

printf("%c", plat_new[in][im]);

}

if(in!=n-1)

putchar('\n');

}

scanf("%d %d", n, m);

getchar();

j++;

} while (1);

return 0;

}


网站标题:C语言扫雷函数流程图,c语言扫雷程序设计
链接URL:http://cxhlcq.com/article/hsoohi.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部