c语言编写扫雷代码,c++编写扫雷
传统艺术目录?过渡区?故事片的开始?在菜单上?游戏主题?初始化?打印雷区?贝利雷大师?扫雷舰?雷区舞王?
传统艺术?边肖是大一新生,我不想重复。欢迎指点迷津。
以前在博客上点我!指给我看!请点击我搜索博主【认识天空的蓝】!指给我看!请搜索博主【知天之蓝】或扫码进入!
乔氏gitee代码库(Grew Man)欢迎访问,点我!
(https://blog.51cto.com)谢谢你的支持!
过渡区?现在是北京时间2:38,白天还有那么多事,夜生活就是写博客。昨天因为没有完全了解扫雷,所以没有写。反正明天早上一两节课就不上课了。现在是我最享受的时刻,一个人,一盏灯,一杯咖啡。宿舍里没有噪音,背景放着我喜欢的歌,憧憬着最好的明天。
故事片的开始?雷霆不扫,何以扫天下?
今天主要实现初级扫雷游戏,方法简单易懂。制作注重功能实现而非包装,只是简单表达“扫雷”,后期会优化升级。
接受了三子棋的洗礼,扫雷和之前的三子棋差不多,但其实写完才知道扫雷比三子棋简单一点。因为三字棋更多的是在空间上操作,会更多的依赖二维数组的使用,所以过程会更复杂。下面是康康扫雷的具体流程:
为了方便使用,最好先在头文件中宏定义数组的两个元素,这样也方便以后修改:
#定义第2行第2行
#定义列COL2 2
#定义第2行9
#定义列2 9
在菜单上?无效菜单()
{
printf(-\ n );
printf(-M e n u-\ n );
printf(---\ n );
printf( - 1。p L A Y-\ n );
printf( - 0。e X I T-\ n );
printf(-\ n );
printf(-\ n );
}简单的小菜单,这是一个菜单功能,选择功能是通过switch语句实现的:
无效测试()
{
int input=0;//输入值存储在input中进行判断。
srand((无符号int)time(NULL));
做
{
menu();
Printf(请选择菜单:);
scanf(%d ,输入);
开关(输入)
{
案例1:
{
Printf(开始扫雷:);
saolei();//进入游戏主体
打破;
}
案例0:
{
Printf(即将退出…);
打破;
}
Default: //处理非指定值输入
{
printf(‘开个玩笑。这是什么?\ n’);
打破;
}
}
} while(输入);//可以反复播放。
}
游戏主题?void saolei()
{
char board[ROW][COL]={ 0 };//实际的矩阵
char real[ROW][COL]={ 0 };//玩家视角矩阵
Start(board,ROW,COL, 0 );//雷区初始化
Start(real,ROW,COL, * );
集合(板、行、列);//布雷(布雷)
Show(board,ROW2,col 2);
Show(real,ROW2,col 2);//布局(雷区`在此插入代码片`)显示
Find(board,real,ROW,COL);//逻辑判断
}
初始化?首先,阵法的创造和散聚有很大的不同。基于游戏规则本身的特点,我们需要实际设计雷阵呈现给玩家,这也是扫雷的一大特色。因为初始化方法不同,对应的函数也不同,所以我们创建了名为board和real的数组。
使用Start函数在game.c中定义:
void Start(char board[ROW][COL],int row,int col,char set)
{
int I=0;
int j=0;
for(I=0;我划船;我)
{
for(j=0;j colj)
{
板[i][j]=集;
}
printf( \ n );
}
}这里数组的初始化是通过嵌套for循环来实现的。这里,“设置”是我指定的两个字符。我们需要全零来做我的,而玩家需要一个“*”来猜。
打印雷区?先把我们需要的打出来,和玩家的对比如下:以下是玩家视角。
使用显示功能实现如下功能:
空显示(char board[ROW2][COL2],int row2,int col2)
{
int I=0;
int j=0;
for(I=0;i=col2我)
{
printf(%d ,I);//打印相应的行数和列数。
}
printf( \ n );
for(I=1;i=row2我)
{
printf(%d ,I);
for(j=1;j=col2j)
{
printf(%c ,board[I][j]);//存到%c里埋地雷
}
printf( \ n );
}
}
贝利雷大师?空集合(char board[ROW][COL],int row,int col)
{
int count=度;
while(计数)
{
int x=rand()% row 1;//生成0~9个随机数
int y=rand()% col 1;//生成0 ~ 90%的随机数
if (board[x][y]==0 )
{
board[x][y]= 1 ;//法官,如果是空格,可以埋雷。
count-;//埋十。
}
}
}这里重点只是随机数的应用。这里的随机数是伪随机的,由rand函数产生。它需要在主函数中初始化。使用“srand”函数,时间戳作为随机数的生成标准。这里就不重复了。不知道的话,可以参考前面三子棋的解释。记得引用stdlib.h和time.h头文件。
扫雷舰?==为什么一个雷不能横扫天下?==扫雷的标准是一把成功的斧头,逻辑到位,一切唾手可得。判断输赢并不难。踩雷与否这种简单的逻辑谁不会写?重点是没踩雷没做完的过程:
当我们来到一个“安全区域”时,我们展示的是周围八个单位格的雷数之和。我们设置一个Amount函数,并使用周围八个单元格的返回值作为输入。注意这里我们计算的返回值是一个整数,但是我放入数组的是一个字符类型。把一个数字转换成对应的字符类型,该怎么办?很简单,就是+0 。所以我们在计算8个单元格的和并返回值的时候,会提前-8 * 0 。
static amount(char board[row][col],int x,int y)//仅限于此源文件。
{
返回纸板[x 1][y]
棋盘[x ^ 1][y ^ 1]
board[x][y 1]
董事会[x-1][y-1]
董事会[x - 1][y]
董事会[x - 1][y - 1]
棋盘[x][y - 1]
board[x 1][y-1]-8 * 0 ;//求和计算
}
void Find(char board[ROW2][ROW2],char real[ROW2][COL2],int row,int col)
{
int x=0;
int y=0;
int I=0;
int win=0;
while (win row*col-10)
{
Printf(请输入故障排除坐标:);
scanf(%d %d ,x,y);
if (x=1 x=行y=1 y=列)
{
If (board[x][y]==1) //踩雷判断
{
printf(B O O M!\ n’);
printf(游戏结束\ n );
Show(board,第2行,第2列);
打破;
}
Else //不踩雷的雷数计算
{
i=金额(board,x,y);
实数[x][y]=I 0 ;
Show(real,row-2,col-2);
赢;
}
}
Else //判断出界
{
Printf(无效坐标!再次输入\ n’);
}
}
If (win==row * col-10) //胜利判断
{
祝贺你,你赢了!\ n’);
}
}
雷区舞王?完整代码,请参考:
测试. c
#包含“saolei.h”
无效菜单()
{
printf(-\ n );
printf(-M e n u-\ n );
printf(---\ n );
printf( - 1。p L A Y-\ n );
printf( - 0。e X I T-\ n );
printf(-\ n );
printf(-\ n );
}
void saolei()
{
char board[ROW][COL]={ 0 };//扫雷矩阵
char real[ROW][COL]={ 0 };//排雷矩阵
Start(board,ROW,COL, 0 );//初始化
Start(real,ROW,COL, * );
集合(板、行、列);//布局
Show(board,ROW2,col 2);
Show(real,ROW2,col 2);//布局
Find(board,real,ROW,COL);
}
无效测试()
{
int input=0;
srand((无符号int)time(NULL));
做
{
menu();
Printf(请选择菜单:);
scanf(%d ,输入);
开关(输入)
{
案例1:
{
Printf(开始扫雷:);
saolei();
打破;
}
案例0:
{
Printf(即将退出…);
打破;
}
默认值:
{
printf(‘开个玩笑。这是什么?\ n’);
打破;
}
}
} while(输入);
}
int main()
{
test();
返回0;
} game.c
# define _CRT_SECURE_NO_WARNINGS
#包含“saolei.h”
void Start(char board[ROW][COL],int row,int col,char set)
{
int I=0;
int j=0;
for(I=0;我划船;我)
{
for(j=0;j colj)
{
板[i][j]=集;
}
printf( \ n );
}
}
空显示(char board[ROW2][COL2],int row2,int col2)
{
int I=0;
int j=0;
for(I=0;i=col2我)
{
printf(%d ,I);
}
printf( \ n );
for(I=1;i=第2行我)
{
printf(%d ,I);
for(j=1;j=col2j)
{
printf(%c ,board[I][j]);
}
printf( \ n );
}
}
空集合(char board[ROW][COL],int row,int col)
{
int计数=度;
而(计数)
{
int x=rand()% row 1;
int y=rand()% col 1;
if (board[x][y]==0 )
{
board[x][y]= 1 ;
count-;
}
}
}
静态金额(char board[ROW][COL],int x,int y)
{
返回纸板[x ^ 1][y]
棋盘[x ^ 1][y ^ 1]
board[x][y 1]
董事会[x-1][y-1]
董事会[x - 1][y]
董事会[x - 1][y - 1]
棋盘[x][y - 1]
board[x 1][y-1]-8 * 0 ;
}
void Find(char board[ROW2][ROW2],char real[ROW2][COL2],int row,int col)
{
int x=0;
int y=0;
int I=0;
int win=0;
while (win row*col-10)
{
printf(请输入排查坐标: );
scanf(%d %d ,x,y);
如果(x=1 x=行y=1 y=列)
{
if (board[x][y]==1 )
{
printf(B O O M!\ n’);
printf(游戏结束\ n’);
显示(板,第2行,第2列);
打破;
}
其他
{
我=金额(板,x,y);
实数[x][y]=I 0 ;
Show(real,row-2,col-2);
赢;
}
}
其他
{
printf(无效坐标!重新输入\ n’);
}
}
if (win==row * col - 10)
{
祝贺你,你赢了!\ n’);
} game.h
#杂注一次
#定义第2行第2行
#定义列COL2 2
#定义第2行9
#定义列2 9
#定义度数10
#包含标准视频
#包含标准库
#包含时间。h
void menu();
void saolei();
void Start(char board[ROW][COL],int row,int col,char set);
void Show(char board[ROW2][COL2],int row2,int col 2);
void Set(char board[ROW][COL],int row2,int COL 2);
void Find(char board[ROW][ROW],char real[ROW][COL],int row,int COL);实战效果:(模拟踩雷)
现在是北京时间4:32,这波是熬夜冠军哈哈,躺平了家人们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。