C语言实现简单的扫雷小游戏
本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下
在编写扫雷小游戏之前,第一,我们应该列出我们想要实现的扫雷小游戏的功能:
1.显示选中的坐标周围的雷的个数。
2.保证第一次选中的坐标不是雷。
3.选中的坐标周围8个格子中没有雷,则展开。
第二,我们应该明白我们需要两个棋盘来实现扫雷游戏:一个棋盘用来展示给玩家,初始界面全为“*”(未翻开的格子),这个页面就是我们常见的扫雷页面。另一个棋盘用来给编写者看,棋盘内只有字符‘1'和字符‘0'。‘1'代表雷,‘0'代表非雷。使用字符‘1'‘0'来代表雷和非雷有利于我们下一步计算坐标周围雷的个数。
1.初始化棋盘
nitboard(show_board,ROWS,COLS,'*');//‘*'代表未翻开的坐标
Initboard(mine_board,ROWS,COLS,'0');//‘0'代表非雷
voidInitboard(charboard[ROWS][COLS],introw,intcol,charset)
{
memset(board,set,row*col*sizeof(board[0][0]));
}
2.打印棋盘
voidDisPlayboard(charboard[ROWS][COLS],introw,intcol)
{
inti=0;
intj=0;
printf("");
for(i=1;i<=row;i++)//打印行
{
printf("%d",i);
}
printf("\n");
for(i=1;i<=row;i++)
{
printf("%d",i);//打印列
for(j=1;j<=col;j++)
{
printf("%c",board[i][j]);
}
printf("\n");
}
printf("\n");
}
3.在棋盘中埋入雷。(因为每一次重新开始游戏雷的位置不能重复,所以选择用随机数来埋雷)
voidGetBoom(charboard[ROWS][COLS],introw,intcol)//埋雷
{
intx=0;
inty=0;
intsum=0;
while(1)
{
x=rand()%row+1;//雷放在1-9的范围里
y=rand()%col+1;
if(1)
{
board[x][y]='1';
sum++;
if(sum==M)//埋入雷后跳出循环
{
break;
}
}
}
4.确保第一次不踩到雷,如果第一次踩到雷,我们就将此位置改为非雷,然后将此处的雷移动到别处未放置雷的位置。
(还要考虑一种特殊情况,即如果第一次落子就获得胜利的情况时后面函数就不用再执行了,所以此函数要改为有返回值的函数,这样在调用此函数时就可以判断是否为一次就获得胜利的情况)
intJudge_first(charmine_board[ROWS][COLS],charshow_board[ROWS][COLS],introw,intcol)
{
intx=0;
inty=0;
intm;
intn;
printf("请输入要排查的坐标:");
scanf("%d%d",&x,&y);
while(1)
{
if(mine_board[x][y]=='1')//如果第一次踩雷,将此坐标改为非雷
{
mine_board[x][y]='0';
show_board[x][y]='';
while(1)
{
m=rand()%9+1;
n=rand()%9+1;
if(m!=x&&n!=y&&mine_board[m][n]!='1')
{
mine_board[m][n]='1';
}
Open(mine_board,show_board,x,y);
if(Full(show_board,ROW,COL)==1)//展开后判断是否一次获得胜利
{
printf("游戏胜利\n");
DisPlayboard(mine_board,ROW,COL);
return2;//一次获得胜利返回2不再执行PlayerMove函数
break;
}
DisPlayboard(show_board,row,col);
break;
}
break;
}
elseif(mine_board[x][y]=='0')
{
show_board[x][y]='';
Open(mine_board,show_board,x,y);
if(Full(show_board,ROW,COL)==1)
{
printf("游戏胜利\n");
DisPlayboard(mine_board,ROW,COL);
return2;
break;
}
DisPlayboard(show_board,row,col);
break;
}
}
}
5.当坐标周围雷个数为0时,展示周围格子,再以X和Y周围八个坐标分别为中心展开,当坐标周围有雷时不再递归展开,并将雷的个数放在该坐标。
voidOpen(charmine_board[ROWS][COLS],charshow_board[ROWS][COLS],intx,inty)
{
intret=0;
ret=Num(mine_board,x,y);
if(ret==0)//当坐标周围雷个数为0时打开周围格子再以X和Y周围八个坐标为中心展开重复即为递归展开
{
show_board[x][y]='';
if(x-1>0&&y-1>0&&show_board[x-1][y-1]=='*')
{
Open(mine_board,show_board,x-1,y-1);
}
if(x-1>0&&y>0&&show_board[x-1][y]=='*')
{
Open(mine_board,show_board,x-1,y);
}
if(x-1>0&&y+1<=COL&&show_board[x-1][y+1]=='*')
{
Open(mine_board,show_board,x-1,y+1);
}
if(x>0&&y+1<=COL&&show_board[x][y+1]=='*')
{
Open(mine_board,show_board,x,y+1);
}
if(x+10&&show_board[x+1][y]=='*')
{
Open(mine_board,show_board,x+1,y);
}
if(x+1<=ROW&&y-1>0&&show_board[x+1][y-1]=='*')
{
Open(mine_board,show_board,x+1,y-1);
}
if(x>0&&y-1>0&&show_board[x][y-1]=='*')
{
Open(mine_board,show_board,x,y-1);
}
}
elseif(ret!=0)
show_board[x][y]=Num(mine_board,x,y)+48;
}
6.计算坐标周围一圈中所含雷的个数。
intNum(charboard[ROWS][COLS],intx,inty)
{
intsum=0;//sum为坐标周围雷的个数
sum=board[x-1][y-1]
+board[x][y-1]+board[x+1][y-1]
+board[x+1][y]+board[x+1][y+1]
+board[x][y+1]+board[x-1][y+1]
+board[x-1][y]-(8*'0');
returnsum;
}
7.判断玩家是否排完所有雷。
intFull(charboard[ROWS][COLS],introw,intcol)
{
inti;
intj;
intsum=0;//sum为棋盘未翻开格子的个数
for(i=1;i<=row;i++)
{
for(j=1;j<=col;j++)
{
if(board[i][j]=='*')
sum++;
}
}
if(sum==M)//当未翻开的格子数为雷数时返回1
return1;
}
8.玩家输入坐标扫雷。
voidPlayerMove(charmine_board[ROWS][COLS],charshow_board[ROWS][COLS],introw,intcol)
{
intx=0;
inty=0;
intret=0;
while(1)
{
if(Full(show_board,ROW,COL)==1)//棋盘未翻开格子等于雷数时玩家胜利
{
printf("游戏胜利\n");
DisPlayboard(mine_board,ROW,COL);
break;
}
printf("请输入坐标:");
scanf("%d%d",&x,&y);
if(x>=1&&x<=row&&y>=1&&y<=col)
{
if(mine_board[x][y]=='1')//玩家踩到雷,游戏结束
{
printf("游戏结束\n");
DisPlayboard(mine_board,ROW,COL);
break;
}
ret=Num(mine_board,x,y);
if(ret==0)//周围没有雷时,展开周围格子
{
Open(mine_board,show_board,x,y);
DisPlayboard(show_board,ROW,COL);
}
elseif(ret!=0)//周围有雷时打印雷的个数
{
show_board[x][y]=ret+48;
DisPlayboard(show_board,ROW,COL);
}
}
else
printf("输入错误,请重新输入");
}
}
9.函数声明,宏定义,函数的定义实现,测试。
源文件:test.c//主要负责测试整个代码
头文件:game.h//包含函数各种声明,宏定义
源文件:game.c//包含各种函数的定义
test.c
#include"game.h"
voidmenu()
{
printf("************************************\n");
printf("************************************\n");
printf("*******1.play*******\n");
printf("*******0.exit*******\n");
printf("************************************\n");
}
intgame()
{
charshow_board[ROWS][COLS]={0};
charmine_board[ROWS][COLS]={0};
//
Initboard(show_board,ROWS,COLS,'*');//初始化数组
Initboard(mine_board,ROWS,COLS,'0');
printf("游戏开始\n");
DisPlayboard(show_board,ROW,COL);//打印玩家雷盘
//
GetBoom(mine_board,ROW,COL);//埋雷
printf("\n\n\n");
DisPlayboard(mine_board,ROW,COL);//打印雷盘
//
if(Judge_first(mine_board,show_board,ROW,COL)==2)//如果一次胜利,就不再执行PlayerMove函数
return2;
//
PlayerMove(mine_board,show_board,ROW,COL);
}
voidtest()
{
intn;
menu();
do
{
printf("请输入选项按钮:");
scanf("%d",&n);
switch(n)
{
case1:
game();
break;
case0:
printf("游戏退出\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
}while(1);
}
intmain()
{
srand((unsignedint)time(NULL));
test();
}
game.c
#include"game.h"
voidInitboard(charboard[ROWS][COLS],introw,intcol,charset)
{
memset(board,set,row*col*sizeof(board[0][0]));
}
voidDisPlayboard(charboard[ROWS][COLS],introw,intcol)
{
inti=0;
intj=0;
printf("");
for(i=1;i<=row;i++)//打印行
{
printf("%d",i);
}
printf("\n");
for(i=1;i<=row;i++)
{
printf("%d",i);//打印列
for(j=1;j<=col;j++)
{
printf("%c",board[i][j]);
}
printf("\n");
}
printf("\n");
}
voidGetBoom(charboard[ROWS][COLS],introw,intcol)//埋雷
{
intx=0;
inty=0;
intsum=0;
while(1)
{
x=rand()%row+1;//雷放在1-9的范围里
y=rand()%col+1;
if(1)
{
board[x][y]='1';
sum++;
if(sum==M)//埋入所需的雷后跳出循环
{
break;
}
}
}
}
intJudge_first(charmine_board[ROWS][COLS],charshow_board[ROWS][COLS],introw,intcol)
{
intx=0;
inty=0;
intm;
intn;
printf("请输入要排查的坐标:");
scanf("%d%d",&x,&y);
while(1)
{
if(mine_board[x][y]=='1')//如果第一次踩雷,将此坐标改为非雷
{
mine_board[x][y]='0';
show_board[x][y]='';
while(1)
{
m=rand()%9+1;
n=rand()%9+1;
if(m!=x&&n!=y&&mine_board[m][n]!='1')
{
mine_board[m][n]='1';
}
Open(mine_board,show_board,x,y);
if(Full(show_board,ROW,COL)==1)//展开后判断是否一次获得胜利
{
printf("游戏胜利\n");
DisPlayboard(mine_board,ROW,COL);
return2;//一次获得胜利返回2不再执行PlayerMove函数
break;
}
DisPlayboard(show_board,row,col);
break;
}
break;
}
elseif(mine_board[x][y]=='0')
{
show_board[x][y]='';
Open(mine_board,show_board,x,y);
if(Full(show_board,ROW,COL)==1)
{
printf("游戏胜利\n");
DisPlayboard(mine_board,ROW,COL);
return2;
break;
}
DisPlayboard(show_board,row,col);
break;
}
}
}
voidPlayerMove(charmine_board[ROWS][COLS],charshow_board[ROWS][COLS],introw,intcol)
{
intx=0;
inty=0;
intret=0;
while(1)
{
if(Full(show_board,ROW,COL)==1)//棋盘下满玩家胜利
{
printf("游戏胜利\n");
DisPlayboard(mine_board,ROW,COL);
break;
}
printf("请输入坐标:");
scanf("%d%d",&x,&y);
if(x>=1&&x<=row&&y>=1&&y<=col)
{
if(mine_board[x][y]=='1')
{
printf("游戏结束\n");
DisPlayboard(mine_board,ROW,COL);
break;
}
ret=Num(mine_board,x,y);
if(ret==0)//周围没有雷时,展开周围格子
{
Open(mine_board,show_board,x,y);
DisPlayboard(show_board,ROW,COL);
}
elseif(ret!=0)//周围有雷时打印雷的个数
{
show_board[x][y]=ret+48;
DisPlayboard(show_board,ROW,COL);
}
}
else
printf("输入错误,请重新输入");
}
}
voidOpen(charmine_board[ROWS][COLS],charshow_board[ROWS][COLS],intx,inty)
{
intret=0;
ret=Num(mine_board,x,y);
if(ret==0)//当坐标周围雷个数为0时打开周围格子再以X和Y周围八个坐标为中心展开重复即为递归展开
{
show_board[x][y]='';
if(x-1>0&&y-1>0&&show_board[x-1][y-1]=='*')
{
Open(mine_board,show_board,x-1,y-1);
}
if(x-1>0&&y>0&&show_board[x-1][y]=='*')
{
Open(mine_board,show_board,x-1,y);
}
if(x-1>0&&y+1<=COL&&show_board[x-1][y+1]=='*')
{
Open(mine_board,show_board,x-1,y+1);
}
if(x>0&&y+1<=COL&&show_board[x][y+1]=='*')
{
Open(mine_board,show_board,x,y+1);
}
if(x+10&&show_board[x+1][y]=='*')
{
Open(mine_board,show_board,x+1,y);
}
if(x+1<=ROW&&y-1>0&&show_board[x+1][y-1]=='*')
{
Open(mine_board,show_board,x+1,y-1);
}
if(x>0&&y-1>0&&show_board[x][y-1]=='*')
{
Open(mine_board,show_board,x,y-1);
}
}
elseif(ret!=0)
show_board[x][y]=Num(mine_board,x,y)+48;
}
intNum(charboard[ROWS][COLS],intx,inty)
{
intsum=0;
sum=board[x-1][y-1]
+board[x][y-1]+board[x+1][y-1]
+board[x+1][y]+board[x+1][y+1]
+board[x][y+1]+board[x-1][y+1]
+board[x-1][y]-(8*'0');
returnsum;
}
intFull(charboard[ROWS][COLS],introw,intcol)
{
inti;
intj;
intsum=0;
for(i=1;i<=row;i++)
{
for(j=1;j<=col;j++)
{
if(board[i][j]=='*')
sum++;
}
}
if(sum==M)
return1;
}
game.h
#define_CRT_SECURE_NO_WARNINGS #include#include #include #include #defineROW9 #defineCOL9 #defineROWSROW+2 #defineCOLSCOL+2 #defineM10//所需雷的个数 voidtest(); intgame(); voidInitboard(charboard[ROWS][COLS],introw,intcol,intset);//初始化数组 voidDisPlayboard(charboard[ROWS][COLS],introw,intcol);//打印雷盘 voidGetBoom(charboard[ROWS][COLS],introw,intcol);//安放炸弹 intJudge_first(charmine_board[ROWS][COLS],charshow_board[ROWS][COLS],introw,intcol);//保证第一次不是雷 voidPlayerMove(charmine_board[ROWS][COLS],charshow_board[ROWS][COLS],introw,intcol);//玩家排雷 voidOpen(charmine_board[ROWS][COLS],charshow_board[ROWS][COLS],intx,inty);//展开函数 intNum(charmine_board[ROWS][COLS],intx,inty);//计算坐标周围雷的数量 intFull(charboard[ROWS][COLS],introw,intcol);//判断雷是否下满 
更多有趣的经典小游戏实现专题,分享给大家:
C++经典小游戏汇总
python经典小游戏汇总
python俄罗斯方块游戏集合
JavaScript经典游戏玩不停
java经典小游戏汇总
javascript经典小游戏汇总
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
