基于EasyX的扫雷游戏

  • 一、预备知识
  • 二、游戏逻辑
    • 1.扫雷元素
    • 2.扫雷规则
  • 三、游戏设计
    • 1.地图设计
    • 2.点击设计
    • 3.结束设计
    • 4.整体设计

一、预备知识

1.使用EasyX必须要知道的一些基础函数
2.选择结构 if , switch
3.循环结构 for, while
4.多维数组 arr1[N], arr2[N][N] , arr3[N][N][N]
5.函数封装

二、游戏逻辑

想要写出推箱子,首先要知道推箱子游戏都有哪些元素和规则

1.扫雷元素


主要可以分成三类
1.没有打开个格子
2.打开的格子
3.被标记的格子

有了素材,先来一个加载资源函数Loadimg()

#define SIZE 25//图片大小
IMAGE img[13];//存放图片数组void Loadimg()
{loadimage(&img[0] ,L"./images/0.jpg",SIZE,SIZE);loadimage(&img[1] ,L"./images/1.jpg",SIZE,SIZE);loadimage(&img[2] ,L"./images/2.jpg",SIZE,SIZE);loadimage(&img[3] ,L"./images/3.jpg",SIZE,SIZE);loadimage(&img[4] ,L"./images/4.jpg",SIZE,SIZE);loadimage(&img[5] ,L"./images/5.jpg",SIZE,SIZE);loadimage(&img[6] ,L"./images/6.jpg",SIZE,SIZE);loadimage(&img[7] ,L"./images/7.jpg",SIZE,SIZE);loadimage(&img[8] ,L"./images/8.jpg",SIZE,SIZE);loadimage(&img[9] ,L"./images/9.jpg",SIZE,SIZE);loadimage(&img[10],L"./images/10.jpg",SIZE,SIZE);loadimage(&img[11],L"./images/11.jpg",SIZE,SIZE);loadimage(&img[12],L"./images/12.jpg",SIZE,SIZE);
}

2.扫雷规则

1.左键点击未被打开的格子,可以打开格子
2.右键点击未被打开的格子,可以标记格子
3.被标记的格子不能被打开
3.被标记的格子再右键时,可以解除标记
4.如果打开后格子是空的,则自动打开周围的八个格子
5.自动打开的格子也遵循规则4
6.如果打开的格子里面是雷,则游戏失败
7.如果所有非雷格子均被打开,则游戏获胜

(格子的数字代表它周围九宫格内雷的数量)

三、游戏设计

知道游戏元素和规则就可以开始设计游戏了

1.地图设计

地图内的数字代表它周围九宫格内雷的数量,看一下图就应该可以理解了,这次采用地图随机生成(为了避免大家记雷的位置),需要用<time.h>里的生成随机数,先写一个初始化地图函数Initmap()

#define NUM 10//地图行列数
int map[NUM][NUM]={0};void Initmap()
{   //----------随机设置雷----------srand((unsigned)time(NULL));//根据时间设置随机数种子for(int k=0;k<NUM;  ){int x=rand()%NUM;//生成0 ~ 9的随机数int y=rand()%NUM;//为避免产生相同的坐标,采用下面的方式if(map[x][y]==0){//如果格子为空,则设置雷map[x][y]=9;//雷是9k++;}}//如果是雷,则雷周围九宫格内数字均+1for(int i=0;i<NUM;i++){for(int j=0;j<NUM;j++){if(map[i][j]==9){//如果是雷for(int a=i-1;a<=i+1;a++){//遍历该雷周围的九宫格for(int b=j-1;b<=j+1;b++){if(a>=0 && b>=0 && a<NUM && b<NUM && map[a][b]!=9){//判断数组是否越界map[a][b]++;//不越界则+1}}}}}}//盖上格子 所有数字 +10,(点击打开格子 数字-10)for(int r=0;r<NUM;r++){for(int c=0;c<NUM;c++){map[r][c]+=10;}}
}

由上面的元素分类可以知道,游戏地图数据分为三类

  1. 被打开的格子 0 ~ 9
  2. 未被打开的格子 10 ~ 19
  3. 被标记的格子 20 ~ 29

也就是,对格子进行+10处理,+10代表另一种状态,现在可以根据状态绘制地图,写一个Drawmap()函数

void Drawmap()
{for(int i=0;i<NUM;i++){for(int j=0;j<NUM;j++){ if(map[i][j]>=10 && map[i][j]<20){//如果图还没点开,且未被标记,贴格子putimage(i*SIZE,j*SIZE,&img[10]);}else if(map[i][j]>=20){//如果被标记,贴标记putimage(i*SIZE,j*SIZE,&img[11]);}else{//剩下的按数值贴图putimage(i*SIZE,j*SIZE,&img[ map[i][j] ]);}} }
}

2.点击设计

上文提到

1.左键点击未被打开的格子,可以打开格子
2.右键点击未被打开的格子,可以标记格子
3.被标记的格子不能被打开
3.被标记的格子再右键时,可以解除标记

首先要找到鼠标位置,然后根据鼠标点击的情况,左键还是右键,分写不同的处理,所有内容写在Hitimg()函数内

ExMessage m;//消息全局变量
int ipos=-10,jpos=-10;//记录鼠标位置
int count=90;//总共非雷格子数void Hitimg()
{m = getmessage(EM_MOUSE);//得到鼠标消息if(m.message == WM_LBUTTONDOWN){//如果鼠标左键按下ipos=m.x/SIZE;//换算鼠标位置jpos=m.y/SIZE;if(map[ipos][jpos]>=10 && map[ipos][jpos]<20){//如果格子还没被点开 且未被标记count--;//非雷格子数减少map[ipos][jpos]-=10;//打开}}if(m.message == WM_RBUTTONDOWN) {//如果鼠标右键按下ipos=m.x/SIZE;//换算鼠标位置jpos=m.y/SIZE;if(map[ipos][jpos]>=10 && map[ipos][jpos]<20){//如果格子还没被点开map[ipos][jpos]+=10;//标记}else if(map[ipos][jpos]>=20){//如果格子被标记map[ipos][jpos]-=10;//去掉标记}}
}

上文提到

4.如果打开后格子是空的,则自动打开周围的八个格子
5.自动打开的格子也遵循规则4

这个就比较有趣了,仔细想想,这不就是递归吗,因为每次格子位置都不一样,需要传个 格子位置 参数,写个Openmap(int ipos,int jpos)函数

void Openmap(int ipos,int jpos)
{//如果是空白则打开别打空白if(map[ipos][jpos]==0){//如果是空格子for(int a=ipos-1;a<=ipos+1;a++){ //遍历格子周围的九宫格for(int b=jpos-1;b<=jpos+1;b++){if(a>=0 && b>=0 && a<NUM && b<NUM){//判断数组是否越界 if(map[a][b]>=10 && map[a][b]<=18){//如果周围是没被打开的格子map[a][b]-=10;//打开格子count--;//非雷格子数减少Openmap(a,b);//递归打开 被打开格子周围的格子}}}}}
}

3.结束设计

上文提到

6.如果打开的格子里面是雷,则游戏失败
7.如果所有非雷格子均被打开,则游戏获胜

是不是很容易想到,
游戏失败条件就是map[ipos][jpos]==9
游戏获胜条件就是非雷格子数为灵count==0
如果游戏失败也把别的雷显示出来,并且点的雷是红的,写一个函数显示所有雷Showallmines()

void Showallmines()
{for(int i=0;i<NUM;i++){for(int j=0;j<NUM;j++){ if(map[i][j]==19 && map[i][j]!=9)putimage(i*SIZE,j*SIZE,&img[12]);if(map[i][j]==9)putimage(i*SIZE,j*SIZE,&img[9]);}}
}

4.整体设计

下面把上面的函数组合起来就是推箱子游戏,再来点音乐

#include<stdio.h>
#include<time.h>
#include<easyx.h>//图形库
#include<mmsystem.h>//音乐
#pragma comment(lib,"winmm.lib")//库文件int main()
{initgraph(SIZE*10,SIZE*10);//创建窗口Loadimg(); //加载图片资源Initmap();//初始化地图BeginBatchDraw();//批量绘图开始Drawmap();//贴图EndBatchDraw();//批量绘图结束//循环播放背景音乐mciSendString(L"open ./images/bg.mp3 ", 0, 0, 0);mciSendString(_T("play ./images/bg.mp3 repeat"), 0, 0, 0);while(true){if(map[ipos][jpos]==9){//如果游戏失败Showallmines();//显示所有雷mciSendString(L"close ./images/bg.mp3 ", 0, 0, 0);//关闭背景音乐PlaySound(L"./images/over.wav", nullptr, SND_FILENAME | SND_ASYNC);//播放失败音乐MessageBox(NULL,_T("游戏结束,你输了,-_-||"),_T("游戏提示"),MB_OK);break;}else if(count==0){//如果游戏胜利Drawmap();mciSendString(L"close ./images/bg.mp3 ", 0, 0, 0);//关闭背景音乐PlaySound(L"./images/success.wav", nullptr, SND_FILENAME | SND_ASYNC);//播放胜利音乐MessageBox(NULL,_T("游戏结束,恭喜你,你赢了!"),_T("游戏提示"),MB_OK) ;break;}Drawmap();//更新地图Hitimg();//点击格子图片Openmap(ipos,jpos);//递归打开空格子}system("pause");return 0;
}

把上面所有代码复制到一个cpp文件里,再把素材改好命名放到images文件夹里,images文件夹在cpp文件旁边,就可以编译运行了!

图片音乐素材及可执行程序需要的点击下载

基于EasyX的扫雷游戏相关推荐

  1. C++的学习心得和知识总结(十八)|基于EasyX实现 2048游戏 项目(C/C++版)

    目录结构 注:提前言明 本文借鉴了以下博主.书籍或网站的内容,其列表如下: 1.网络热门游戏 2048,点击前往 2.EasyX官方链接,点击前往 3.中国色谱 颜色代码对照表(RGB多用于easyX ...

  2. 基于java的扫雷论文_毕业论文基于java的扫雷游戏的设计与实现.doc

    毕业论文基于java的扫雷游戏的设计与实现 JAVA程序设计A课程设计 题 目 基于JAVA的扫雷游戏的设计与实现 院 (系) 信息工程学院 专 业 班 级 计算机科学与技术(2)班 学 生 姓 名 ...

  3. 基于EasyX的五子棋游戏

    基于EasyX的五子棋游戏 一.预备知识 二.游戏逻辑 1.五子棋元素 2.五子棋规则 三.游戏设计 1.地图设计 2.点击设计 3.结束设计 4.整体设计 一.预备知识 1.使用EasyX必须要知道 ...

  4. 基于jQuery经典扫雷游戏源码

    分享一款基于jQuery经典扫雷游戏源码.这是一款网页版扫雷小游戏特效代码下载.效果图如下: 在线预览   源码下载 实现的代码. html代码: <center><h1>jQ ...

  5. 基于EasyX的拼图游戏

    基于EasyX的拼图游戏 一.预备知识 二.游戏逻辑 1.拼图元素 2.拼图规则 三.游戏设计 1.地图设计 2.移动设计 3.结束设计 4.整体设计 一.预备知识 1.使用EasyX必须要知道的一些 ...

  6. 基于java的扫雷论文_毕业论文基于JAVA的扫雷游戏设计

    毕业论文基于JAVA的扫雷游戏设计 课 程 设 计 报 告 课程名称: 计算机技术综合课程设计 题 目: 基于JAVA语言的扫雷游戏设计 学 院: 信息工程 系: 计算机 专 业: 计算机科学与技术 ...

  7. 扫雷程序设计Android答辩,基于QT的扫雷游戏设计与实现扫雷游戏答辩.ppt

    基于QT的扫雷游戏设计与实现扫雷游戏答辩.ppt 程序设计 基于QT语言的扫雷游戏,答辩学生,一.分析扫雷游戏的基本功能,1.从外观上分析 方块 笑脸 计时器 有雷标识 无雷标识 胜利画面 失败画面, ...

  8. 基于java的扫雷游戏设计01

    开发工具eclipse,jdk1.7 扫雷:游戏说明 扫雷是一种具有迷惑性的对记忆和推理能力的简单测试,它是长久以来最受欢迎的 Windows 游戏之一. 游戏目标:找出空方块,同时避免触雷. 启动游 ...

  9. 基于java的扫雷游戏的设计

    扫雷游戏的基本功能:点击鼠标左键于未知区域,如果未知区域有雷,游戏停止,显示所有的地雷.如果没雷,则显示周围雷数,如果周围没雷,则再查看周围八个区域是否有雷直到有雷为止并显示,玩家需要尽快找出雷区中的 ...

最新文章

  1. rsync - 远程同步工具
  2. [信息收集] HCOMP 2010概况及收录论文
  3. HDMI高清光端机产品特点及应用场合介绍
  4. VS编译器安装Eigen
  5. java akka_AKKA文档(java版)——什么是AKKA?
  6. iOS-属性字符串添加下划线、删除线
  7. 做游戏,学编程(C语言) 2 最简单的飞机游戏
  8. (记录)操作多层Iframe嵌套内的元素
  9. 面向计算机视觉的深度学习 | iBooker·ApacheCN
  10. 【Axure原型分享】JS地图
  11. 几种常见的注册中心以及区别
  12. fsck|xfs_repair 磁盘修复
  13. 重装系统lol登录服务器,LOL无法登录的彻底解决方法
  14. react.js实现的时间轴js特效
  15. java应用 cpu占用过高问题分析及解决方法
  16. 不小心把java文件删除了_如何使用Java恢复已删除的文件?
  17. 植物大战僵尸音乐计算机简谱,植物大战僵尸(主题音乐)钢琴谱
  18. 大学两年的总结与感悟
  19. Node js实战(双色) 作者之一——吴中骅访谈录
  20. 我的操作系统探索之路----------------进程篇(1)

热门文章

  1. Swift5.x - 中文文档
  2. html5audio音乐速率,HTML5 音频audio属性
  3. nvidia/cuda docker镜像标签
  4. podman镜像管理
  5. 2022年1月17日
  6. protocolbuffe
  7. 【源码】leafpile3D:三维落叶飘零模拟
  8. 中科大发4万封钓鱼邮件给师生“免费送月饼”,网友:学校太会“整活”了......
  9. Ubuntu 20.04使用必装工具软件
  10. jvm参数 设置建议