需要源码和资源请点赞关注收藏后评论区留言私信~~~

在前面的博客中已经讲解了推箱子游戏的菜单和各种对话框的实现,下面对推箱子游戏的核心算法设计和实现进行讲解

一、地图文件读取模块的设计与实现

地图文件读取模块,主要负责将地图文件进行读取,并把相应的文件数据转换成地图显示出来,其设计步骤如下

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++实现推箱子游戏的核心算法设计与实现(附源码和和资源)相关推荐

  1. 【Java游戏开发合集】毕业设计(附源码+资料+课件)

    为正在准备毕业设计的小伙伴们以及想自学一些Java练手项目,小编终于整理出了本套视频课程(附源码+资料+课件),快来白嫖吧!!! 视频教程链接: 全站最全Java游戏合集!毕业设计!(附源码课件)8款 ...

  2. Adroid游戏开发实例讲解(三)-小蝌蚪找妈妈附源码

    Adroid游戏开发实例讲解(三)-小蝌蚪找妈妈附源码 程序之美 从小就听着小蝌蚪找妈妈的故事长大,我相信小伙伴们一定都不陌生,因为小学课本中,我们早早的就学过了小蝌蚪找妈妈这篇文章,它既是一篇文章, ...

  3. 基于单片机的推箱子游戏设_推箱子游戏51单片机课设计(最全).doc

    <51单片机> 课程设计 题 目:基于51单片机的推箱子游戏设计 目 录 1.课程设计目的1 2.课程设计题目和实现目标1 3.设计方案1 4.Proteus仿真原理图7 5.程序设计9 ...

  4. 深度强化学习中Double DQN算法(Q-Learning+CNN)的讲解及在Asterix游戏上的实战(超详细 附源码)

    需要源码和环境搭建请点赞关注收藏后评论区留下QQ~~~ 一.核心思想 针对DQN中出现的高估问题,有人提出深度双Q网络算法(DDQN),该算法是将强化学习中的双Q学习应用于DQN中.在强化学习中,双Q ...

  5. jsp+ssm计算机毕业设计游戏装备交易网站论文2022【附源码】

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  6. 【pygame游戏】用Python实现一个蔡徐坤大战篮球的小游戏,可还行?【附源码】

    Python制作坤坤打篮球小游戏 序言 准备工作 开发环境 效果预览 开始界面 游戏规则 结束游戏 代码实现 序言 话说在前面,我不是小黑子~ 我是超级大黑子

  7. 实现简单迷宫小游戏(几行代码)-免费附源码

    本次实现的思路 就是需要打印一个迷宫通道  然后通过wasd来控制物体移动 我们通过 实现 打印 空格 进行实现将一开始的小球 消失 操作 使用函数 getch这个录入一个字符 并且 这个录入的字符不 ...

  8. C语言+easyx图形库 推箱子游戏1.0

    本人编程小白,在学完C语言后尝试学习制作了推箱子小游戏,途中收获颇多,在此对于整个过程做一回顾梳理,若有写的不对的地方,还望各位大佬指正. 本篇文章为1.0版本,没有关卡,但拥有推箱子游戏较核心的功能 ...

  9. c语言语音控制游戏文献,C语言课程设计-基于C语言推箱子游戏设计-毕业论文文献.doc...

    gd工程职业技术学院毕业论文 基于C语言的推箱子游戏设计 Design of the push box Based on Combined Language 作者姓名: 学科专业: 应用电子技术 学院 ...

最新文章

  1. 【响应式Web前端设计】Register Demo
  2. wifi一阵一阵卡_家里wifi总是过一会就卡一下然后又好了
  3. OpenOffice介绍
  4. 外设驱动库开发笔记16:MS5536C压力变送器驱动
  5. 分久必合的Lindorm传奇
  6. mysql写偏斜_【MySQL】探究之常用SQL
  7. 服务器磁盘空间占用,大文件查找
  8. hnu小学期实训之数圈
  9. Intellij idea智能提示设置
  10. Flink reduce详解
  11. java小组项目口号,小组口号霸气押韵大全(精选60句)
  12. 如何设计并实现传统小区智能化
  13. [转]增强型N沟道mos管(如si2300)开关条件
  14. 语音识别基础算法——动态时间规整算法
  15. 数据融合-机器人定位
  16. 什么是交叉熵啊?| 小白深度学习入门
  17. typescript77-在CRA创建支持ts的项目
  18. 理论学习:标量衍射理论(2)
  19. 今天是个好日子 -20141125
  20. 0 17在c语言中什么意思,exit(0)在c语言中是什么意思

热门文章

  1. 最新短网址生成api接口(t.cn、url.cn短链接生成)
  2. 上拉、下拉电阻的原理和作用
  3. 安全单点登录(SSO)解决方案
  4. 时钟周期、机器周期、指令周期、总线周期的区别
  5. Python数据可视化——图型参数介绍
  6. Comparator--比较器
  7. 给定一个10位的整数组成的串,形式如: d1d2d3d4d5d6d7d8d9d10 。 其中最后的一位(即 )是校验和,其使用以下运算规则以前面的9位上的整数作为参数获得结果
  8. 买卖股票跟帮老婆买菜是一码事
  9. device 查看tensor_Tensor数据操作
  10. Python 解决execjs._exceptions.ProgramError: ReferenceError: document is not defined报错问题