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;
}
}
到这里,我们的程序就完成了,我们看看程序的效果
以上就是一个简单的扫雷程序,多有不足之处,还望指教。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。