程序简介

六边形扫雷,寻宝模式,稍稍介绍一下。
他也是要把所有安全的地方点出来。
他没有扫雷模式的消零算法。每一个安全的点都需要单独挖出来,一次显示一个格子。
添加了生命值的概念,也就是说存在一定的容错。
显示的数字有别于扫雷模式。点击宝藏点,会显示周围宝藏点数量,绿色;点击地雷,会显示周围地雷数量,黑色。注意,这个数字不包括自己,显示的范围自然就是 0~6 了。点击地雷会减生命值,生命值归零则结束。

所以雷和宝藏都是有价值的,都是能给准确信息的。

我能给一个参考难度:占总格子数 40%的地雷,占总地雷数 50 %的生命值。

程序运行展示

完整源代码


// 程序:六边形扫雷:寻宝模式
// 编译环境:Visual C++ 2010,EasyX_20211109
// 更多好玩的游戏源码加我Q群:724050348# include <math.h>
# include <graphics.h>
# include <string>
# include <time.h>static double pi = acos (-1.0);            // 圆周率 π
static HWND hOut;                       // 画布// 定义一个结构体,按钮
struct Node1
{int posx1, posy1, posx2, posy2;        // 坐标LPTSTR text;                       // 文字int mod;                           // 状态
};// 定义一个结构体,六边形格子
struct Node2
{int i, j, k;                       // 特征值int mod_life;                     // 翻开int mod_mine;                      // 雷int mod_flag;                       // 标记int posx, posy;                        // 坐标int num_mine;                      // 周围雷数int num_peace;                       // 周围空地块
};// 定义一个类
class Gary
{
public:void carry ();                       // 主进程void initialization ();               // 初始化void draw_scene ();                   // 绘制界面函数void draw_box (int num_box);       // 绘制格子void draw_flag (int num_box);        // 绘制标记void draw_num (int num_box, int num);    // 绘制数字void move ();                        // 窗口主视角void create ();                     // 地雷生成void check_over ();                  // 结束判定int num_button;                      // 按钮数量参数int exit_carry;                        // 主循函数控制参数int exit_move;                       // 开始界面控制参数int exit_game;                       // 游戏进行控制参数int num_life;                        // 生命值int num_size;                     // 边长int num_mine;                      // 总雷数int num_box;                      // 总地块数int num_flag;                        // 标记数COLORREF color_text[2];               // 按钮绘制填充Node1 boxm[30];                        // 按钮,预制 30 个Node2 box[1000];                    // 地块
};// 标记绘制函数
void Gary::draw_flag (int num_box)
{setlinestyle (PS_SOLID, 1);setlinecolor (BLACK);line (box[num_box].posx + 2, box[num_box].posy + 7, box[num_box].posx + 2, box[num_box].posy - 7);setfillcolor (LIGHTRED);setlinecolor (LIGHTRED);fillrectangle (box[num_box].posx - 7 + 2, box[num_box].posy - 7, box[num_box].posx + 2, box[num_box].posy - 1);
}// 数字绘制函数
void Gary::draw_num (int num_box, int num)
{int i;// 画六边形,格子处于点击后状态setfillcolor (RGB (170, 170, 170));setlinecolor (RGB (85, 85, 85));POINT pts[6];setlinestyle (PS_SOLID, 1);for (i = 0; i < 6; i++){pts[i].x = long(box[num_box].posx + 14.0 * cos (60.0 * double (i) * pi / 180.0));pts[i].y = long(box[num_box].posy + 14.0 * sin (60.0 * double (i) * pi / 180.0));}fillpolygon (pts, 6);// 数字绘制TCHAR s[15];settextstyle (20, 0, _T ("Consolas"));_stprintf_s (s, _T ("%0.1d"), num);outtextxy (box[num_box].posx - 5, box[num_box].posy - 10, s);
}// 场景绘制函数
void Gary::draw_scene ()
{TCHAR s[15];int i, j;setlinecolor (BLACK);setfillcolor (WHITE);setlinestyle (PS_SOLID, 1);// 主界面fillrectangle (401, 0, 650, 400);// 根据按钮数量绘制   settextcolor (BLACK);for (i = 0; i < num_button; i++){setfillcolor (color_text[boxm[i].mod]);setbkcolor (color_text[boxm[i].mod]);// 边框fillrectangle (boxm[i].posx1, boxm[i].posy1, boxm[i].posx2, boxm[i].posy2);// 文字outtextxy (boxm[i].posx1 + (boxm[i].posx2 - boxm[i].posx1) / 2 - textwidth (boxm[i].text) / 2, boxm[i].posy1 + 4, boxm[i].text);}// 设置参数setbkcolor (WHITE);settextcolor (BLACK);setlinecolor (BLACK);// 变量绘制j = 25;// 生命值i = 1;setbkcolor (color_text[boxm[i].mod]);_stprintf_s (s, _T ("%0.1d"), num_life);outtextxy (boxm[i].posx1 + (boxm[i].posx2 - boxm[i].posx1) / 2 - textwidth (boxm[i].text) / 2, boxm[i].posy1 + j, s);// 边长i = 2;setbkcolor (color_text[boxm[i].mod]);_stprintf_s (s, _T ("%0.1d"), num_size);outtextxy (boxm[i].posx1 + (boxm[i].posx2 - boxm[i].posx1) / 2 - textwidth (boxm[i].text) / 2, boxm[i].posy1 + j, s);// 总地雷数i = 3;setbkcolor (color_text[boxm[i].mod]);_stprintf_s (s, _T ("%0.1d"), num_mine);outtextxy (boxm[i].posx1 + (boxm[i].posx2 - boxm[i].posx1) / 2 - textwidth (boxm[i].text) / 2, boxm[i].posy1 + j, s);// 格子i = 4;setbkcolor (color_text[boxm[i].mod]);_stprintf_s (s, _T ("%0.1d"), num_box);outtextxy (boxm[i].posx1 + (boxm[i].posx2 - boxm[i].posx1) / 2 - textwidth (boxm[i].text) / 2, boxm[i].posy1 + j, s);// 标记数i = 5;setbkcolor (color_text[boxm[i].mod]);_stprintf_s (s, _T ("%0.1d"), num_flag);outtextxy (boxm[i].posx1 + (boxm[i].posx2 - boxm[i].posx1) / 2 - textwidth (boxm[i].text) / 2, boxm[i].posy1 + j, s);FlushBatchDraw ();
}// 地雷生成函数
void Gary::create ()
{int i, j;// 设置雷for (i = 0; i < num_mine; i++){// 随机j = rand () % 1000;while (box[j].mod_mine == 1 || box[j].mod_life == 1){// 随机j = rand () % 1000;}// 是雷box[j].mod_mine = 1;}// 周边雷数统计// 遍历for (i = 0; i <= 888; i++){if (box[i].mod_life == 0){// 遍历for (j = 0; j <= 999; j++){// 排除自己if (j != i && box[j].mod_life == 0){// 周围六个if ((box[j].posx - box[i].posx) * (box[j].posx - box[i].posx) + (box[j].posy - box[i].posy) * (box[j].posy - box[i].posy) <= 900){// 是雷if (box[j].mod_mine == 1){// 周边雷数参数加一box[i].num_mine++;}// 不是雷else if (box[j].mod_mine == 0){// 周边安全数参数加一box[i].num_peace++;}}}}}}
}// 结束判断函数
void Gary::check_over ()
{int i, k;k = 0;for (i = 0; i <= 888; i++){// 每有一个翻开且不是雷的点,则加一if (box[i].mod_mine == 0 && box[i].mod_life == 1){k++;}}// 全翻开则结束if (k == num_box - num_mine){// 将所有未翻开雷做上标记for (i = 0; i <= 888; i++){if (box[i].mod_mine == 1 && box[i].mod_life == 0){draw_flag (i);}}// 胜利标志:笑脸setfillcolor (WHITE);setlinecolor (WHITE);fillrectangle (50, 20, 75, 45);settextstyle (30, 0, _T ("Wingdings"));setbkmode (TRANSPARENT);settextcolor (BLACK);outtextxy (50, 20, 0x4A);setbkmode (OPAQUE);settextstyle (20, 0, _T ("Consolas"));// 结束变化exit_game = 1;boxm[1].mod = 0;boxm[2].mod = 0;boxm[3].mod = 0;boxm[6].mod = 0;boxm[7].mod = 1;num_flag = 0;// 绘制draw_scene ();}
}// 格子绘制函数
void Gary::draw_box (int num_box)
{int i;int posx, posy;// 六边形绘制posx = box[num_box].posx;posy = box[num_box].posy;POINT pts[6];setlinestyle (PS_SOLID, 2);// 背景色setfillcolor (RGB (255, 255, 255));for (i = 0; i < 6; i++){pts[i].x = long(posx + 14.0 * cos (60.0 * double (i) * pi / 180.0));pts[i].y = long(posy + 14.0 * sin (60.0 * double (i) * pi / 180.0));}solidpolygon (pts, 6);// 灰边setlinecolor (RGB (85, 85, 85));line (pts[0].x, pts[0].y, pts[1].x, pts[1].y);line (pts[5].x, pts[5].y, pts[0].x, pts[0].y);line (pts[1].x, pts[1].y, pts[2].x, pts[2].y);// 前景色setfillcolor (RGB (170, 170, 170));for (i = 0; i < 6; i++){pts[i].x = long(posx + 12.0 * cos (60.0 * double (i) * pi / 180.0));pts[i].y = long(posy + 12.0 * sin (60.0 * double (i) * pi / 180.0));}solidpolygon (pts, 6);FlushBatchDraw ();
}// 初始化函数
void Gary::initialization ()
{int i, j, k, t;// 随机初始化srand ((unsigned)time (NULL));// 颜色初始化color_text[0] = WHITE;color_text[1] = RGB (170, 170, 170);// 按钮的初始化num_button = 10;// 坐标for (i = 0; i < 10; i++){boxm[i].posx1 = 410 + 120 * (i % 2);boxm[i].posy1 = 25 + 75 * (i / 2);boxm[i].posx2 = 520 + 120 * (i % 2);boxm[i].posy2 = 75 + 75 * (i / 2);}// 内容boxm[0].text = _T ("寻宝模式");    boxm[1].text = _T ("生命值");boxm[2].text = _T ("地图边长"); boxm[3].text = _T ("总地雷数");boxm[4].text = _T ("总地块数");    boxm[5].text = _T ("已标记数");boxm[6].text = _T ("开始");      boxm[7].text = _T ("重置");boxm[8].text = _T ("截图");        boxm[9].text = _T ("退出");// 状态boxm[0].mod = 1;boxm[1].mod = 1;boxm[2].mod = 1;boxm[3].mod = 1;boxm[4].mod = 1;boxm[5].mod = 1;boxm[6].mod = 1;boxm[7].mod = 0;boxm[8].mod = 0;boxm[9].mod = 0;num_box = 3 * num_size * (num_size - 1) + 1;num_flag = 0;// 绘制参数初始化setlinecolor (BLACK);setlinestyle (PS_SOLID, 1);settextstyle (20, 0, _T ("Consolas"));// 第一次绘制draw_scene ();// 重置setfillcolor (WHITE);fillrectangle (0, 0, 400, 400);// 平静脸setfillcolor (WHITE);setlinecolor (WHITE);fillrectangle (50, 20, 75, 45);settextstyle (30, 0, _T ("Wingdings"));setbkmode (TRANSPARENT);settextcolor (BLACK);outtextxy (50, 20, 0x4B);setbkmode (OPAQUE);settextstyle (20, 0, _T ("Consolas"));// 格子初始化for (t = 0; t <= 999; t++){// 已翻开box[t].mod_life = 1;// 城墙box[t].mod_mine = 2;// 坐标,点不到box[t].posx = -200;box[t].posy = -200;}// 初始化for (i = 0; i < num_size; i++){for (j = 0; j < num_size; j++){for (k = 0; k < num_size; k++){// 特征值至少一个为零if (i == 0 || j == 0 || k == 0){// 编号t = i * 100 + j * 10 + k;// 特征值box[t].i = i;box[t].j = j;box[t].k = k;// 未翻开box[t].mod_life = 0;// 不是雷box[t].mod_mine = 0;// 未标记box[t].mod_flag = 0;// 坐标box[t].posx = 200 + 22 * (j - k);box[t].posy = 200 - 25 * i + 13 * (j + k);// 周围雷数初始化box[t].num_mine = 0;box[t].num_peace = 0;// 绘制地块draw_box (t);}}}}// 地雷生成函数create ();
}// 窗口主视角函数,获取用户操作
void Gary::move ()
{// 鼠标定义ExMessage m;TCHAR ss[15];int i, t;exit_move = 0;exit_game = 0;while (exit_move == 0){// 鼠标信息if (peekmessage (&m, EM_MOUSE | EM_KEY)){// 左键单击判断if (m.message == WM_LBUTTONDOWN){// 判断是否点击了格子if (m.x > 0 && m.y > 0 && m.x < 400 && m.y < 400 && exit_game == 0){for (t = 0; t <= 888; t++){// 成功点击未标记的空格子if ((m.x - box[t].posx) * (m.x - box[t].posx) + (m.y - box[t].posy) * (m.y - box[t].posy) <= 144 && box[t].mod_life == 0 && box[t].mod_flag == 0){// 点击的格子不是雷if (box[t].mod_mine == 0){// 绿色,安全,绘制settextcolor (LIGHTGREEN);draw_num (t, box[t].num_peace);// 改为翻开box[t].mod_life = 1;}// 点击的格子雷else if (box[t].mod_mine == 1){// 扣除生命值num_life--;// 黑色,危险,绘制settextcolor (BLACK);draw_num (t, box[t].num_mine);// 改为翻开box[t].mod_life = 1;// 生命值减为零if (num_life <= 0){// 失败标志:哭脸setfillcolor (WHITE);setlinecolor (WHITE);fillrectangle (50, 20, 75, 45);settextstyle (30, 0, _T ("Wingdings"));setbkmode (TRANSPARENT);settextcolor (BLACK);outtextxy (50, 20, 0x4C);setbkmode (OPAQUE);settextstyle (20, 0, _T ("Consolas"));// 失败exit_game = 1;boxm[1].mod = 0;boxm[2].mod = 0;boxm[3].mod = 0;boxm[6].mod = 0;boxm[7].mod = 1;num_flag = 0;}// 绘制draw_scene ();}// 成功结束判断check_over ();break;}}}// 判断是否点击了可点击按钮for (i = 0; i < num_button; i++){if (m.x > boxm[i].posx1 && m.y > boxm[i].posy1 && m.x < boxm[i].posx2 && m.y < boxm[i].posy2 && boxm[i].mod == 0){break;}}// 点击矩形按钮switch (i){// 生命值:num_lifecase 1:{// 输入InputBox (ss, 10, _T ("输入生命值(1 ~ 999)"));_stscanf_s (ss, _T ("%d"), &i);if (i > 0 && i <= 999){num_life = i;}else { MessageBox (hOut, _T ("输入错误,不在范围内"), _T ("来自小豆子的提醒"), MB_OK); }// 绘制draw_scene ();break;}// 地图边长:num_sizecase 2:{// 输入InputBox (ss, 10, _T ("输入边长(2 ~ 8)"));_stscanf_s (ss, _T ("%d"), &i);if (i > 1 && i <= 8){num_size = i;num_box = 3 * num_size * (num_size - 1) + 1;}else { MessageBox (hOut, _T ("输入错误,不在范围内"), _T ("来自小豆子的提醒"), MB_OK); }// 绘制draw_scene ();break;}// 总地雷数:num_minecase 3:{InputBox (ss, 10, _T ("输入地雷数(1 ~ 总格子数)"));_stscanf_s (ss, _T ("%d"), &i);if (i > 0 && i < num_box){num_mine = i;}else { MessageBox (hOut, _T ("输入错误,不在范围内"), _T ("来自小豆子的提醒"), MB_OK); }// 绘制draw_scene ();break;}// 开始case 6:{num_box = 3 * num_size * (num_size - 1) + 1;if (num_mine < num_box && num_life > 0){exit_game = 0;// 初始化initialization ();}else{MessageBox (hOut, _T ("请将雷数修改为小于格子数或将生命值修改为大于零"), _T ("来自小豆子的提醒"), MB_OK);}break;}// 重置case 7:{// 结束游戏进程,进入准备阶段if (exit_game == 0){exit_game = 1;boxm[1].mod = 0;boxm[2].mod = 0;boxm[3].mod = 0;boxm[6].mod = 0;boxm[7].mod = 1;num_flag = 0;// 绘制draw_scene ();}break;}// 截图case 8:{saveimage (_T ("image.png"));break;}// 退出case 9:{exit_game = 1;exit_move = 1;exit_carry = 1;break;}default:break;}}// 右键,且处于游戏进行状态else if (m.message == WM_RBUTTONDOWN && exit_game == 0){for (t = 0; t <= 888; t++){// 成功点击空格子if ((m.x - box[t].posx) * (m.x - box[t].posx) + (m.y - box[t].posy) * (m.y - box[t].posy) <= 144 && box[t].mod_life == 0){// 标记状态转换box[t].mod_flag = (box[t].mod_flag == 0 ? 1 : 0);// 绘制draw_box (t);// 画小旗子if (box[t].mod_flag == 1){draw_flag (t);num_flag++;}else{num_flag--;}// 绘制draw_scene ();}}}}}
}// 主进程
void Gary::carry ()
{// 窗口定义hOut = initgraph (651, 401);SetWindowText (hOut, _T ("六边形扫雷:扫雷模式"));// 参数初始化num_size = 5;num_mine = 10;num_life = 3;// 背景绘制setbkcolor (WHITE);cleardevice ();// 进程控制exit_carry = 0;while (exit_carry == 0){initialization ();move ();}closegraph ();
}// 主函数
int main (void)
{Gary G;G.carry ();return 0;
}

更多好玩的游戏源码看下方:c语言基础学习的个人空间_哔哩哔哩_bilibilihttps://space.bilibili.com/2061978075

C语言六边形扫雷:寻宝模式相关推荐

  1. [易语言] 六边形扫雷游戏实战开发

    易语言是中国国产的编程语言,广泛用于外挂的制作,我有幸学了一点,运用自己的知识做了个六边形扫雷的小游戏. 玩法方面,和Windows自带的扫雷几乎很像,由于比较懒惰,就没加双击自动扫雷和扫雷排行榜等非 ...

  2. c语言实现扫雷(详细讲解)

    本篇介绍,讲解如何使用c语言实现扫雷小游戏. 金句分享: ✨✨✨爱你所爱,行你所行✨✨✨ 目录 前言: 一.游戏设计思路介绍: 效果展示 二.游戏的分步讲解 2.1.主函数测试区(test.c)基本构 ...

  3. 自定义语言的实现——解释器模式

    本文转载自 :http://blog.csdn.net/lovelion/article/details/7713567 有朋友一直在等待我的解释器模式文稿,,现把某个版本发在博客上,欢迎大家讨论! ...

  4. mysql 大小端_go语言中大小端模式的个人理解

    大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据 当作字符串的存储顺序处理.地址由小向大增加,而数据从高位往低位放:这和我们的阅读习 ...

  5. 设计模式的C语言应用-表驱动模式

    [摘要] 表驱动是一种在C语言里常见的编程模式,从表里面查找信息而不使用逻辑语句(if和case).核心操作是将输入因素作为直接或者间接的索引,到数组里找到直接的结果或者对应的处理(通常是函数指针). ...

  6. 用c语言编写最大最小值_C语言学习教程,用C语言编写扫雷游戏

    本文实例为大家分享了C语言实现扫雷游戏及其优化的具体代码,供大家参考,具体内容如下 关于扫雷优化 1.核心思想:使用两个二维数组进行设计,一个用于显示,一个用于后台雷的布置. 2.使用宏常量,后期可以 ...

  7. c++扫雷游戏代码_C语言学习教程,用C语言编写扫雷游戏

    本文实例为大家分享了C语言实现扫雷游戏及其优化的具体代码,供大家参考,具体内容如下 关于扫雷优化 1.核心思想:使用两个二维数组进行设计,一个用于显示,一个用于后台雷的布置. 2.使用宏常量,后期可以 ...

  8. C语言实现扫雷完整算法详解~(附完整代码~)

    扫雷是一个常见小游戏,那么如何用C语言实现扫雷呢?学习了二维数组之后,我们可将扫雷的网格区域存储为二维数组,从而使用C语言实现扫雷. 目录 1.算法基本思路 2.算法详解 1.初始化数组与打印数组 2 ...

  9. 超详细分解c 语言——实现扫雷游戏(详解)

    之前利用三子棋程序,介绍探讨了 c语言简单游戏编写主要模块及使用方法. 今天,我们就利用这个经典扫雷游戏,来加强对于程序思路的编写及思路. 目录 前引 游戏规则介绍 一.基本游戏思路(游戏实现方法) ...

最新文章

  1. OpenCV 【十八】图像平滑处理/腐蚀与膨胀(Eroding and Dilating)/开闭运算,形态梯度,顶帽,黑帽运算
  2. 给你30秒的时间,你会用Excel制作出一个抽奖功能吗?
  3. 你用过这种奇葩的C#注释吗?如何看待
  4. Android Content Provider Security
  5. 集合框架(一) ----------Map集合遍历的方法
  6. 【Python CheckiO 题解】Remove Accents
  7. extundelete 简单使用
  8. python 网页爬虫作业调度_第3次作业-MOOC学习笔记:Python网络爬虫与信息提取
  9. php 路由实现_PHP操作路由器实现方法示例
  10. 开放式关系抽取_有效的开放式合作伙伴关系的3课
  11. c++ linux 获取毫秒_Linux下gettimeofday()函数和clock()函数:精确到毫秒级的时间
  12. 【Siddhi】Flink Siddhi房间温度上升5度报警案例
  13. 人工智能时代职教教师能力提升的路径
  14. 电器缺水保护控制介绍
  15. 讨教大学|FMEA成功实施的关键是什么?
  16. 爆肝一周,用Python在物联网设备上写了个智能语音助手-阿里云智能对话机器人
  17. idea 主题设计+网站
  18. 结合百度地图城市编码的数据表
  19. 典型相关分析(Canonical correlation analysis)(二):原始变量与典型变量之间的相关性 、典型相关系数的检验
  20. android手机功能创新,盘点最让人心动的五大手机差异化创新趋势

热门文章

  1. reflect存在的意义和使用api
  2. python和nltk自然语言处理 脚本之家_想要入门自然语言处理,资料贫瘠,英语不好,大神推荐斯坦福的真的是搞不定,迷迷茫茫,不知从何下手?...
  3. SDIO wifi Marvell8801/Marvell88w8801 介绍(三) ---- Marvell8801/Marvell88w8801寄存器介绍
  4. backupexec mysql_MySQL使用mysqldump备份及还原
  5. 国家一级学会创办的期刊
  6. MyBatis进行增删改查
  7. [单片机][FUSB302][PD1.0][PD2.0] PD协议 Demo 例子 代码
  8. exynos4412中断编程
  9. Sleep(0)的妙用
  10. jdk、maven、idea安装配置