

#include <stdio.h>
#include <stdlib.h>
#include<time.h>/*用到了time函数,所以要有这个头文件*/ #define LEI 10 //地雷标记
#define LEI_X 15 //雷区列数
#define LEI_Y 15 //雷区行数
int LEI_buju[LEI_Y][LEI_X]; //雷区地图用二维数组表示
int LEI_buju_init(void); //雷区地图初始化函数
int LEI_buju_print(void); //雷区状态输出到屏幕(调试用,做扫雷游戏时用自己的UI线程代替)
int LEI_buju_bulei(void); //布雷函数(随机的把LEI_X*LEI_Y/10个雷步到雷区中)
int LEI_buju_tishi(void); //计算地雷提示
main()
{
LEI_buju_init();
LEI_buju_bulei();
LEI_buju_print();
LEI_buju_tishi();
system("pause");
}
////////////////////////////////////////////////////////////////////////////////
int LEI_buju_init(void)
{
//初始化雷区数组
int x,y;
for(y=0;y<LEI_Y;y++)
for(x=0;x<LEI_X;x++)
{
LEI_buju[y][x]=0;
}
return 1;
}
////////////////////////////////////////////////////////////////////////////////
int LEI_buju_print(void)
{
//向屏幕输出雷区状态
int x,y;
printf("%dx%d雷区布雷情况如下(1表示是地雷0表示无雷):\n\n",LEI_Y,LEI_X);
for(y=0;y<LEI_Y;y++)
{
for(x=0;x<LEI_X;x++)
{
if(LEI_buju[y][x]==0) printf("%d ",LEI_buju[y][x]);
else {printf("%d ",(LEI_buju[y][x]-9)); }
}
printf("\n");
}
///////////////////////////////////////////////
printf("\n去掉安全区域后的雷区布局如下:\n");
for(y=0;y<LEI_Y;y++)
{
for(x=0;x<LEI_X;x++)
{
if(LEI_buju[y][x]==0) {printf(" ");}
else {printf("Q "); }
}
printf("\n");
}
printf("\n");
return 1;
}
////////////////////////////////////////////////////////////////////////////////
int LEI_buju_bulei(void)
{
//向雷区中随机布雷
int x,y,L,l;
L=LEI_Y*LEI_X/10; //雷区中地雷总数
srand((unsigned)time(NULL));//调用该方法产生随机数的种子
for(l=0;l<L;)
{
y=rand()%LEI_Y; //随机产生地雷所在的行系数
x=rand()%LEI_X; //随机产生地雷所在的列系数
if(LEI_buju[y][x]==LEI) {continue;}
else if(LEI_buju[y][x]==0)
{
LEI_buju[y][x]=LEI;
l++;
}
}
return 1;
}
////////////////////////////////////////////////////////////////////////////////
int LEI_buju_tishi(void)
{
//计算地雷位置提示,数据保存在雷区布局数组中
int BJ[LEI_Y][LEI_X];
int x,y;
for(y=0;y<LEI_Y;y++)
{
for(x=0;x<LEI_X;x++)
{
BJ[y][x]=0;
}
}
//计算四个角
if(LEI_buju[0][0]==LEI)
{
BJ[y][x]=LEI;
}else BJ[0][0]=(LEI_buju[0][1]+LEI_buju[1][0]+LEI_buju[1][1])/10;
if(LEI_buju[y-1][0]==LEI)
{
BJ[y][x]=LEI;
}else BJ[LEI_Y-1][0]=(LEI_buju[LEI_Y-2][0]+LEI_buju[LEI_Y-2][1]+LEI_buju[LEI_Y-1][1])/10;
if(LEI_buju[0][LEI_X-1]==LEI)
{
BJ[y][x]=LEI;
}else BJ[0][LEI_X-1]=(LEI_buju[0][LEI_X-2]+LEI_buju[0][LEI_X-1]+LEI_buju[1][LEI_X-2])/10;
if(LEI_buju[LEI_Y-1][LEI_X-1]==LEI)
{
BJ[y][x]=LEI;
}else BJ[LEI_Y-1][LEI_X-1]=(LEI_buju[LEI_Y-2][LEI_X-2]+LEI_buju[LEI_Y-2][LEI_X-1]+LEI_buju[LEI_Y-1][LEI_X-2])/10;
//计算第一行
for(y=0,x=1;x<LEI_X-1;x++)
{
if(LEI_buju[y][x]==LEI)
{
BJ[y][x]=LEI;
}else
{
BJ[y][x]=(LEI_buju[y][x-1]+LEI_buju[y][x+1]+
LEI_buju[y+1][x-1]+ LEI_buju[y+1][x]+LEI_buju[y+1][x+1])/10;
}
}
//计算第一列
for(y=1,x=0;y<LEI_Y-1;y++)
{
if(LEI_buju[y][x]==LEI)
{
BJ[y][x]=LEI;
}else
{
BJ[y][x]=(LEI_buju[y-1][x]+LEI_buju[y-1][x+1]+
LEI_buju[y][x+1]+
LEI_buju[y+1][x]+LEI_buju[y+1][x+1])/10;
}
}
//计算最后一行
for(y=LEI_Y-1,x=1;x<LEI_X-1;x++)
{
if(LEI_buju[y][x]==LEI)
{
BJ[y][x]=LEI;
}else
{
BJ[y][x]=(LEI_buju[y][x-1]+LEI_buju[y][x+1]+
LEI_buju[y-1][x-1]+LEI_buju[y-1][x]+LEI_buju[y-1][x+1])/10;
}
}
//计算最后一列
for(y=1,x=LEI_X-1;y<LEI_Y-1;y++)
{
if(LEI_buju[y][x]==LEI)
{
BJ[y][x]=LEI;
}else
{
BJ[y][x]=(LEI_buju[y-1][x-1]+LEI_buju[y-1][x]+
LEI_buju[y][x-1]+
LEI_buju[y+1][x-1]+LEI_buju[y+1][x])/10;
}
}
//计算其余的部分
for(y=0;y<LEI_Y;y++)
{
for(x=0;x<LEI_X;x++)
{
if(x>=1&&x<LEI_X-1&&y>=1&&y<LEI_Y-1)
{
if(LEI_buju[y][x]==LEI)
{
BJ[y][x]=LEI;
}else {
BJ[y][x]=(LEI_buju[y-1][x-1]+LEI_buju[y-1][x]+LEI_buju[y-1][x+1]+
LEI_buju[y][x-1]+LEI_buju[y][x+1]+
LEI_buju[y+1][x-1]+LEI_buju[y+1][x]+LEI_buju[y+1][x+1])/10;
}
}
}
}
printf("计算后的雷区提示如下:\n");
for(y=0;y<LEI_Y;y++)
{
for(x=0;x<LEI_X;x++)
{
if(BJ[y][x]==LEI) printf("Q ");
if(BJ[y][x]==0) printf(" ");
if(BJ[y][x]!=0&&BJ[y][x]!=LEI) printf("%d ",BJ[y][x]);
}
printf("\n");
}
printf("\n\n\n");
return 1;
}
|