c语言程序设计课程设计扫雷游戏,怎么做?

# include & ltstdlib.h & gt

# include & lttime.h & gt

# include & ltconio.h & gt

/************************************************************************/

/*地图状态约定*/

/* 0:周围九格无雷*/

/* 1~8:周围九格有1~8雷*/

/* -1:带雷的网格*/

/* -2:开了雷的格子*/

/* -3:地图边界*/

/************************************************************************/

int Map[12][12]= { 0 };/*当前正在播放的雷霆地图*/

int map show[12][12]= { 0 };/*当前用户选择的位置,即“打开”的网格*/

int nspace left = 100;/*剩余的空号。如果为0,则任务成功!*/

int lastX,lastY/*失败时,记录地雷的位置*/

int all maps[5][12][12]= { 0 };/*五种张磊图供用户选择*/

/*显示雷区(每次用户操作后重新显示)*/

void draw map();

/*初始化雷区*/

void init map();

/*游戏开始时,加载用户选择的雷霆地图*/

void load map(int index);

/*玩扫雷游戏*/

int Play();

/*绘制主菜单*/

void DrawMainMenu();

/*显示结果*/

void show result(int result);

/*主函数*/

int main(int argc,char* argv[])

{

char ch

int结果;

srand(time(NULL));/*根据当前时间初始化随机数,这样每次启动雷霆的位置都不一样*/

init map();/*初始化5个张磊图供用户选择*/

While(1) /*使用While循环确保用户只有在选择退出时才退出游戏*/

{

DrawMainMenu();/*绘制主菜单*/

flush all();/*清除所有输入和输出缓冲区,主要是输入缓冲区,以防止之前的输入干扰getch () */

ch = getch();/*读取输入*/

开关(通道)

{

案例' 1': /*用户选择1 */

printf(" \ n \ t请输入涂磊号码(1-5):");

While (1) /*循环输入,如果输入错误,总是要求输入*/

{

flush all();

ch = getch();/*读取用户输入的雷霆地图编号*/

if(ch & gt;= ' 1 ' & amp;& ampch & lt= '5') /*仅在1-5之间有效*/

{

load map(ch-' 1 ');/* ch -'1 ',将用户输入转换为涂磊下标(下标从0开始,所以是-'1')*/

打破;/*如果输入正确,退出循环输入*/

}

其他

{

/*如果输入错误,会提示您重新输入*/

printf(" \ n \ t输入无效!请重新输入涂磊号码(1-5):);

flush all();

}

}

结果= Play();/*开始玩扫雷游戏*/

ShowResult(结果);/*显示游戏结果*/

打破;

案例“2”:/*用户选择2 */

退出(0);/*直接退出*/

打破;

默认值:/*无效输入*/

/*不执行任何操作,重新显示主菜单*/

打破;

}

}

返回0;

}

空负载图(整数索引)

{

int i,j;

nSpaceLeft = 90

for(I = 0;我& lt12;i++)

for(j = 0;j & lt12;j++)

{

map[I][j]= all maps[index][I][j];/*将5张磊地图中带有索引的一个加载到地图数组中*/

MapShow[I][j]= 0;/*重启游戏,所以所有方块都“未打开”*/

}

}

void InitMap()

{

int i,j,k;

int m,n;

/*初始化5个地图*/

for(k = 0;k & lt5;k++)

{

/*初始化地图的边界*/

for(I = 0;我& lt12;i++)

{

/*下标为0和11的位置是“边界”,不是雷区,只在程序内部使用*/

all maps[k][0][I]=-3;

all maps[k][11][I]=-3;

all maps[k][I][0]=-3;

all maps[k][I][11]=-3;

}

/*首先初始化10地雷的位置*/

for(I = 0;我& lt10;i++)

{

m = rand()% 10+1;/*随机选择一个X坐标*/

n = rand()% 10+1;/*随机选择一个Y坐标*/

If(AllMaps[k][m][n] == 0) /*如果随机生成的位置之前没有安排放置闪电*/

{

all maps[k][m][n]=-1;/*放置地雷*/

}

Else /*随机生成的位置之前已经挖掘过*/

{

I-;/*此位置无效。创建新的*/

}

}

/*计算每个网格周围的雷数*/

for(I = 1;我& lt11;i++)

for(j = 1;j & lt11;j++)

{

if(AllMaps[k][i][j]!= -1)

{

all maps[k][I][j]= 0;

/*周围八个位置,每一个雷霆,加一个*/

/************************************************************************/

/*坐标[i][j]周围的八个坐标位置:*/

/*[I-1][j-1][I-1][j][I-1][j+1]*/

/*[I][j-1][I][j][I][j+1]*/

/*[I+1][j-1][I+1][j][I+1][j+1]*/

/************************************************************************/

if(all maps[k][I-1][j-1]= =-1)

all maps[k][I][j]++;

if(all maps[k][I-1][j]= =-1)

all maps[k][I][j]++;

if(all maps[k][I-1][j+1]= =-1)

all maps[k][I][j]++;

if(all maps[k][I][j-1]= =-1)

all maps[k][I][j]++;

if(all maps[k][I][j+1]= =-1)

all maps[k][I][j]++;

if(all maps[k][I+1][j-1]= =-1)

all maps[k][I][j]++;

if(all maps[k][I+1][j]= =-1)

all maps[k][I][j]++;

if(all maps[k][I+1][j+1]= =-1)

all maps[k][I][j]++;

}

}

}

}

void DrawMap()

{

int i,j;

系统(“cls”);/*清空屏幕*/

/*绘制坐标和边界*/

printf(" \ n \ n \ n ");

printf(" \ t Y ");

for(I = 1;我& lt11;i++) printf("%-02d ",I-1);

printf(" \ n \ tX | # # # # # # # # # # # # # # # # | \ n ");

/*根据每行中的规则绘制雷区*/

for(I = 1;我& lt11;i++)

{

printf("\t%-02d| ",I-1);/*显示X坐标*/

for(j = 1;j & lt11;j++)

{

If(MapShow[i][j]) /*如果该位置是用户“挖”的,则按原样显示*/

{

if(Map[I][j]& gt;= 0) /*非雷,显示周围雷的数量*/

{

printf("%d| ",Map[I][j]);

}

/*else if(Map[i][j] == 0)

{

printf(" 0 | ");

}*/

Elseif (map [I] [j] =-1)/*雷霆,显示* */

{

printf(" * | ");

}

Else if (Map[i][j] == -2) /*用户挖的矿显示@ */

{

printf(" @ | ");

}

Else /*其他情况(目前不会出现,方便以后展开)*/

{

printf(" | ");

}

}

Else /*如果用户没有“挖掘”该位置,将显示一个空格*/

{

printf(" | ");

}

}

printf(" \ n ");

}

printf(" \ t | # # # # # # # # # # # # # # # # | \ n ");

}

void DrawMainMenu()

{

系统(“cls”);

printf(" \ n \ n \ n \ n \ n ");

printf(" \ t | # # # # # # # # # # # # # # # # | \ n ");

Printf("\t|请选择!| \ n ");

Printf("\t| 1。开始扫雷| \ n ");

Printf("\t| 2。exit | \ n ");

printf(" \ t | # # # # # # # # # # # # # # # # | \ n ");

}

int Play()

{

char chX,chY/*用户输入*/

int X,Y;/*用户输入被转换为整数下标*/

int i,j;

while (1)

{

draw map();/*重新绘制雷场地图*/

/*输入x坐标*/

printf(" \ n \ t请输入x:");

flush all();

while(1)

{

chX = getch();

if(chX & gt;= ' 0 ' & amp& ampchX & lt= '9')

{

x = chX-' 0 '+1;

打破;

}

其他

{

printf(" \ n \ t输入无效!请重新输入x:");

flush all();

}

}

/*输入Y坐标*/

printf(" \ n \ t请输入y:");

flush all();

while(1)

{

chY = getch();

if(chY & gt;= ' 0 ' & amp& ampchY & lt= '9')

{

y = chY-' 0 '+1;

打破;

}

其他

{

printf(" \ n \ t输入无效!请重新输入y:");

flush all();

}

}

If(MapShow[X][Y] == 0) /*输入的位置未打开*/

{

MapShow[X][Y]= 1;/*将该位置标记为“已开放”*/

If (map [x] [y] =-1)/*如果挖矿*/

{

map[X][Y]=-2;/*标记为-2,表示这是用户挖的矿*/

for(I = 1;我& lt11;i++)

for(j = 1;j & lt11;j++)

MapShow[I][j]= 1;/*游戏结束后,所有位置将自动“翻转”*/

/*记录用户所挖地雷的位置坐标*/

lastX = X-1;

lastY = Y-1;

返回0;/*游戏失败!*/

}

Else /*如果不是雷霆*/

{

nspace left-;/*剩余空白减一*/

If (nspacelift = = 0)/*如果剩余空格数为0,则游戏成功*/

{

返回1;/*游戏赢了!*/

}

}

}

Else /*输入的位置被翻转*/

{

printf(" \ n \ t您输入的位置是[%d,% d]\ n \ t该位置已被打开!请重新输入!\ n \按任意键继续...\n”,X-1,Y-1);

flush all();

getch();

}

}

}

void ShowResult( int结果)

{

draw map();

If(result == 1) /*游戏成功*/

{

printf(" \ n \ t祝贺!你完成了扫雷任务!\ n \按任意键继续... ");

flush all();

getch();

}

Else /*游戏失败*/

{

Printf ("\ n \ tHaha!你在[%d,%d]位置有一个地雷。任务失败!\ n \按任意键继续... ",lastX,lastY);

flush all();

getch();

}

}