C语言如何实现扫雷程序

这篇文章给大家分享的是有关C语言如何实现扫雷程序的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

使用C语言实现简单的扫雷程序,主要是对二维数组的运用,我们需要一个头文件,两个源文件来实现。

game.h //包含函数的声明,宏定义test.c //包含主函数,函数调用game.c //包含函数的定义

整体思路

1.要完成一个简单的扫雷程序,我们需要创建两个二维数组,一个保存我们随机生成的雷,另外一个向外界展示。

//使用宏定义定义常量,方便之后对数组的使用
#defineROW11//雷
#defineCOL11
#defineROWS9//棋盘
#defineCOLS9
#defineTHUNDER10//雷数

charmine[ROW][COL]={0};//存雷数组
charshow[ROWS][COLS]={0};//展示数组
Arr_init(mine,show,ROW,COL,ROWS,COLS);//数组初始化

2.完成对数组的初始化后,我们需要对雷进行放置

voidCol_thu(charmine[ROW][COL],introw,intcol,intthunder)//布置雷
{
intx,y;
inti=0;
while(i

3.布置完雷后,我们需要打印所需要的棋盘

存雷棋盘

voidPrint_che1(charmine[ROW][COL],introw,intcol)//打印存雷棋盘
{
inti,j;
for(i=0;i

展示棋盘

voidPrint_che2(charshow[ROWS][COLS],introws,intcols)//打印展示棋盘
{
inti,j;
for(i=0;i<=rows;i++)//方便我们输入坐标
{
printf("%2d",i);
}
printf("\n");
for(i=0;i

4.打印完棋盘后,我们开始扫雷了。

在扫雷的过程中,我们需要在没有找到雷时展示输入坐标周围的雷数并进行展开,同时,为了增加游戏的可玩性,当第一次就找到雷时,我们需要将雷转移到其他位置。

统计周围雷数

voidNum_mines(charmine[ROW][COL],charshow[ROWS][COLS],intx,inty)//计算输入坐标周围的雷数
{
intch;
ch=mine[x-1][y-1]+mine[x-1][y]+mine[x-1][y+1]+mine[x][y-1]+mine[x][y+1]+mine[x+1][y-1]+mine[x+1][y]+mine[x+1][y+1]-8*'0';
show[x-1][y-1]=ch+48;//数字对应的ASCLL与数字字符相差48
}

展开

voidopen_show(charmine[ROW][COL],charshow[ROWS][COLS],introws,intx,inty)//计算输入坐标及周围的雷数(展开)
{
if(mine[x][y-1]=='0')//中x,y
{
if(x-1>=0&&y-1>=0&&x+1<=rows+1&&y+1<=rows+1)//防止越界情况(所有的坐标+1<=rows+1,-1>=0)
{
Num_mines(mine,show,x,y);//返回坐标周围的雷数
}
}
if(mine[x-1][y-1]=='0')//左上角x-1,y-1
{
if(x-2>=0&&y-2>=0&&x<=rows+1&&y<=rows+1)
{
Num_mines(mine,show,x-1,y-1);
}
}

if(mine[x-1][y]=='0')//上x-1,y
{
if(x-2>=0&&y-1>=0&&x<=rows+1&&y+1<=rows+1)
{
Num_mines(mine,show,x-1,y);
}
}
if(mine[x-1][y+1]=='0')//右上角x-1,y+1
{
if(x-2>=0&&y>=0&&x<=rows+1&&y+2<=rows+1)
{
Num_mines(mine,show,x-1,y+1);
}
}
if(mine[x][y-1]=='0')//左x,y-1
{
if(x-1>=0&&y-2>=0&&x+1<=rows+1&&y<=rows+1)
{
Num_mines(mine,show,x,y-1);
}
}
if(mine[x][y+1]=='0')//右x,y+1
{
if(x-1>=0&&y>=0&&x+1<=rows+1&&y+2<=rows+1)
{
Num_mines(mine,show,x,y+1);
}
}

if(mine[x+1][y-1]=='0')//左下角x+1,y-1
{
if(x>=0&&y-2>=0&&x+2<=rows+1&&y<=rows+1)
{
Num_mines(mine,show,x+1,y-1);
}
}

if(mine[x+1][y]=='0')//下x+1,y
{
if(x>=0&&y-1>=0&&x+2<=rows+1&&y+1<=rows+1)
{
Num_mines(mine,show,x+1,y);
}
}
if(mine[x+1][y+1]=='0')//右下角x+1,y+1
{
if(x>=0&&y>=0&&x+2<=rows+1&&y+2<=rows+1)
{
Num_mines(mine,show,x+1,y+1);
}
}
}

扫雷

charFind_thu(charmine[ROW][COL],charshow[ROWS][COLS],introw,intcol,inti)//找雷
{
intx,y;
flag1:
printf("请玩家输入坐标");
scanf("%d%d",&x,&y);
flag:
if((x>0&&x<=row-2)&&(y>0&&y<=col-2))//判断输入坐标的正确性
{
if(mine[x][y]=='0')//没找到雷
{
open_show(mine,show,ROWS,x,y);//计算输入坐标及周围的雷数(展开)
return'0';
}
else//找到雷
{
if(i==0)//第一个就找到雷
{
mine[x][y]='0';
while(1)
{
inta,b;
a=rand()%(row-2)+1;
b=rand()%(col-2)+1;
if(mine[a][b]=='0')
{
mine[a][b]='1';
gotoflag;
}
}
}
else
{
show[x-1][y-1]='1';
return'1';
}
}
}
else
{
printf("输入错误\n");
gotoflag1;
}
}

确定大致思路后,我们完成程序的流程部分,并放入我们所创建的文件中。

代码如下:

game.h //包含函数的声明,宏定义

#ifndef__GAME_H__
#define__GAME_H__

#include
#include
#include
#include

#defineROW11//雷
#defineCOL11
#defineROWS9//棋盘
#defineCOLS9
#defineTHUNDER10//雷数

voidArr_init(charmine[ROW][COL],charshow[ROWS][COLS],introw,intcol,introws,intcols);//数组初始化
voidCol_thu(charmine[ROW][COL],introw,intcol,intthunder);//布置雷
voidPrint_che1(charmine[ROW][COL],introw,intcol);//打印存雷棋盘
voidPrint_che2(charshow[ROWS][COLS],introws,intcols);//打印展示棋盘
charFind_thu(charmine[ROW][COL],charshow[ROWS][COLS],introw,intcol,inti);//找雷
voidNum_mines(charmine[ROW][COL],charshow[ROWS][COLS],intx,inty);//计算输入坐标周围的雷数
voidopen_show(charmine[ROW][COL],charshow[ROWS][COLS],introws,intx,inty);////计算输入坐标及周围的雷数(展开)
#endif//__GAME_H__

test.c //包含主函数,函数调用

#define_CRT_SECURE_NO_WARNINGS1

#include"game.h"

voidmenu()//菜单函数
{
printf("********************\n");
printf("****1.play****\n");
printf("****0.exit****\n");
printf("********************\n");
}

voidgame()//游戏函数
{
inti;
charmine[ROW][COL]={0};//存雷数组
charshow[ROWS][COLS]={0};//展示数组
Arr_init(mine,show,ROW,COL,ROWS,COLS);//数组初始化
Col_thu(mine,ROW,COL,THUNDER);//布置雷
Print_che2(show,ROWS,COLS);//打印展示棋盘
for(i=0;i

game.c //包含函数的定义

#include"game.h"

voidArr_init(charmine[ROW][COL],charshow[ROWS][COLS],introw,intcol,introws,intcols)//数组初始化
{
inti,j;
for(i=0;i=0&&y-1>=0&&x+1<=rows+1&&y+1<=rows+1)//防止越界情况(所有的坐标+1<=rows+1,-1>=0)
{
Num_mines(mine,show,x,y);//返回坐标周围的雷数
}
}
if(mine[x-1][y-1]=='0')//左上角x-1,y-1
{
if(x-2>=0&&y-2>=0&&x<=rows+1&&y<=rows+1)
{
Num_mines(mine,show,x-1,y-1);
}
}

if(mine[x-1][y]=='0')//上x-1,y
{
if(x-2>=0&&y-1>=0&&x<=rows+1&&y+1<=rows+1)
{
Num_mines(mine,show,x-1,y);
}
}
if(mine[x-1][y+1]=='0')//右上角x-1,y+1
{
if(x-2>=0&&y>=0&&x<=rows+1&&y+2<=rows+1)
{
Num_mines(mine,show,x-1,y+1);
}
}
if(mine[x][y-1]=='0')//左x,y-1
{
if(x-1>=0&&y-2>=0&&x+1<=rows+1&&y<=rows+1)
{
Num_mines(mine,show,x,y-1);
}
}
if(mine[x][y+1]=='0')//右x,y+1
{
if(x-1>=0&&y>=0&&x+1<=rows+1&&y+2<=rows+1)
{
Num_mines(mine,show,x,y+1);
}
}

if(mine[x+1][y-1]=='0')//左下角x+1,y-1
{
if(x>=0&&y-2>=0&&x+2<=rows+1&&y<=rows+1)
{
Num_mines(mine,show,x+1,y-1);
}
}

if(mine[x+1][y]=='0')//下x+1,y
{
if(x>=0&&y-1>=0&&x+2<=rows+1&&y+1<=rows+1)
{
Num_mines(mine,show,x+1,y);
}
}

if(mine[x+1][y+1]=='0')//右下角x+1,y+1
{
if(x>=0&&y>=0&&x+2<=rows+1&&y+2<=rows+1)
{
Num_mines(mine,show,x+1,y+1);
}
}
}
charFind_thu(charmine[ROW][COL],charshow[ROWS][COLS],introw,intcol,inti)//找雷
{
intx,y;
flag1:
printf("请玩家输入坐标");
scanf("%d%d",&x,&y);
flag:
if((x>0&&x<=row-2)&&(y>0&&y<=col-2))//判断输入坐标的正确性
{
if(mine[x][y]=='0')//没找到雷
{
open_show(mine,show,ROWS,x,y);//计算输入坐标及周围的雷数(展开)
return'0';
}
else//找到雷
{
if(i==0)//第一个就找到雷
{
mine[x][y]='0';
while(1)
{
inta,b;
a=rand()%(row-2)+1;
b=rand()%(col-2)+1;
if(mine[a][b]=='0')
{
mine[a][b]='1';
gotoflag;
}
}
}
else
{
show[x-1][y-1]='1';
return'1';
}

}
}
else
{
printf("输入错误\n");
gotoflag1;
}
}

到这里,我们的程序就完成了,我们看看程序的效果

感谢各位的阅读!关于“C语言如何实现扫雷程序”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

发布于 2021-05-30 14:07:43
分享
海报
168
上一篇:C语言如何实现经典24点纸牌益智游戏 下一篇:C语言如何实现简单停车场管理系统
目录

    忘记密码?

    图形验证码