|


#include <stdio.h>
#include <stdlib.h>
#include<time.h>/*用到了time函數(shù),所以要有這個(gè)頭文件*/ #define LEI 10 //地雷標(biāo)記
#define LEI_X 15 //雷區(qū)列數(shù)
#define LEI_Y 15 //雷區(qū)行數(shù)
int LEI_buju[LEI_Y][LEI_X]; //雷區(qū)地圖用二維數(shù)組表示
int LEI_buju_init(void); //雷區(qū)地圖初始化函數(shù)
int LEI_buju_print(void); //雷區(qū)狀態(tài)輸出到屏幕(調(diào)試用,做掃雷游戲時(shí)用自己的UI線程代替)
int LEI_buju_bulei(void); //布雷函數(shù)(隨機(jī)的把LEI_X*LEI_Y/10個(gè)雷步到雷區(qū)中)
int LEI_buju_tishi(void); //計(jì)算地雷提示
main()
{
LEI_buju_init();
LEI_buju_bulei();
LEI_buju_print();
LEI_buju_tishi();
system("pause");
}
////////////////////////////////////////////////////////////////////////////////
int LEI_buju_init(void)
{
//初始化雷區(qū)數(shù)組
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)
{
//向屏幕輸出雷區(qū)狀態(tài)
int x,y;
printf("%dx%d雷區(qū)布雷情況如下(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去掉安全區(qū)域后的雷區(qū)布局如下:\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)
{
//向雷區(qū)中隨機(jī)布雷
int x,y,L,l;
L=LEI_Y*LEI_X/10; //雷區(qū)中地雷總數(shù)
srand((unsigned)time(NULL));//調(diào)用該方法產(chǎn)生隨機(jī)數(shù)的種子
for(l=0;l<L;)
{
y=rand()%LEI_Y; //隨機(jī)產(chǎn)生地雷所在的行系數(shù)
x=rand()%LEI_X; //隨機(jī)產(chǎn)生地雷所在的列系數(shù)
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)
{
//計(jì)算地雷位置提示,數(shù)據(jù)保存在雷區(qū)布局?jǐn)?shù)組中
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;
}
}
//計(jì)算四個(gè)角
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;
//計(jì)算第一行
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;
}
}
//計(jì)算第一列
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;
}
}
//計(jì)算最后一行
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;
}
}
//計(jì)算最后一列
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;
}
}
//計(jì)算其余的部分
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("計(jì)算后的雷區(qū)提示如下:\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;
}
|
|