

#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;
}
|