本文附赠源代码,欢迎白嫖~

本篇文章目录

  • (一) 扫雷的c++实现方式
    • 1.1 实现方式
    • 1.2 代码细节
      • 1.2.1 完成时间的计算
      • 1.2.2 地雷图的随机性
      • 1.2.3 关于游戏的合理性和流畅度
      • 1.2.3 键盘的操作与控制
    • 1.3 注意事项
      • 1.3.1 如何解决屏闪的问题
      • 1.3.2 玩家试错的机会
  • (二)游戏体验
    • 2.1 游戏完整源代码
    • 2.2 游戏画面
    • 2.3 游戏教程
  • (三)总结

(一) 扫雷的c++实现方式

1.1 实现方式

扫雷,顾名思义就是在一片未知的区域寻找在其中的隐藏的地雷,每开启一个格点,如果这个点中不是雷,就能够知道其周围八个点中所蕴含的地雷总数。

当最终找到所有地雷的位置或者在这个过程中不慎踩到了地雷,游戏结束exit(0);

1.2 代码细节

1.2.1 完成时间的计算

当玩家扫雷成功时,这时需返回玩家单轮游戏的用时,实现方法:在玩家开启第一个雷时,标记t1=time(0);;在玩家扫雷成功时,标记t2=time(0);。最后,输出t2-t1就是总时间了。

1.2.2 地雷图的随机性

地雷的地图时用二维数组实现的,而玩家的每一轮游戏的地图都必须是不同的,因此,要用srand(time(NULL));以及rand()% x来实现。

1.2.3 关于游戏的合理性和流畅度

举个栗子:在10x10的扫雷地图中,若有99个雷,这时选中正确的概率非常低。为了避免这种情况,游戏的地图大小和雷的个数要由玩家自由决定,并且保证游戏的难度,地雷数目要在一定的范围内。

流畅度 -> 游戏转换的间隔(时间过渡)。Sleep(t)t为时间,以ms为单位。

1.2.3 键盘的操作与控制

游戏过程中选择格点需要用键盘来选择,并非输入。
实现方式:

  1. 头文件#include<conio.h>
  2. 调用Windows的system部分
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo(handle,&CursorInfo);//获取控制台光标信息     CursorInfo.bVisible = false; //隐藏控制台光标
  1. 判断char c=gecth()

1.3 注意事项

1.3.1 如何解决屏闪的问题

频闪是由system("cls")产生的,在运行时,会先清空屏幕,再输出内容,导致频闪。
解决方法:

SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态

1.3.2 玩家试错的机会

为了避免玩家在第一步踩到雷,游戏结束。游戏设置会给予玩家一次复活的机会,继续游戏。

(二)游戏体验

2.1 游戏完整源代码

#include <bits/stdc++.h>
#include <windows.h>
#include <conio.h>
using namespace std;
const int p[8][2]= {{0,1},{1,0},{-1,0},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
char c;
char xmp[21][21];
int mp[21][21],n,m,k,t1,t2;
bool mpb[21][21],bo[21][21];
void dfs0(int x,int y) {mpb[x][y]=1;for(int i=0; i<8; i++) {if(x+p[i][0]<1 || x+p[i][0]>n || y+p[i][1]<1 || y+p[i][1]>m)continue;if(mp[x+p[i][0]][y+p[i][1]]==0) {xmp[x+p[i][0]][y+p[i][1]]='0';if(!mpb[x+p[i][0]][y+p[i][1]])dfs0(x+p[i][0],y+p[i][1]);}if(mp[x+p[i][0]][y+p[i][1]]>0)xmp[x+p[i][0]][y+p[i][1]]=mp[x+p[i][0]][y+p[i][1]]+'0';}return;
}
void bai(int x,int y) {system("cls");if(bo[x][y])return;bo[x][y]=1;system("color C");for(int k=1; k<=19; k++) {Sleep(260);system("cls");for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) {cout<<xmp[i][j]<<" ";if(xmp[i][j]=='*')xmp[i][j]='_';}cout<<endl<<endl;}int j=y+k;for(int i=x-k; i<=x+k; i++) {if(i<1 || i>n || j<1 || j>m)continue;if(mp[i][j]==-1) {xmp[i][j]='*';for(int l=0; l<8; l++)xmp[i+p[l][0]][j+p[l][1]]='_';}}j=y-k;for(int i=x-k; i<=x+k; i++) {if(i<1 || i>n || j<1 || j>m)continue;if(mp[i][j]==-1) {xmp[i][j]='*';for(int l=0; l<8; l++)xmp[i+p[l][0]][j+p[l][1]]='_';}}int i=x+k;for(int j=x-k; j<=x+k; j++) {if(i<1 || i>n || j<1 || j>m)continue;if(mp[i][j]==-1) {xmp[i][j]='*';for(int l=0; l<8; l++)xmp[i+p[l][0]][j+p[l][1]]='_';}}i=x-k;for(int j=x-k; j<=x+k; j++) {if(i<1 || i>n || j<1 || j>m)continue;if(mp[i][j]==-1) {xmp[i][j]='*';for(int l=0; l<8; l++)xmp[i+p[l][0]][j+p[l][1]]='_';}}}system("pause");system("color 7");
}
void win() {t2=time(0);for(int k=1; k<=n; k++) {Sleep(150);system("cls");for(int i=1; i<=m; i++) {if(mp[k-1][i]>0)xmp[k-1][i]=mp[k-1][i]+'0';elsexmp[k-1][i]='*';xmp[k][i]=45;}for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++)cout<<xmp[i][j]<<" ";cout<<endl<<endl;}}system("cls");cout<<"游戏成功,总共用时:"<<t2-t1<<"秒"<<endl<<endl;system("pause");system("cls");
}
void game() {memset(mp,0,sizeof mp);memset(mpb,0,sizeof mpb);while(1) {system("cls");cout<<"请输入长: ( >=5,<=20 )"<<endl;cin>>m;if(m<5 || m>20) {cout<<"您输入的数太大或太小了!重新输入"<<endl;Sleep(1200);} elsebreak;}while(1) {system("cls");cout<<"请输入宽: ( >=5,<=12 )"<<endl;cin>>n;if(n<5 || n>12) {cout<<"您输入的数太大或太小了!重新输入"<<endl;Sleep(1200);} elsebreak;}while(1) {system("cls");cout<<"请输入雷数: ( >=5,<="<<n*m-5<<" )"<<endl;cin>>k;if(k<5 || k>n*m-5) {cout<<"您输入的数太大或太小了!重新输入";Sleep(1200);} elsebreak;}system("cls");for(int i=1; i<=3; i++) {cout<<"正在初始化.";Sleep(280);cout<<".";Sleep(280);cout<<".";Sleep(280);system("cls");}srand((unsigned)time(NULL));for(int i=1; i<=k; i++) {int x=rand()%n+1,y=rand()%m+1;if(mp[x][y]==-1) {i--;continue;} elsemp[x][y]=-1;}for(int i=1; i<=n; i++)for(int j=1; j<=m; j++) {if(mp[i][j]==-1)continue;for(int k=0; k<8; k++)if(mp[i+p[k][0]][j+p[k][1]]==-1)mp[i][j]++;}char s[21][21];for(int i=1; i<=20; i++)for(int j=1; j<=20; j++) {s[i][j]=' ';xmp[i][j]=22;}int x=1,y=1,sum=0;bool o=0,f=0,fir=0;while(1) {sum=0;system("cls");s[x][y]='<';for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) {if(xmp[i][j]==127)sum++;cout<<xmp[i][j]<<s[i][j];}cout<<endl<<endl;}cout<<"剩余雷数: "<<k-sum;if(o) {Sleep(2000);bai(x,y);system("cls");cout<<"游戏失败!";Sleep(2500);system("cls");return;}c=getch();switch(c) {case 'w': {s[x][y]=' ';if(--x<1)x=n;break;}case 's': {s[x][y]=' ';if(++x>n)x=1;break;}case 'a': {s[x][y]=' ';if(--y<1)y=m;break;}case 'd': {s[x][y]=' ';if(++y>m)y=1;break;}case 'j': {if(!fir) {t1=time(0);fir=1;}if(mp[x][y]==-1) {if(!f) {f=1;cout<<endl<<"您的rp太低,这是个雷!(仅提醒一次)";Sleep(2000);} else {xmp[x][y]='*';o=1;}}if(mp[x][y]==0) {xmp[x][y]='0';dfs0(x,y);}if(mp[x][y]>0)xmp[x][y]=mp[x][y]+'0';bool bo=0;for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) {if(mp[i][j]==-1)continue;if(xmp[i][j]!=mp[i][j]+'0')bo=1;}}if(bo)break;win();return;}case 'k': {if(xmp[x][y]==22) {xmp[x][y]=127;break;}if(xmp[x][y]==127) {xmp[x][y]='?';break;}xmp[x][y]=22;break;}}}
}
int main() {HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo(handle,&CursorInfo);//获取控制台光标信息     CursorInfo.bVisible = false; //隐藏控制台光标SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态cout<<"                           ----欢迎您来到扫雷----";Sleep(2500);system("cls");for(int i=1; i<=2; i++) {cout<<"加载中.";Sleep(300);cout<<".";Sleep(300);cout<<".";Sleep(300);system("cls");}string s[3]= {" "," "," "};int now=0;while(1) {s[now]='<';cout<<"自定义游戏 "<<s[0]<<endl;cout<<"游戏教程 "<<s[1]<<endl;cout<<"退出 "<<s[2]<<endl<<endl;cout<<"ws上下控制,j确定";c=getch();system("cls");switch(c) {case 'w': {s[now]=' ';if(--now<0)now=3;break;}case 's': {s[now]=' ';if(++now>3)now=0;break;}case 'j': {if(now==0)game();if(now==1) {system("cls");cout<<"wasd控制选中的单元格"<<endl;cout<<"j翻开单元格,k标记地雷格格"<<endl;cout<<"第一次翻到雷会给出一次提醒"<<endl<<endl;cout<<"如果您运气实在太差"<<endl;cout<<"翻出的是无法判断雷的图"<<endl;cout<<"接下来就看脸 ^_^"<<endl<<endl;system("pause");system("cls");}if (now==2)return 0;break;}}}
}

2.2 游戏画面

画面设计不够美观,请谅解!!



2.3 游戏教程

  • wasd控制选中的单元格

  • j翻开单元格,k标记地雷格格

  • 第一次翻到雷会给出一次提醒

具体请见游戏内教程

(三)总结

这是一项智力游戏,同时考验了开发者的代码能力,看似非常简单,但实际上有很多细节需要考虑。

爆肝3天,代码白嫖,点赞请留下,ThankThankThank you♪(・ω・)ノyou♪(・ω・)ノyou♪(・ω・)ノ

C++扫雷小游戏(附赠源代码)相关推荐

  1. html实现扫雷小游戏(附源码)

    文章目录 实现功能 1.扫雷设计 1.1 主界面 1.2 扫雷难度 1.3 附带功能 2.效果和源码 2.1 动态效果 2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blo ...

  2. 弹球小游戏附全源代码

    GUI实现弹球小游戏 先看一下游戏效果图. 一个简单的Demo.也比较简单,新手试着做一做完善改进. 源代码 import Com.Style.FontStyle; import javax.swin ...

  3. 用C语言实现扫雷小游戏(附上思路+项目展示+源代码)

    文章目录 前言 一.扫雷小游戏整体思路讲解. 二.game.c各游戏功能函数的讲解 1.InitBoard 初始化数组函数讲解 2.DisplayBoard 打印格子函数讲解 3.Setmine 电脑 ...

  4. 用C语言实现一个简单的扫雷小游戏(附全代码及教程)

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下: 首先,创建一个text.c文件: 编写主函数: int main() {test();return 0; } 定义test ...

  5. C语言编写扫雷小游戏

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/104992377 扫 ...

  6. 扫雷html5简单初级,纯原生JS用面向对象class方法实现简易扫雷小游戏

    Demo介绍 纯原生js 实现 且用ES6语法class写的扫雷小游戏:布局为10*10的网格,随机生成10-20个雷. 左键点击扫雷.右键标记该地方有雷.该demo下载下来复制到html文件中直接可 ...

  7. JAVA简单实现扫雷小游戏

    JAVA简单实现扫雷小游戏 这两天学校外面来人教java基础,学习一下,自己试着做了一个扫雷小游戏,记录一下子学习过程.(我觉得自己不是很懂类和对象,基础没怎么看),敲出来的代码结构混乱,希望路过的大 ...

  8. JS扫雷小游戏(DOM (html+css+js))

    一:效果图: 二:资源 js扫雷小游戏源代码下载地址 js贪吃蛇小游戏链接 python小黄脸大战小游戏链接 vue高仿网易云音乐app 三:源代码: html部分: <!DOCTYPE htm ...

  9. 经典Windows 扫雷小游戏源码 展示

    这个扫雷小游戏是通过Easy X实现,Easy X是很多小萌新手在学习的时候用到的一个绘图工具,想必大家对他已经很熟悉了. 所以如果有小伙伴感兴趣的话,可以联系我获取Easy X的安装程序及其源代码. ...

  10. 纯原生JS用面向对象class方法实现简易扫雷小游戏

    Demo介绍 纯原生js 实现 且用ES6语法class写的扫雷小游戏:布局为10*10的网格,随机生成10-20个雷. 左键点击扫雷.右键标记该地方有雷.该demo下载下来复制到html文件中直接可 ...

最新文章

  1. v3 微信api 请求微信_企业微信API使用基本教程
  2. java多线程问题 Runnable和Callable有什么不同?
  3. Confluence 6 自定义 Decorator 模板的宏和针对高级用户
  4. Spring JPA 中的Repository体系
  5. Redis的备份与恢复
  6. 哈尔滨大学计算机和金融,山东153所大学最新排名,46所公办本科,看看有你喜欢的吗...
  7. php自动加载原理,php中的自动加载类机制原理
  8. FinCEN就非托管加密钱包报告规则征集意见时间将截至今日12时59分
  9. /proc/meminfo之谜
  10. 来,创建一个高效的IMEI编码生成器
  11. 西安电子科技大学计算机本校好考吗,西安电子科技大学:除了计算机和通信工程,这些专业高考也很热门...
  12. 借助云开发实现小程序列表页(包含json数据的请求和解析)
  13. R语言—Shiny框架
  14. cf C. Counting Kangaroos is Fun
  15. IOS调起app的终极方法:Universal Links
  16. Ubuntu 下的nis认证
  17. advice的五种类型
  18. HTML怎么建立两行四列的li,关于CSS如何实现多行多列布局的方法
  19. android+插入一条短信,android添加一条短信记录
  20. PA ics2018 pa0

热门文章

  1. vue使用echarts图表渲染异常本地正常,线上时有时无的渲染
  2. su 与 su - 的区别
  3. 防关联软件技术分析之跨境电商防关联云服务器之超级VPS管理器
  4. 开源组件安全漏洞检测主流工具对比
  5. 南华大学计算机全国排名多少位,华南理工大学全国排名第几位
  6. EMQX的Web管理后台-Dashboard
  7. 好员工为什么离你而去
  8. springboot2集成shiro认证鉴权(上篇)
  9. mysql消除冗余_mysql剔除冗余数据
  10. WebDriver Sierra 10.12.3 N卡驱动