① 如何用c语言编程 扫雷!~
C语言模拟扫雷的代码如下:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int map[9][9] = {0};
int result[9][9] = {0};
int mine[10][2];
bool Check(int i)
{
int j;
for(j=0;j<i;j++)
if(mine[j][0] == mine[i][0] && mine[j][1] == mine[i][0]) return true;
return false;
}
int MineNum(int x,int y) //这个函数计算坐标(x,y)周围地雷的数目
{
int sum = 0;
int i,j;
if(x-1>=0 && x+1<=8 && y-1>=0 && y+1<=8)
{//中间位置
for(i=x-1;i<=x+1;i++)
for(j=y-1;j<=y+1;j++) sum += map[i][j];
return (sum-map[x][y])/9;
}
if(x==0 && y==0) return (map[0][1]+map[1][0]+map[1][1])/9; //左上角
if(x==0 && y==8) return (map[0][7]+map[1][7]+map[1][8])/9; //右上角
if(x==8 && y==0) return (map[7][0]+map[7][1]+map[8][1])/9; //左下角
if(x==8 && y==8) return (map[7][7]+map[7][8]+map[8][7])/9; //右上角
if(x==0)
{//上边界
for(i=x;i<=x+1;i++)
for(j=y-1;j<=y+1;j++) sum += map[i][j];
return (sum-map[x][y])/9;
}
if(x==8)
{//下边界
for(i=x-1;i<=x;i++)
for(j=y-1;j<=y+1;j++) sum += map[i][j];
return (sum-map[x][y])/9;
}
if(y==0)
{//左边界
for(i=x-1;i<=x+1;i++)
for(j=y;j<=y+1;j++) sum += map[i][j];
return (sum-map[x][y])/9;
}
if(y==8)
{//右边界
for(i=x-1;i<=x+1;i++)
for(j=y-1;j<=y;j++) sum += map[i][j];
return (sum-map[x][y])/9;
}
}
void main()
{
int i,j,x,y;
srand((int)time(0));
for(i=0;i<10;i++)
{
do{
mine[i][0] = rand()%9;
mine[i][1] = rand()%9;
}while(Check(i));
printf("%d\t%d\n",mine[i][0],mine[i][1]);
}
//标识地雷
for(i=0;i<10;i++) map[mine[i][0]][mine[i][1]] = 9;
//计算地雷的数目
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(map[i][j] == 9) result[i][j] = 9;
else result[i][j] = MineNum(i,j);
printf("%d ",result[i][j]);
}
printf("\n");
}
}
② 扫雷C语言
直接一个BMP背景,定好坐标再加上你上面没有边框的,再处理一下边界问题就解决了。你把功能解决了,界面的东西交给美工去做吧。
③ C语言扫雷算法,也可以别的语言,解释清楚算法就好
在这上面不好说明, 我有C的代码, 你看一下(DEVC++)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#definen15
intrestart=0;
intlast_sel_x,last_sel_y;
charin[20];
structPOINT
{
intx;
inty;
}pt;
//设置CMD窗口光标位置
voidsetxy(intx,inty)
{
COORDcoord={x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
//获取当前CMD当前光标所在位置
voidgetxy()
{
HANDLEhConsole=GetStdHandle(STD_OUTPUT_HANDLE);
COORDcoordScreen={0,0};//光标位置
CONSOLE_SCREEN_BUFFER_INFOcsbi;
if(GetConsoleScreenBufferInfo(hConsole,&csbi))
{
//printf("光标坐标:(%d,%d) ",csbi.dwCursorPosition.X,csbi.dwCursorPosition.Y);
pt.x=csbi.dwCursorPosition.X;
pt.y=csbi.dwCursorPosition.Y;
}
}
structA
{
intvalue;//-1为雷
intstate;//显示状态:0为未打开,1为已打开
intlock;//锁定状态
intbomb;//雷已标记:0为未标记,1为已标记
};
structAs[10][10];
intcalc()
{
inti,j,count=0;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if(s[i][j].state==0)count++;
}
}
returncount;
}
intprt()
{
system("cls");
intcount=calc();
inti,j;
printf("%3c",'');
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
FOREGROUND_GREEN);
for(i=0;i<10;i++)
{
printf("%3d",i);
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
for(i=0;i<10;i++)
{
printf(" ");
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;j<10;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);
}
elseif(s[i][j].state==1)
{
if(s[i][j].value==0)printf("%3c",'');
elseprintf("%3d",s[i][j].value);
}
else
{
printf("%3c",'-');
}
/* if(s[i][j].value==-1) printf("%3c",'*');
elseprintf("%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(" ");
printf("%3c",'');
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
FOREGROUND_GREEN);
for(i=0;i<10;i++)
{
printf("%3d",i);
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
printf(" ");
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;i<10;i++)
{
for(j=0;j<10;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();
return1;
}
setxy(pt.x,pt.y);
return0;
}
voidspace_process(intx,inty)
{
inti,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);}
elseif(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);}
elseif(s[x-1][y].value!=-1)s[x-1][y].state=1;
}
if(x-1>=0&&y+1<10)
{
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);}
elseif(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);}
elseif(s[x][y-1].value!=-1)s[x][y-1].state=1;
}
if(y+1<10)
{
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);}
elseif(s[x][y+1].value!=-1)s[x][y+1].state=1;
}
if(x+1<10&&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);}
elseif(s[x+1][y-1].value!=-1)s[x+1][y-1].state=1;
}
if(x+1<10)
{
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);}
elseif(s[x+1][y].value!=-1)s[x+1][y].state=1;
}
if(x+1<10&&y+1<10)
{
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);}
elseif(s[x+1][y+1].value!=-1)s[x+1][y+1].state=1;
}
}
intprocess_char(char*t,int*i,int*j)
{
intlen=strlen(t);
intx,y=0;
for(x=0;x<len;x++)
{
if(t[x]=='')
{
continue;
}
else
{
t[y++]=t[x];
}
}
t[y]='