/*
*前些天,没事玩扫雷,发现无雷区域展开很像优先搜索,索性google了一下,果然不出所料,
*用到得算法就是BFS,正好这阵子看了一点hge游戏引擎设计,就写了一个hge下的扫雷小
*游戏*/
好了开始说思路了
1.首要写一个棋盘(20*20个正方形),由二维结构体数组便可实现
struct node1
{
int x,y;                       //x,y 是真实的物理坐标
int flag;                      //flag=1 有雷 =0 无雷
int around;                    //该点周围雷数
bool shownumber;               //是否显示周围雷数
};
node1 Node[N][N];                        //N=20
另外用 bool used[N][N]; 来标记是否被访问过
再定义一个辅助方向二维数组,用来遍历当前位置周围8个位置是否有雷及个数
int dir[8][2] = 
{
{-1, 0}, {1, 0}, {0, -1}, {0, 1}, 
{-1, -1}, {-1, 1}, {1, -1}, {1, 1}
};                                  
static int   leinumber;                 //总雷数     
static int  counter;                    //记录被用户标记的雷个数
float   x,y;                           //获得鼠标坐标
bool Flag[N][N];                        //记录用户标记的雷的位置
这样基本准备工作就做完了
2.雷盘得初始化
可先将雷盘统一设置为无雷
used[i][j]=0;
Node[i][j].around=0;                                  
Node[i][j].x=j*20;                    //每个单元大小为20像素
Node[i][j].y=i*20;                    //平铺雷盘
Node[i][j].flag=0;
Node[i][j].shownumber=false;
由于雷毕竟少,可以在此时点对点布雷,可用随机数函数产生列号
for(t=0;t<3;t++)
{
int j=rand()%15+3;                //每行3个雷
Node[i][j].flag=1;
}
//统计总雷数
for(i=2;i<N-2;i++)
for(j=2;j<N-2;j++)
{
if(Node[i][j].flag==1);
leinumber++;                
}
3.核心程序
其实扫雷最为主要得就是实现无雷区域的展开,何时继续何时停止最关键,要不然很容易死循环
所以标记二维数组used[][]很重要!!!,
下面模拟一下人机交互过程,简单的想象一下:
0)初始化,雷藏与地面下,等待用户点选
1)用户触发一块区域,有雷,无雷两种情况(左击)
若有雷,终止游戏
若无雷,搜索周围8个位置是否有雷,有雷则Node[x][y].around++,若点击位置周围没有雷 
把当前位置进队列,然后把8个位置也进队列,在对这些位置进行同样的检索,直到其周围有雷
或碰到边界为止。
2)右键操作
和平常一样,右击一次标红旗表示有雷,再次撤销
3)判断过程
当用户标记的红旗数和规定的相等时,进行Examine操作,如果标记位置,正确...错误....              
下面看代码:
//无雷区域展开算法
//x,y经由鼠标坐标转化而来,映射到雷盘上的二维数组
void BFS(int x,int y)
{
if(Flag[x][y]==true) return;                           //点击位置 被访问过就不做反应了  
if(Node[x][y].flag==1)                                 //点到雷,就挂了
{
MessageBox(NULL, "Sorry,failed", "", MB_OK | MB_ICONERROR | MB_APPLMODAL);
return ;
}
queue<node1 > my_que;                                  //临时队列,存放扩展源中心
node1 cur,que;                                         //cur 当前位置  que  周围位置
cur.x = x;
cur.y = y;
cur.around=0;
used[cur.x][cur.y]=true;
my_que.push(cur);
while (!my_que.empty())
{
cur = my_que.front();
my_que.pop();
for (int i = 0; i < 8; ++i)
{
que.x = cur.x + dir[i][0];
que.y = cur.y + dir[i][1];
//边界判断
if ((que.x >= 2 && que.x < N-2) &&  (que.y >= 2 && que.y < N-2))
{
if (Node[que.x][que.y].flag == 1)
{
++(cur.around); 
Node[cur.x][cur.y].shownumber=true;
}
}
}
//开始扩展
if (cur.around == 0)
{
used[cur.x][cur.y] = true;//!!! 很重要
for (int i = 0; i < 8; ++i)             //遍历周围8个位置
{
que.x = cur.x + dir[i][0];
que.y = cur.y + dir[i][1];
if (que.x >= 2 && que.x < N-2 && que.y >=2 && que.y < N-2)
{
if (used[que.x][que.y] == false)
{
que.around = 0; 
my_que.push(que);
used[que.x][que.y] = true;
}
}
}
}
//如果当前位置周围有雷,就停止搜索,显示雷数
if (cur.around != 0)
{
Node[cur.x][cur.y].around=cur.around;
Node[cur.x][cur.y].shownumber=true;
used[cur.x][cur.y] = true;
if(Flag[cur.x][cur.y]==true)    
{
Flag[cur.x][cur.y]=false;
counter--;
}
}
}  
下面是关于游戏完成判断的(当leinumber==counter时调用)
bool Examine()
{
bool tag=false;
//表里雷盘排查
for(int i=2;i<N-2;i++)
{
for(int j=2;j<N-2;j++)
{
//两种错误情况:实际有雷用户未标出 , 实际没雷用户错标
if( (Node[i][j].flag==1 && Flag[i][j]==false) || (Node[i][j].flag==0 && Flag[i][j]==true)) 
{
MessageBox(NULL, "The found may has some error!Please check again!", "", MB_OK | MB_ICONERROR | MB_APPLMODAL);
return false;
}
else if(Node[i][j].flag==1 && Flag[i][j]==true)
{
tag=true;
}
}
}
if(tag==true)
return true;
}
以下时是右键标雷操作,没什么好说得了,就是别忘了点击位置要先确定是否已经访问过
void SetFlag(int x,int y)
{
if(used[x][y]==false)
{
if(Flag[x][y]==false)
{
Flag[x][y]=true;
counter++;
//  used[x][y]=true;
}
else
{
Flag[x][y]=false;
counter--;
//used[x][y]=false;
}
}
if(counter==leinumber)
{
if(Examine()==true);
{
MessageBox(NULL, "Congrauations!!!", "", MB_OK | MB_ICONERROR | MB_APPLMODAL);
hge->System_Shutdown();
hge->Release();
}
}
}

差点忘了,上张图吧:

剩下的就是hge引擎的操作了,用到的都是些最基本的函数——加载,释放资源 和渲染,google一下就可以啦~~
在此就不再多说了,想进一步了解hge的 ,可以和下面一起下载
额...还有由于刚刚编译完成,界面还比较简陋,可能还有几个bug,见谅.

下载链接:http://115.com/file/e6mtdath#saolei.zip

转载于:https://www.cnblogs.com/gavindlutsw/archive/2011/11/14/2249023.html

hge引擎写的一个扫雷小游戏相关推荐

  1. ChatGPT实现用C语言写一个扫雷小游戏

    前几天我们利用 ChatGPT实现用C语言写一个学生成绩管理系统 其过程用时不到30秒,速度惊人 今天又让ChatGPT用C语言写了一个扫雷小游戏,它的回答是:抱歉,我是AI语言模型,无法编写程序. ...

  2. C++ · 手把手教你写一个扫雷小游戏

    Hello,大家好,我是余同学.这两个月真是太忙了,无暇给大家更新文章- 暑假不是写了个扫雷小游戏吗(Link)?考虑到很多同学对代码没有透彻的理解,那么,这篇文章,我们来详细分析一下代码. 我们分为 ...

  3. 如何开发一个扫雷小游戏?

    如何用C#开发一个扫雷小游戏? 十分自豪的说,计算机编程就是变魔术,每一个coder都是一个魔术师. 初学C#的时候,我相信很多人都和我一样,学会了基本语法,掌握了基本的数据结构,也见过了不少微软提供 ...

  4. 一个扫雷小游戏带你初识VUE3和typescript

    一个扫雷小游戏带你初识VUE3和typescript 阅读本文你会了解到: vue3的部分新特性 typescript的基本使用 部分es6语法 基础部分 为什么要使用ref和reactive来声明变 ...

  5. java人点灯问题_JAVA学习,写的一个点灯小游戏

    之前写的一个点灯小游戏,没什么技术含量. 截图: 代码: 类Start: import java.io.File; import java.io.IOException; import javax.i ...

  6. 使用C语言写一个扫雷小游戏

    前言 相信扫雷游戏小伙伴们肯定都玩过吧,学习了C语言中的数组.函数等基础内容之后就可以自己写一个简易的扫雷小游戏了,今天就我写扫雷小游戏的过程及思路写一篇博客,希望大家看完我的博客能有所收获. 软件及 ...

  7. 【tkinter】用不到50行Python代码,写一个扫雷小游戏

    文章目录 定制按钮 生成雷区 主流程 Tkinter系列: GUI初步

  8. 写的一个“打地鼠“小游戏

    二话不说,直接上代码... <!DOCTYPE html> <html>     <head>         <meta charset="UTF ...

  9. 虽然我不是做游戏的,闲的没事,emm,写了个扫雷小游戏(Android)

    文章目录

  10. rust游戏亮度怎么调亮点_之前用Rust写的扫雷小游戏

    这次来分享一下之前用Rust写的一个扫雷小游戏,目前能在Windows下运行.Github仓库: https://github.com/crlf0710/charlesmine-rs​github.c ...

最新文章

  1. java jsp转html_JSP页面转换为HTML页面,动态转静态
  2. 12cR2 RAC+RAC+ADG ORA-16854
  3. 2015第36周一高效程序员的45个习惯
  4. java web 手机验证_javaWeb发送手机短信验证码(云通讯)
  5. 6个经典的JavaScript报错分析
  6. Linux内核crypto子系统的调用逻辑
  7. Mac下的Jenkins安装
  8. 仙岛求药(信息学奥赛一本通-T1251)
  9. Leetcode#102Binary Tree Level Order Traversal
  10. java 图片转成base64编码_java语言中如何将一个图片转换为base64编码的数据呢?
  11. 摄像头云台的设计,组装与使用方法
  12. SAS Marketing Automation 6.3 User’s Guide 学习笔记
  13. 基于51单片机的智能时控开关设计
  14. 骨传导耳机的作用有哪些?骨传导耳机的好处盘点
  15. iphone装android软件,黑科技降临,红手指教你苹果手机如何安装安卓APP
  16. watch属性的使用
  17. 招生1400名!这所985高校发布2023年博士研究生招生简章!
  18. 学生成绩排名(并列问题)
  19. 《什么是HTML5》
  20. Workstation安装中标麒麟操作系统V7

热门文章

  1. Autodesk Map 3D 2012 新功能介绍
  2. SOLR对多个(关联)表创建索引
  3. Java实现10万+并发去重,持续优化!
  4. 玩转 Java 动态编译,太秀了~!
  5. 牛皮!竟然有大佬基于 Spring Boot + Vue 开发了一套网易云QQ音乐(附源码)。。。...
  6. 阿里大牛程序员的Java问题排查工具单
  7. Hinton胶囊网络代码正式开源,5天GitHub fork超1.4万
  8. Linux服务器的那些性能参数指标
  9. 说三件可能你不知道的小事
  10. python协程调度方式_python 3.x 学习笔记17(协程以及I/O模式)