c语言程序设计课程设计扫雷游戏,怎么做?
# 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();
}
}