C++学习心得之扫雷游戏
本文实例为大家分享了C++实现扫雷游戏的具体代码,供大家参考,具体内容如下
一、序言
创建一个9*9有10个雷的扫雷游戏
文章的顺序是按照我当时的编程顺序写的,顺便写下我当初的一点思路,总的代码在文章最后,前面的都是分散的函数,有需要的朋友直接复制最后的
二、创建
创建一个头文件,一个放游戏的程序,一个放运行测试的程序
#define_CRT_SECURE_NO_WARNINGS1 #include//生成随机数 #include #include //生成时间戳 #defineROW9//行数 #defineCOL9//列数 #defineROWSROW+2 #defineCOLSCOL+2 #defineEASY10//雷数 voidInitBoard(charboard[ROWS][COLS],introws,intcols,charset);//初始函数 voidDisplayBoard(charboard[ROWS][COLS],introw,intcol);//展示函数 voidSetBoard(charboard[ROWS][COLS],introw,intcol);//造雷函数 voidCheckBoard(charmine[ROWS][COLS],charshow[ROWS][COLS],introw,intcol);//扫描函数
三、选择界面
进入游戏,可能出现情况三种,分别是退出,游戏和输入错误
也许有人一局完了还想玩,所以要设置循环,写完代码可以运行一下,避免最后出bug范围太大
#include"game.h"
voidtest()
{
intinput=0;
do
{
menu();
printf("inputchoice:>");
scanf("%d",&input);
switch(input)
{
case0:
printf("over\n");
break;
case1:
game();
break;
default:
printf("inputwrong\n");
break;
}
}while(input);
}
voidmenu()
{
printf("*********************\n");
printf("*******1.game******\n");
printf("******0.over******\n");
printf("*********************\n");
}
intmain()
{
test();
return0;
}
四、游戏部分
1、声明变量和初始化
建立存储扫雷的元素的数组,这里咱们可以设置两个字符形数组,一个是标识着炸弹‘1'的mine数组,一个是用来给玩家展示的show数组
虽然是99的大小,但是在之后要由电脑扫描咱们选中点周围的区域,如果数组为9行9列,电脑在扫描最外面一行时就跟中间的部分不一样了,为了方便,咱们建立1111的数组
voidgame()
{
srand((unsigned)time(NULL));//这里使用了time.h制造时间戳,以便随机生成数
charmine[ROWS][COLS];
charshow[ROWS][COLS];
InitBoard(mine,ROWS,COLS,'0');
InitBoard(show,ROWS,COLS,'*');
DisplayBoard(show,ROW,COL);
SetBoard(mine,ROW,COL);
CheckBoard(mine,show,ROW,COL);
}
voidInitBoard(charboard[ROWS][COLS],introws,intcols,charset)
{
inti=0;
intj=0;
for(i=0;i
2、展示函数
申明和定义好变量,肯定要让玩家看到游戏盘的变化情况才能玩,所以写一个展示函数
mine数组中炸弹用‘1'来表示,不是炸弹用‘0'表示,show数组中我们用‘*'表示一个区域,然后选中的点要是周围无炸弹,就是‘',否则就标识出周围的炸弹数。
voidDisplayBoard(charboard[ROWS][COLS],introw,intcol)
{
inti=0;
intj=0;
printf("----------------------------");
printf("\n");
for(i=0;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("----------------------------");
printf("\n");
}
3、造炸弹
这里咱们在头文件定义炸弹数,以后想玩多点炸弹,修改一个数就行,方便快捷
voidSetBoard(charboard[ROWS][COLS],introw,intcol)
{
intx=0;
inty=0;
intnum=EASY;
while(num)
{
x=rand()%ROW+1;
y=rand()%COL+1;
if(board[x][y]=='0')
{
board[x][y]='1';
num--;
}
}
}
4、扫描函数
进入游戏,玩家只有选择了要检查的点才能继续,这里有三种情况,因为要有很多次选择,所以采用循环
(1)选中雷区,那么直接跳出循环,游戏结束
(2)没选中雷区,电脑会扫描周围的区域,把周围无雷的点展开,展开周围有雷的点
这里还要说一下mine数组为什么要用‘0'和‘1'来做标记,因为0和1这两个字符在ascII码表里是连续的,一会在电脑扫描周围时可以直接通过减法算出周围的雷数
voidCheckBoard(charmine[ROWS][COLS],charshow[ROWS][COLS],introw,intcol)
{
intret=0;
intx=0;
inty=0;
intnum=0;
while(ret0&&x<=row&&y>0&&y<=col)
{
if(mine[x][y]=='1')//选中雷区,游戏结束
{
printf("炸死\n");
DisplayBoard(mine,row,col);//展示mine区域
break;//跳出循环
}
else//没踩中雷区
{
ZeroLine(mine,show,x,y);//展开周围的区域
DisplayBoard(show,row,col);
ret++;
}
}
else
{
printf("inputwrong\n");
}
}
if(ret==ROW*COL-EASY)
{
printf("胜利\n");
}
}
voidZeroLine(charmine[ROWS][COLS],charshow[ROWS][COLS],intx,inty)
{
intret=0;
ret=AroundNum(mine,x,y);//扫描函数,扫描该点周围雷数
if(x>=0&&y>=0&&x
五、总代码
1、头文件
#define_CRT_SECURE_NO_WARNINGS1
#include
#include
#include
#defineROW9
#defineCOL9
#defineROWSROW+2
#defineCOLSCOL+2
#defineEASY10
voidInitBoard(charboard[ROWS][COLS],introws,intcols,charset);
voidDisplayBoard(charboard[ROWS][COLS],introw,intcol);
voidSetBoard(charboard[ROWS][COLS],introw,intcol);
voidCheckBoard(charmine[ROWS][COLS],charshow[ROWS][COLS],introw,intcol);
2、游戏部分
#include"game.h"
voidInitBoard(charboard[ROWS][COLS],introws,intcols,charset)
{
inti=0;
intj=0;
for(i=0;i=0&&y>=0&&x0&&x<=row&&y>0&&y<=col)
{
if(mine[x][y]=='1')
{
printf("炸死\n");
DisplayBoard(mine,row,col);
break;
}
else
{
ZeroLine(mine,show,x,y);
DisplayBoard(show,row,col);
ret++;
}
}
else
{
printf("inputwrong\n");
}
}
if(ret==ROW*COL-EASY)
{
printf("胜利\n");
}
}
3、检测部分
#include"game.h"
voidmenu()
{
printf("*********************\n");
printf("*******1.game******\n");
printf("******0.over******\n");
printf("*********************\n");
}
voidgame()
{
srand((unsigned)time(NULL));
charmine[ROWS][COLS];
charshow[ROWS][COLS];
InitBoard(mine,ROWS,COLS,'0');
InitBoard(show,ROWS,COLS,'*');
DisplayBoard(show,ROW,COL);
SetBoard(mine,ROW,COL);
CheckBoard(mine,show,ROW,COL);
}
voidtest()
{
intinput=0;
do
{
menu();
printf("inputchoice:>");
scanf("%d",&input);
switch(input)
{
case0:
printf("over\n");
break;
case1:
game();
break;
default:
printf("inputwrong\n");
break;
}
}while(input);
}
intmain()
{
test();
return0;
}
更多精彩游戏小代码,请点击《游戏专题》阅读
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。