Visual C++实现推箱子游戏的核心算法设计与实现(附源码和和资源)
需要源码和资源请点赞关注收藏后评论区留言私信~~~
在前面的博客中已经讲解了推箱子游戏的菜单和各种对话框的实现,下面对推箱子游戏的核心算法设计和实现进行讲解
一、地图文件读取模块的设计与实现
地图文件读取模块,主要负责将地图文件进行读取,并把相应的文件数据转换成地图显示出来,其设计步骤如下
1:读取当前文件夹中的地图文件
2:判断当前选择关口是否在文件中存在
3:如果存在则把当前关口的地图信息放置到地图数组中
其实现代码如下
void CBoxManDlg::loadMap(int iMissionNum)
{CString str;str.Format("[%d]", iMissionNum);FILE *pFile = fopen("map.txt", "rb");if (pFile == NULL)return;char cTmp[20];fgets(cTmp, 20, pFile);while (strncmp(cTmp, str, 3) != 0){fgets(cTmp, 20, pFile);}for (int i = 0; i < 14; i++)fgets(m_cMap[i], 20, pFile);fclose(pFile);
}
二、地图绘制模块的设计与实现
绘制地图模块主要负责将地图数组中的数据绘制成地图图像,其设计分为如下几个步骤
1:根据要求,实现不同类型格子的绘制函数,地图数组以及地图文件中各个字符代表的意思如下
2:读取地图数据,根据不同的数据调用不同的绘图函数
代码如下
void CBoxManDlg::drawMap(CDC *pDC)
{int i, j, x, y;for (i = 0; i < 14; i++){for (j = 0; j < 16; j++){x = j * 20;y = i * 20;switch (m_cMap[i][j]){case MAP_BACK://0drawBack(x, y, pDC);break;case MAP_WHITEWALL://1drawWhiteWall(x, y, pDC);break;case MAP_BLUEWALL://2drawBlueWall(x, y, pDC);break;case MAP_BALL://3drawBall(x, y, pDC);break;case MAP_BOX://4drawBox(x, y, pDC);break;case MAP_REDBOX://5drawRedBox(x, y, pDC);break;case MAP_MAN://6drawMan(x, y, pDC);break;case MAP_MANBALL://7drawManBall(x, y, pDC);break;}}}COLORREF crText = pDC->GetTextColor();COLORREF crBack = pDC->GetBkColor();pDC->SetTextColor(RGB(255, 0, 0));pDC->SetBkColor(RGB(255, 255, 255));CString str;str.Format("当前等级: %02d", g_level);pDC->TextOut(330, 50, str);str.Format("已走步数: %03d", passtime);pDC->TextOut(330, 100, str);
}
void CBoxManDlg::drawBack(int x, int y, CDC *pDC)
{COLORREF clr = RGB(0, 0, 0);pDC->FillSolidRect(x, y, 20, 20, clr);
}void CBoxManDlg::drawWhiteWall(int x, int y, CDC *pDC)
{COLORREF clr1 = RGB(255, 255, 255);COLORREF clr2 = RGB(48, 48, 48);COLORREF clr3 = RGB(192, 192, 192);pDC->FillSolidRect(x, y, 19, 19, clr1);pDC->FillSolidRect(x + 1, y + 1, 19, 19, clr2);pDC->FillSolidRect(x + 1, y + 1, 18, 18, clr3);pDC->MoveTo(x, y + 10);pDC->LineTo(x + 20, y + 10);pDC->MoveTo(x + 10, y + 10);pDC->LineTo(x + 10, y + 20);
}void CBoxManDlg::drawBlueWall(int x, int y, CDC *pDC)
{COLORREF clr = RGB(0, 0, 255);pDC->FillSolidRect(x, y, 20, 20, clr);pDC->MoveTo(x, y + 10);pDC->LineTo(x + 20, y + 10);pDC->MoveTo(x + 10, y + 10);pDC->LineTo(x + 10, y + 20);
}void CBoxManDlg::drawBall(int x, int y, CDC *pDC)
{COLORREF clr = RGB(0, 0, 255);pDC->FillSolidRect(x, y, 20, 20, clr);pDC->MoveTo(x, y + 10);pDC->LineTo(x + 20, y + 10);pDC->MoveTo(x + 10, y + 10);pDC->LineTo(x + 10, y + 20);pDC->Ellipse(x, y, x + 20, y + 20);pDC->Ellipse(x + 5, y + 5, x + 15, y + 15);
}void CBoxManDlg::drawBox(int x, int y, CDC *pDC)
{COLORREF clr = RGB(255, 255, 0);pDC->FillSolidRect(x, y, 20, 20, clr);COLORREF clr2 = RGB(255, 192, 0);pDC->FillSolidRect(x + 2, y + 2, 16, 16, clr2);COLORREF clr3 = RGB(0, 0, 0);pDC->SetPixel(x + 3, y + 3, clr3);pDC->SetPixel(x + 17, y + 3, clr3);pDC->SetPixel(x + 3, y + 17, clr3);pDC->SetPixel(x + 17, y + 17, clr3);
}void CBoxManDlg::drawRedBox(int x, int y, CDC *pDC)
{COLORREF clr = RGB(255, 255, 0);pDC->FillSolidRect(x, y, 20, 20, clr);COLORREF clr2 = RGB(255, 0, 0);pDC->FillSolidRect(x + 2, y + 2, 16, 16, clr2);COLORREF clr3 = RGB(0, 0, 0);pDC->SetPixel(x + 3, y + 3, clr3);pDC->SetPixel(x + 17, y + 3, clr3);pDC->SetPixel(x + 3, y + 17, clr3);pDC->SetPixel(x + 17, y + 17, clr3);
}void CBoxManDlg::drawMan(int x, int y, CDC *pDC)
{COLORREF clr = RGB(0, 0, 255); //蓝色墙pDC->FillSolidRect(x, y, 20, 20, clr);pDC->MoveTo(x, y + 10);pDC->LineTo(x + 20, y + 10);pDC->MoveTo(x + 10, y + 10);pDC->LineTo(x + 10, y + 20);pDC->Ellipse(x + 6, y + 2, x + 14, y + 10); //人头pDC->MoveTo(x + 2, y + 11); //人手pDC->LineTo(x + 18, y + 11);pDC->MoveTo(x + 10, y + 10); //人身体pDC->LineTo(x + 10, y + 12);pDC->MoveTo(x + 2, y + 20); //人脚pDC->LineTo(x + 10, y + 12);pDC->LineTo(x + 18, y +20);
}void CBoxManDlg::drawManBall(int x, int y, CDC *pDC)
{COLORREF clr = RGB(0, 0, 255); //球pDC->FillSolidRect(x, y, 20, 20, clr);pDC->MoveTo(x, y + 10);pDC->LineTo(x + 20, y + 10);pDC->MoveTo(x + 10, y + 10);pDC->LineTo(x + 10, y + 20);pDC->Ellipse(x, y, x + 20, y + 20);pDC->Ellipse(x + 5, y + 5, x + 15, y + 15);pDC->Ellipse(x + 6, y + 2, x + 14, y + 10); //人头pDC->MoveTo(x + 2, y + 11); //人手pDC->LineTo(x + 18, y + 11);pDC->MoveTo(x + 10, y + 10); //人身体pDC->LineTo(x + 10, y + 12);pDC->MoveTo(x + 2, y + 20); //人脚pDC->LineTo(x + 10, y + 12);pDC->LineTo(x + 18, y +20);
}
三、键盘操作模块的设计与实现
键盘操作模块主要负责接收玩家键盘输入并进行箱子移动等处理,其设计比较简单,只需要通过如下几步即可实现
1:通过截获当前窗口键盘按下消息来判断玩家按下的按键
2:根据玩家标下的按键把主角的相关坐标进行加减,
3:增加后的数据与地图数组中的数据进行比较,只要不是白墙就可以移动,如果是箱子还需要将箱子的坐标进行移动
4:但要注意,要判断箱子移动后的坐标是否可以移动
代码如下
BOOL CBoxManDlg::PreTranslateMessage(MSG* pMsg)
{if(pMsg->message == WM_KEYDOWN) { updateMap(pMsg->wParam);Invalidate(false);if (isFinish()){AfxMessageBox("您获得胜利,将进入下一关!");g_level = g_level +1;if (g_level > g_maxlevel)g_level = 1;GameStart();}}return CDialog::PreTranslateMessage(pMsg);
}
void CBoxManDlg::updateMap(UINT nChar)
{int x1, y1, x2, y2, x3, y3;x1 = m_ptManPosition.x;y1 = m_ptManPosition.y;switch (nChar){case VK_UP:x2 = x1;y2 = y1 - 1;x3 = x1;y3 = y1 - 2;ReDrawMap(x1, y1, x2, y2, x3, y3);break;case VK_DOWN:x2 = x1;y2 = y1 + 1;x3 = x1;y3 = y1 + 2;ReDrawMap(x1, y1, x2, y2, x3, y3);break;case VK_LEFT:x2 = x1 - 1;y2 = y1;x3 = x1 - 2;y3 = y1;ReDrawMap(x1, y1, x2, y2, x3, y3);break;case VK_RIGHT:x2 = x1 + 1;y2 = y1;x3 = x1 + 2;y3 = y1;ReDrawMap(x1, y1, x2, y2, x3, y3);break;default:break;}
}void CBoxManDlg::ReDrawMap(int x1, int y1, int x2, int y2, int x3, int y3)
{switch (m_cMap[y2][x2]){case MAP_BACK: //地图有问题MessageBox("地图有问题");break;case MAP_WHITEWALL: break;case MAP_BLUEWALL: m_cMap[y2][x2] = MAP_MAN;if (m_cMap[y1][x1] == MAP_MAN)m_cMap[y1][x1] = MAP_BLUEWALL;else if (m_cMap[y1][x1] == MAP_MANBALL)m_cMap[y1][x1] = MAP_BALL;m_ptManPosition.x = x2;m_ptManPosition.y = y2;passtime++;break;case MAP_BALL: m_cMap[y2][x2] = MAP_MANBALL;if (m_cMap[y1][x1] == MAP_MAN)m_cMap[y1][x1] = MAP_BLUEWALL;else if (m_cMap[y1][x1] == MAP_MANBALL)m_cMap[y1][x1] = MAP_BALL; m_ptManPosition.x = x2;m_ptManPosition.y = y2;passtime++;break;case MAP_BOX: if (m_cMap[y3][x3] == MAP_BALL) {m_cMap[y3][x3] = MAP_REDBOX;m_cMap[y2][x2] = MAP_MAN;if (m_cMap[y1][x1] == MAP_MAN)m_cMap[y1][x1] = MAP_BLUEWALL;else if (m_cMap[y1][x1] == MAP_MANBALL)m_cMap[y1][x1] = MAP_BALL;m_ptManPosition.x = x2;m_ptManPosition.y = y2;passtime++;}else if (m_cMap[y3][x3] == MAP_BLUEWALL) {m_cMap[y3][x3] = MAP_BOX;m_cMap[y2][x2] = MAP_MAN;if (m_cMap[y1][x1] == MAP_MAN)m_cMap[y1][x1] = MAP_BLUEWALL;else if (m_cMap[y1][x1] == MAP_MANBALL)m_cMap[y1][x1] = MAP_BALL;m_ptManPosition.x = x2;m_ptManPosition.y = y2;passtime++;}break;case MAP_REDBOX: if (m_cMap[y3][x3] == MAP_BALL){m_cMap[y3][x3] = MAP_REDBOX;m_cMap[y2][x2] = MAP_MANBALL;if (m_cMap[y1][x1] == MAP_MAN)m_cMap[y1][x1] = MAP_BLUEWALL;else if (m_cMap[y1][x1] == MAP_MANBALL)m_cMap[y1][x1] = MAP_BALL;m_ptManPosition.x = x2;m_ptManPosition.y = y2;passtime++;}else if (m_cMap[y3][x3] == MAP_BLUEWALL){m_cMap[y3][x3] = MAP_BOX;m_cMap[y2][x2] = MAP_MANBALL;if (m_cMap[y1][x1] == MAP_MAN)m_cMap[y1][x1] = MAP_BLUEWALL;else if (m_cMap[y1][x1] == MAP_MANBALL)m_cMap[y1][x1] = MAP_BALL;m_ptManPosition.x = x2;m_ptManPosition.y = y2;passtime++;} break;case MAP_MAN: //地图有问题MessageBox("地图有问题");break;case MAP_MANBALL: //地图有问题MessageBox("地图有问题");break;}
}void CBoxManDlg::loadMap(int iMissionNum)
{CString str;str.Format("[%d]", iMissionNum);FILE *pFile = fopen("map.txt", "rb");if (pFile == NULL)return;char cTmp[20];fgets(cTmp, 20, pFile);while (strncmp(cTmp, str, 3) != 0){fgets(cTmp, 20, pFile);}for (int i = 0; i < 14; i++)fgets(m_cMap[i], 20, pFile);fclose(pFile);
}
四、游戏规则模块的设计与实现
游戏规则模块,注意负责游戏规则的判断,其设计方法比较简单,需要在每次玩家移动主角后,对当前地图数组进行判断
BOOL CBoxManDlg::isFinish()
{for (int i = 0; i < 14; i++){for (int j = 0; j < 16; j++){if (m_cMap[i][j] == MAP_BALL || m_cMap[i][j] == MAP_MANBALL){return FALSE;}}}return TRUE;
}
五、主对话框的设计与实现
主要有如下几个部分
1:游戏初始化处理函数
2:菜单初始化处理函数
3:绘图函数处理
void CBoxManDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CPaintDC dc(this);drawMap(&dc);CDialog::OnPaint();}
}
创作不易 觉得有帮助请点赞关注收藏~~~
Visual C++实现推箱子游戏的核心算法设计与实现(附源码和和资源)相关推荐
- 【Java游戏开发合集】毕业设计(附源码+资料+课件)
为正在准备毕业设计的小伙伴们以及想自学一些Java练手项目,小编终于整理出了本套视频课程(附源码+资料+课件),快来白嫖吧!!! 视频教程链接: 全站最全Java游戏合集!毕业设计!(附源码课件)8款 ...
- Adroid游戏开发实例讲解(三)-小蝌蚪找妈妈附源码
Adroid游戏开发实例讲解(三)-小蝌蚪找妈妈附源码 程序之美 从小就听着小蝌蚪找妈妈的故事长大,我相信小伙伴们一定都不陌生,因为小学课本中,我们早早的就学过了小蝌蚪找妈妈这篇文章,它既是一篇文章, ...
- 基于单片机的推箱子游戏设_推箱子游戏51单片机课设计(最全).doc
<51单片机> 课程设计 题 目:基于51单片机的推箱子游戏设计 目 录 1.课程设计目的1 2.课程设计题目和实现目标1 3.设计方案1 4.Proteus仿真原理图7 5.程序设计9 ...
- 深度强化学习中Double DQN算法(Q-Learning+CNN)的讲解及在Asterix游戏上的实战(超详细 附源码)
需要源码和环境搭建请点赞关注收藏后评论区留下QQ~~~ 一.核心思想 针对DQN中出现的高估问题,有人提出深度双Q网络算法(DDQN),该算法是将强化学习中的双Q学习应用于DQN中.在强化学习中,双Q ...
- jsp+ssm计算机毕业设计游戏装备交易网站论文2022【附源码】
项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...
- 【pygame游戏】用Python实现一个蔡徐坤大战篮球的小游戏,可还行?【附源码】
Python制作坤坤打篮球小游戏 序言 准备工作 开发环境 效果预览 开始界面 游戏规则 结束游戏 代码实现 序言 话说在前面,我不是小黑子~ 我是超级大黑子
- 实现简单迷宫小游戏(几行代码)-免费附源码
本次实现的思路 就是需要打印一个迷宫通道 然后通过wasd来控制物体移动 我们通过 实现 打印 空格 进行实现将一开始的小球 消失 操作 使用函数 getch这个录入一个字符 并且 这个录入的字符不 ...
- C语言+easyx图形库 推箱子游戏1.0
本人编程小白,在学完C语言后尝试学习制作了推箱子小游戏,途中收获颇多,在此对于整个过程做一回顾梳理,若有写的不对的地方,还望各位大佬指正. 本篇文章为1.0版本,没有关卡,但拥有推箱子游戏较核心的功能 ...
- c语言语音控制游戏文献,C语言课程设计-基于C语言推箱子游戏设计-毕业论文文献.doc...
gd工程职业技术学院毕业论文 基于C语言的推箱子游戏设计 Design of the push box Based on Combined Language 作者姓名: 学科专业: 应用电子技术 学院 ...
最新文章
- 【响应式Web前端设计】Register Demo
- wifi一阵一阵卡_家里wifi总是过一会就卡一下然后又好了
- OpenOffice介绍
- 外设驱动库开发笔记16:MS5536C压力变送器驱动
- 分久必合的Lindorm传奇
- mysql写偏斜_【MySQL】探究之常用SQL
- 服务器磁盘空间占用,大文件查找
- hnu小学期实训之数圈
- Intellij idea智能提示设置
- Flink reduce详解
- java小组项目口号,小组口号霸气押韵大全(精选60句)
- 如何设计并实现传统小区智能化
- [转]增强型N沟道mos管(如si2300)开关条件
- 语音识别基础算法——动态时间规整算法
- 数据融合-机器人定位
- 什么是交叉熵啊?| 小白深度学习入门
- typescript77-在CRA创建支持ts的项目
- 理论学习:标量衍射理论(2)
- 今天是个好日子 -20141125
- 0 17在c语言中什么意思,exit(0)在c语言中是什么意思
热门文章
- 最新短网址生成api接口(t.cn、url.cn短链接生成)
- 上拉、下拉电阻的原理和作用
- 安全单点登录(SSO)解决方案
- 时钟周期、机器周期、指令周期、总线周期的区别
- Python数据可视化——图型参数介绍
- Comparator--比较器
- 给定一个10位的整数组成的串,形式如: d1d2d3d4d5d6d7d8d9d10 。 其中最后的一位(即 )是校验和,其使用以下运算规则以前面的9位上的整数作为参数获得结果
- 买卖股票跟帮老婆买菜是一码事
- device 查看tensor_Tensor数据操作
- Python 解决execjs._exceptions.ProgramError: ReferenceError: document is not defined报错问题