C语言扫雷算法,也可以别的语言,解释清楚算法就好
在这上面不好说明, 我有C的代码, 你看一下(DEVC++)
#include stdio.h
#include stdlib.h
#include time.h
#include windows.h
#define n 15
int restart=0;
int last_sel_x,last_sel_y;
char in[20];
struct POINT
{
int x;
int y;
} pt;
//设置CMD窗口光标位置
void setxy(int x, int y)
{
COORD coord = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
//获取当前CMD当前光标所在位置
void getxy()
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coordScreen = {0, 0}; //光标位置
CONSOLE_SCREEN_BUFFER_INFO csbi;
if (GetConsoleScreenBufferInfo(hConsole, csbi))
{
// printf("光标坐标:(%d,%d)\n", csbi.dwCursorPosition.X, csbi.dwCursorPosition.Y);
pt.x=csbi.dwCursorPosition.X;
pt.y=csbi.dwCursorPosition.Y;
}
}
struct A
{
int value; //-1为雷
int state; //显示状态: 0为未打开, 1为已打开
int lock; //锁定状态
int bomb; //雷已标记: 0为未标记, 1为已标记
};
struct A s[10][10];
int calc()
{
int i,j,count=0;
for(i=0;i10;i++)
{
for(j=0;j10;j++)
{
if(s[i][j].state==0) count++;
}
}
return count;
}
int prt()
{
system("cls");
int count=calc();
int i,j;
printf("%3c",' ');
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_GREEN);
for(i=0;i10;i++)
{
printf("%3d",i);
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
for(i=0;i10;i++)
{
printf("\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_GREEN);
printf("%3d",i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
for(j=0;j10;j++)
{
if(s[i][j].bomb==1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED);
printf("%3c",'*');
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
else if(s[i][j].state==1)
{
if(s[i][j].value==0) printf("%3c",' ');
else printf("%3d",s[i][j].value);
}
else
{
printf("%3c",'-');
}
/* if(s[i][j].value==-1) printf("%3c",'*');
else printf("%3d",s[i][j].value);*/
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_GREEN);
printf("%3d",i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
printf("\n");
printf("%3c",' ');
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_GREEN);
for(i=0;i10;i++)
{
printf("%3d",i);
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
printf("\n");
getxy();
setxy(45,0);
printf("%d",count);
setxy(40,5);
printf("说明");
setxy(40,7);
printf("1: 输入 *xy(如:*55),则把第5行第5列");
setxy(40,8);
printf(" 标记为地雷");
setxy(40,10);
printf("2: 输入 xy(如55),则把第5行第5列打开");
if(count==n)
{
for(i=0;i10;i++)
{
for(j=0;j10;j++)
{
if(s[i][j].value==-1 s[i][j].bomb==0) s[i][j].bomb=1;
if(s[i][j].value!=-1 s[i][j].state==0) s[i][j].state=1;
}
}
setxy(50,2);
printf("success!");
setxy(pt.x,pt.y);
fflush(stdin);
getchar();
return 1;
}
setxy(pt.x,pt.y);
return 0;
}
void space_process(int x,int y)
{
int i,j;
if(x-1=0 y-1=0)
{
if(s[x-1][y-1].value==0 s[x-1][y-1].lock==0) {s[x-1][y-1].state=1; s[x-1][y-1].lock=1; space_process(x-1,y-1);}
else if(s[x-1][y-1].value!=-1) s[x-1][y-1].state=1;
}
if(x-1=0)
{
if(s[x-1][y].value==0 s[x-1][y].lock==0) {s[x-1][y].state=1; s[x-1][y].lock=1; space_process(x-1,y);}
else if(s[x-1][y].value!=-1) s[x-1][y].state=1;
}
if(x-1=0 y+110)
{
if(s[x-1][y+1].value==0 s[x-1][y+1].lock==0) {s[x-1][y+1].state=1; s[x-1][y+1].lock=1; space_process(x-1,y+1);}
else if(s[x-1][y+1].value!=-1) s[x-1][y+1].state=1;
}
if(y-1=0)
{
if(s[x][y-1].value==0 s[x][y-1].lock==0) {s[x][y-1].state=1; s[x][y-1].lock=1; space_process(x,y-1);}
else if(s[x][y-1].value!=-1) s[x][y-1].state=1;
}
if(y+110)
{
if(s[x][y+1].value==0 s[x][y+1].lock==0) {s[x][y+1].state=1; s[x][y+1].lock=1; space_process(x,y+1);}
else if(s[x][y+1].value!=-1) s[x][y+1].state=1;
}
if(x+110 y-1=0)
{
if(s[x+1][y-1].value==0 s[x+1][y-1].lock==0) {s[x+1][y-1].state=1; s[x+1][y-1].lock=1; space_process(x+1,y-1);}
else if(s[x+1][y-1].value!=-1) s[x+1][y-1].state=1;
}
if(x+110)
{
if(s[x+1][y].value==0 s[x+1][y].lock==0) {s[x+1][y].state=1; s[x+1][y].lock=1; space_process(x+1,y);}
else if(s[x+1][y].value!=-1) s[x+1][y].state=1;
}
if(x+110 y+110)
{
if(s[x+1][y+1].value==0 s[x+1][y+1].lock==0) {s[x+1][y+1].state=1; s[x+1][y+1].lock=1; space_process(x+1,y+1);}
else if(s[x+1][y+1].value!=-1) s[x+1][y+1].state=1;
}
}
int process_char(char* t,int* i,int* j)
{
int len=strlen(t);
int x,y=0;
for(x=0;xlen;x++)
{
if(t[x]==' ')
{
continue;
}
else
{
t[y++]=t[x];
}
}
t[y]='\0';
if(t[0]=='*')
{
*i=t[1]-'0';
*j=t[2]-'0';
if(s[*i][*j].bomb==1)
{
s[*i][*j].bomb=0;
s[*i][*j].state=0;
}
else if(s[*i][*j].bomb==0 s[*i][*j].state==0)
{
s[*i][*j].bomb=1;
}
return 1;
}
else if(t[0]='0' t[0]='9')
{
*i=t[0]-'0';
*j=t[1]-'0';
return 0;
}
return 1;
}
int plus(int x, int y) //返回0为出错,返回1为正确,返回-1为取消
{
int count=s[x][y].value;
int bomb=0;
if(count==0 || count==-1) return -1;
if(x-1=0 y-1=0)
{
if(s[x-1][y-1].bomb==1) bomb++;
}
if(x-1=0)
{
if(s[x-1][y].bomb==1) bomb++;
}
if(x-1=0 y+110)
{
if(s[x-1][y+1].bomb==1) bomb++;
}
if(y-1=0)
{
if(s[x][y-1].bomb==1) bomb++;
}
if(y+110)
{
if(s[x][y+1].bomb==1) bomb++;
}
if(x+110 y-1=0)
{
if(s[x+1][y-1].bomb==1) bomb++;
}
if(x+110)
{
if(s[x+1][y].bomb==1) bomb++;
}
if(x+110 y+110)
{
if(s[x+1][y+1].bomb==1) bomb++;
}
if(bomb==s[x][y].value)
{
if(x-1=0 y-1=0)
{
if(s[x-1][y-1].value==-1 s[x-1][y-1].bomb==0) {return 0;}
}
if(x-1=0)
{
if(s[x-1][y].value==-1 s[x-1][y].bomb==0) return 0;
}
if(x-1=0 y+110)
{
if(s[x-1][y+1].value==-1 s[x-1][y+1].bomb==0) return 0;
}
if(y-1=0)
{
if(s[x][y-1].value==-1 s[x][y-1].bomb==0) return 0;
}
if(y+110)
{
if(s[x][y+1].value==-1 s[x][y+1].bomb==0) return 0;
}
if(x+110 y-1=0)
{
if(s[x+1][y-1].value==-1 s[x+1][y-1].bomb==0) return 0;
}
if(x+110)
{
if(s[x+1][y].value==-1 s[x+1][y].bomb==0) return 0;
}
if(x+110 y+110)
{
if(s[x+1][y+1].value==-1 s[x+1][y+1].bomb==0) return 0;
}
space_process(x,y);
int i,j;
for(i=0;i10;i++)
{
for(j=0;j10;j++)
{
s[i][j].lock=0;
}
}
return 1;
}
else
{
return -1;
}
}
void prt_selected(int x, int y, int flag)
{
if(flag==0)
{
if(x=0) x=last_sel_x;
if(y=0) y=last_sel_y;
}
int plus=2;
getxy();
if(x=0)
{
last_sel_x=x;
setxy(3,x+1);
int j;
if(flag==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_BLUE | FOREGROUND_INTENSITY);
else SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
for(j=0;j10;j++)
{
if(s[x][j].bomb==1)
{
if(flag==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | BACKGROUND_BLUE);
else SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
printf("%3c",'*');
}
else if(s[x][j].state==1)
{
if(s[x][j].value==0) printf("%3c",' ');
else printf("%3d",s[x][j].value);
}
else
{
printf("%3c",'-');
}
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
if(y=0)
{
int i;
last_sel_y=y;
for(i=0;i10;i++)
{
if(last_sel_x==i) continue;
if(flag==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_BLUE | FOREGROUND_INTENSITY);
else SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
setxy(3*y+3,i+1);
if(s[i][y].bomb==1)
{
if(flag==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | BACKGROUND_BLUE);
else SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
printf("%3c",'*');
}
else if(s[i][y].state==1)
{
if(s[i][y].value==0) printf("%3c",' ');
else printf("%3d",s[i][y].value);
}
else
{
printf("%3c",'-');
}
}
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
setxy(pt.x,pt.y);
}
void input() //实时获取键盘输入
{
int c;
int x=-1,y=-1;
int i=0;
int first_num=0;
while(1)
{
fflush(stdin);
c=getch();
printf("%c",c);
if(c==10 || c==13) break;
if(c==8 i0)
{
in[i-1]='\0';
if(in[0]=='*')
{
if(in[1]'0' || in[1]'9')
{
x=-1;
prt_selected(last_sel_x,-1,0);
}
if(in[2]'0' || in[2]'9')
{
y=-1;
prt_selected(-1,last_sel_y,0);
}
}
else
{
if(in[0]'0' || in[0]'9')
{
x=-1;
prt_selected(last_sel_x,-1,0);
}
if(in[1]'0' || in[1]'9')
{
y=-1;
prt_selected(-1,last_sel_y,0);
}
}
i--;
getxy();
setxy(pt.x,pt.y);
printf(" ");
setxy(pt.x,pt.y);
}
else if(c=='*' || (c='0' c='9'))
{
in[i++]=c;
if(in[0]=='*')
{
if(in[1]!='\0' in[1]='0' in[1]='9')
{
x=in[1]-'0';
}
else
{
x=-1;
}
if(in[2]!='\0' in[2]='0' in[2]='9')
{
y=in[2]-'0';
}
else
{
y=-1;
}
}
else if(in[0]='0' in[0]='9')
{
x=in[0]-'0';
if(in[1]='0' in[1]='9')
{
y=in[1]-'0';
}
else
{
y=-1;
}
}
else x=-1;
if(x-1) prt_selected(x,-1,1);
if(y-1) prt_selected(-1,y,1);
}
}
}
int main()
{
int i=0,j,x,y;
while(1)
{
restart=0;
for(i=0;i10;i++)
{
for(j=0;j10;j++)
{
s[i][j].value=0;
s[i][j].state=0;
s[i][j].lock=0;
s[i][j].bomb=0;
}
}
srand((unsigned)time(0));
i=0;
while(in)
{
x=rand()%10;
y=rand()%10;
if(s[x][y].value!=-1)
{
s[x][y].value=-1;
i++;
}
}
for(i=0;i10;i++)
{
for(j=0;j10;j++)
{
if(s[i][j].value==-1) continue;
// n=0;
if(i-1=0)
{
if(s[i-1][j].value==-1) s[i][j].value++;
if(j-1=0)
{
if(s[i-1][j-1].value==-1) s[i][j].value++;
}
if(j+110)
{
if(s[i-1][j+1].value==-1) s[i][j].value++;
}
}
if(i+110)
{
if(s[i+1][j].value==-1) s[i][j].value++;
if(j-1=0)
{
if(s[i+1][j-1].value==-1) s[i][j].value++;
}
if(j+110)
{
if(s[i+1][j+1].value==-1) s[i][j].value++;
}
}
if(j-1=0)
{
if(s[i][j-1].value==-1) s[i][j].value++;
}
if(j+110)
{
if(s[i][j+1].value==-1) s[i][j].value++;
}
}
}
if(prt()==1)
{
restart=1;
continue;
}
while(1)
{
memset(in,'\0',20);
fflush(stdin);
// scanf("%[^\n]",in);
input();
if(process_char(in,i,j)==1)
{
if(prt()==1)
{
restart=1;
break;
}
continue;
}
for(x=0;x10;x++)
{
for(y=0;y10;y++)
{
s[x][y].lock=0;
}
}
if(s[i][j].value==-1)
{
printf("\nBomb");
fflush(stdin);
getchar();
restart=1;
}
else if(s[i][j].value==0)
{
s[i][j].state=1;
space_process(i,j);
}
else if(s[i][j].state==1)
{
int re=plus(i,j);
{
switch(re)
{
case -1:
break;
case 0:
printf("\nBomb");
fflush(stdin);
getchar();
restart=1;
break;
case 1:break;
}
}
}
else
{
s[i][j].state=1;
}
if(prt()==1 || restart==1)
{
restart=0;
break;
}
}
}
return 0;
}
扫雷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语言如何编程实现扫雷?使用WIN-TC或Microsoft Visual C++
我以前写过 很简单。
定义一个2维的数组,然后用rand() 随机布雷,然后计算没有雷的上面的数字。 有雷的定义为-1,没有雷的上面可能是0~8。
算法很简单,剩下的就是绘制界面了。总体不难,为何不自己试试?
如何用C语言编程 扫雷!~
俄罗斯方快http://topic.csdn.net/t/20051201/01/4429905.html
扫雷
#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语言的基本的语法的基本的编程以后该学什么?求高手指教?
再学数据结构,然后学算法,多编程序,至于windows编程是VC学习的基础,对算法要求不高,这属于实践性的,学习VC,然后就可以做框架,窗口之类的,也会蛮有成就感的
C语言扫雷怎么实现?
点击(x,y)
{
如果(x,y)格子不存在,return
如果是炸弹,GG
如果已经翻开,return
如果周围有雷,显示雷数量,并标记翻开
否则
{
显示空,并标记翻开
点击(x-1,y-1)....点击(x+1,y+1)共8个
}
}
基本思路是这样
C语言实现扫雷,用坐标的形式,不要C++
if (rand()%2)
{ // 放雷
}
else
{ // 不放雷
}
C语言扫雷游戏源代码
"扫雷"小游戏C代码
#includestdio.h
#includemath.h
#includetime.h
#includestdlib.h
main( )
{char a[102][102],b[102][102],c[102][102],w;
int i,j; /*循环变量*/
int x,y,z[999]; /*雷的位置*/
int t,s; /*标记*/
int m,n,lei; /*计数*/
int u,v; /*输入*/
int hang,lie,ge,mo; /*自定义变量*/
srand((int)time(NULL)); /*启动随机数发生器*/
leb1: /*选择模式*/
printf("\n 请选择模式:\n 1.标准 2.自定义\n");
scanf("%d",mo);
if(mo==2) /*若选择自定义模式,要输入三个参数*/
{do
{t=0; printf("请输入\n行数 列数 雷的个数\n");
scanf("%d%d%d",hang,lie,ge);
if(hang2){printf("行数太少\n"); t=1;}
if(hang100){printf("行数太多\n");t=1;}
if(lie2){printf("列数太少\n");t=1;}
if(lie100){printf("列数太多\n");t=1;}
if(ge1){printf("至少要有一个雷\n");t=1;}
if(ge=(hang*lie)){printf("雷太多了\n");t=1;}
}while(t==1);
}
else{hang=10,lie=10,ge=10;} /*否则就是选择了标准模式(默认参数)*/
for(i=1;i=ge;i=i+1) /*确定雷的位置*/
{do
{t=0; z[i]=rand( )%(hang*lie);
for(j=1;ji;j=j+1){if(z[i]==z[j]) t=1;}
}while(t==1);
}
for(i=0;i=hang+1;i=i+1) /*初始化a,b,c*/
{for(j=0;j=lie+1;j=j+1) {a[i][j]='1'; b[i][j]='1'; c[i][j]='0';} }
for(i=1;i=hang;i=i+1)
{for(j=1;j=lie;j=j+1) {a[i][j]='+';} }
for(i=1;i=ge;i=i+1) /*把雷放入c*/
{x=z[i]/lie+1; y=z[i]%lie+1; c[x][y]='#';}
for(i=1;i=hang;i=i+1) /*计算b中数字*/
{for(j=1;j=lie;j=j+1)
{m=48;
if(c[i-1][j-1]=='#')m=m+1; if(c[i][j-1]=='#')m=m+1;
if(c[i-1][j]=='#')m=m+1; if(c[i+1][j+1]=='#')m=m+1;
if(c[i][j+1]=='#')m=m+1; if(c[i+1][j]=='#')m=m+1;
if(c[i+1][j-1]=='#')m=m+1; if(c[i-1][j+1]=='#')m=m+1;
b[i][j]=m;
}
}
for(i=1;i=ge;i=i+1) /*把雷放入b中*/
{x=z[i]/lie+1; y=z[i]%lie+1; b[x][y]='#';}
lei=ge; /*以下是游戏设计*/
do
{leb2: /*输出*/
system("cls");printf("\n\n\n\n");
printf(" ");
for(i=1;i=lie;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c ",w);
}
printf("\n |");
for(i=1;i=lie;i=i+1){printf("---|");}
printf("\n");
for(i=1;i=hang;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c |",w);
for(j=1;j=lie;j=j+1)
{if(a[i][j]=='0')printf(" |");
else printf(" %c |",a[i][j]);
}
if(i==2)printf(" 剩余雷个数");
if(i==3)printf(" %d",lei);
printf("\n |");
for(j=1;j=lie;j=j+1){printf("---|");}
printf("\n");
}
scanf("%d%c%d",u,w,v); /*输入*/
u=u+1,v=v+1;
if(w!='#'a[u][v]=='@')
goto leb2;
if(w=='#')
{if(a[u][v]=='+'){a[u][v]='@'; lei=lei-1;}
else if(a[u][v]=='@'){a[u][v]='?'; lei=lei+1;}
else if(a[u][v]=='?'){a[u][v]='+';}
goto leb2;
}
a[u][v]=b[u][v];
leb3: /*打开0区*/
t=0;
if(a[u][v]=='0')
{for(i=1;i=hang;i=i+1)
{for(j=1;j=lie;j=j+1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=1;i=hang;i=i+1)
{for(j=lie;j=1;j=j-1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=hang;i=1;i=i-1)
{for(j=1;j=lie;j=j+1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=hang;i=1;i=i-1)
{for(j=lie;j=1;j=j-1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1;if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=1;i=hang;i=i+1) /*检测0区*/
{for(j=1;j=lie;j=j+1)
{if(a[i][j]=='0')
{if(a[i-1][j-1]=='+'||a[i-1][j-1]=='@'||a[i-1][j-1]=='?')t=1;
if(a[i-1][j+1]=='+'||a[i-1][j+1]=='@'||a[i-1][j+1]=='?')t=1;
if(a[i+1][j-1]=='+'||a[i+1][j-1]=='@'||a[i+1][j-1]=='?')t=1;
if(a[i+1][j+1]=='+'||a[i+1][j+1]=='@'||a[i+1][j+1]=='?')t=1;
if(a[i+1][j]=='+'||a[i+1][j]=='@'||a[i+1][j]=='?')t=1;
if(a[i][j+1]=='+'||a[i][j+1]=='@'||a[i][j+1]=='?')t=1;
if(a[i][j-1]=='+'||a[i][j-1]=='@'||a[i][j-1]=='?')t=1;
if(a[i-1][j]=='+'||a[i-1][j]=='@'||a[i-1][j]=='?')t=1;
}
}
}
if(t==1)goto leb3;
}
n=0; /*检查结束*/
for(i=1;i=hang;i=i+1)
{for(j=1;j=lie;j=j+1)
{if(a[i][j]!='+'a[i][j]!='@'a[i][j]!='?')n=n+1;}
}
}
while(a[u][v]!='#'n!=(hang*lie-ge));
for(i=1;i=ge;i=i+1) /*游戏结束*/
{x=z[i]/lie+1; y=z[i]%lie+1; a[x][y]='#'; }
printf(" ");
for(i=1;i=lie;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c ",w);
}
printf("\n |");
for(i=1;i=lie;i=i+1){printf("---|");}
printf("\n");
for(i=1;i=hang;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c |",w);
for(j=1;j=lie;j=j+1)
{if(a[i][j]=='0')printf(" |");
else printf(" %c |",a[i][j]);
}
if(i==2)printf(" 剩余雷个数");
if(i==3)printf(" %d",lei); printf("\n |");
for(j=1;j=lie;j=j+1) {printf("---|");}
printf("\n");
}
if(n==(hang*lie-ge)) printf("你成功了!\n");
else printf(" 游戏结束!\n");
printf(" 重玩请输入1\n");
t=0;
scanf("%d",t);
if(t==1)goto leb1;
}
/*注:在DEV c++上运行通过。行号和列号都从0开始,比如要确定第0行第9列不是“雷”,就在0和9中间加入一个字母,可以输入【0a9】三个字符再按回车键。3行7列不是雷,则输入【3a7】回车;第8行第5列是雷,就输入【8#5】回车,9行0列是雷则输入【9#0】并回车*/