扫雷游戏大家肯定都玩过,每排出一个雷,那个地方就会显示周围有几个雷。
下面我附上代码给大家细讲:
这个是头文件和自己define的行数,列数,我写的是9*9的扫雷游戏,其中呢,有10个雷,定义的ROWS和COLS的作用之后会讲到
#include<stdio.h>
//#include"asaolei.h"
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define Count 10
void initially(char arr[ROWS][COLS],int r,int c,char ch);
void DisplayBoard(char a[ROWS][COLS],int row,int col);
void setmine(char a[ROWS][COLS],int row,int col);
主函数:巨简单,游戏的完成是分成了多个函数
int main()
{
test();
return 0;
}
我们先来看看test函数:test函数呢给出了游戏的大致思路,我们开始游戏得有菜单,然后选择开始游戏或者退出,菜单很简单,就是简单的打印(附在了test函数底下)。该函数用力do-while循环,其中加了switch分支,选1开始游戏,选0结束游戏,选其他的重新输入,我们为什么case1后面加了一个n=0呢,因为一次游戏结束了程序就得结束了,如果n!=0,do-while循环不会停止。OK,这个明白了我们来看看真正发挥作用的game函数。
void test()
{
int n;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择->");
scanf("%d",&n);
switch(n)
{
case 1 :
game();
n=0;
break;
case 0 :
printf("游戏结束,退出游戏\n");
break;
default :
printf("选择错误,请重新选择\n");
break;
}
} while (n);
}
void menu()//游戏的菜单
{
printf("********************\n");
printf("******1、PLAY*******\n");
printf("******0、exit*******\n");
printf("********************\n");
}
game函数:函数里注释的都是在测试代码的时候用的,咱们测试正确性都可以试一试,当我们玩游戏的时候,埋下的雷肯定不能让别人看到呀,所以有一个埋雷的数组,一个展示给读者的“雷组”,那我们要怎么样埋雷呢,在mine数组’0‘代表不是雷,’1‘代表是雷(踩到你就要噶啦),所以我们先将两个数组初始化,mine数组为’0‘,show数组是’*‘,继续往下看initially函数
void game()//完成扫雷游戏
{
char mine[ROWS][COLS] = {0};//全部初始化为‘0’
char show[ROWS][COLS] = {0};// 全部初始化为‘*’
//定义一个初始化函数完成初始化
initially(mine,ROWS,COLS,'0');
initially(show,ROWS,COLS,'*');
//打印棋盘
//DisplayBoard(mine,ROW,COL);
//DisplayBoard(show,ROW,COL);
//布置雷,在9*9的棋盘上随机布置10个雷
setmine(mine,ROW,COL);
//DisplayBoard(mine,ROW,COL);
DisplayBoard(show,ROW,COL);
//排查雷
Findmine(mine,show,ROW,COL);
}
initially函数:initially(mine,ROWS,COLS,'0');
initially(show,ROWS,COLS,'*');我们要清楚型参和实参,是将全部数组初始化
下面要讲为神马define ROWS和COLS,当我们玩游戏的时候,查某个坐标周围有几个雷,该坐标在边界时就会有越界的情况(这样还需要我们判断),为了减少自己的麻烦,直接分别给行和列都加一行,这样就不存在越界的情况。
void initially(char a[ROWS][COLS],int row,int col,char ch)
{
int i,j;
for(i=0;i<row;i++)
{
j=0;
for(j=0;j<col;j++)
{
a[i][j]=ch;
}
}
}
下面我们就要埋雷炸人了,setmine函数:
void setmine(char a[ROWS][COLS],int row,int col)
{
int count = Count;
while(count)
{
int x=rand()%row+1;
int y=rand()%col+1;//将雷的坐标控制在1~9之内
if(a[x][y]=='0')
{
a[x][y]='1';
count --;
}
}
}
埋雷肯定要在9*9的棋盘中随机埋雷,rand()产生随机数,要将雷的坐标控制在1~9之内,就直接x=rand()%row+1,y同理。
埋好雷下一步要干什么呢,当然是让别人找雷,我先说一说Findmine函数:
我们要先让用户输入一个所要排查雷的坐标,win就是所排查出的不是雷的个数,如果排查的那个地方是‘1’,那就被炸死了,程序结束,如果是‘0’那就要统计该坐标雷的个数了,Getmine_count就是统计坐标周围雷的个数的函数。当你看到这里先去吧Getmine_count函数理解了。我们要知道‘1’是雷,‘0’不是雷,那么这个函数很容易理解。
当我们排查了一个坐标,用户屏幕上要显示出他排查该坐标后的结果,show数组就要打印给用户看,用户要看到被排查的那个坐标周围雷的个数n+'0',排查一个结果win++。
void Findmine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
int x;
int y;
int win=0;
printf("请输入要排查的坐标\n");
while(win<row*col-Count)
{
scanf("%d %d",&x,&y);
if(x>=1&&x<=row&&y>=1&&y<=col)
{
if(mine[x][y]=='1')
{
printf("很遗憾,你被我埋的雷炸死咯哈哈哈\n");
printf("小趴菜,让你看看我的雷在哪\n");
DisplayBoard(mine,ROW,COL);
break;
}
else
{
//统计该坐标周围一共有多少个雷
int n=Getmine_count(mine,x,y);
show[x][y]=n+'0';
DisplayBoard(show,ROW,COL);
win++;
}
}
else{
printf("坐标非法请重新输入\n");
}
if(win==row*col-Count)
{
printf("铁子实力有的呢,拆弹专家,排雷成功\n");
break;
}
}
}
int Getmine_count(char mine[ROWS][COLS],int x,int y)
{
int count=0,i,j;
for(i=x-1;i<=x+1;i++)
{
for(j=y-1;j<=y+1;j++)
{
if(mine[i][j]=='1')
{
count++;
}
}
}
return count;
}
下面是DisplayBoard函数:这个函数很简单测试到自己想要的结果就行
void DisplayBoard(char a[ROWS][COLS],int row,int col)
{
int i,j;
printf("-------扫雷游戏------\n");
printf("--------start-------\n");
for(i=0;i<=col;i++)
{
printf("%-2d",i);
}
printf("\n");
for(i=1;i<=row;i++)
{
printf("%d",i);
for(j=1;j<=col;j++)
{
printf("%2c",a[i][j]);
}
printf("\n");
}
}
每写一个函数我们都要去测试一下,达到咱们想要的结果之后再写下一个函数