基于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.空地 4.墙壁 5.目的地 6.到达目的地的箱子

2.推箱子规则

1.“小人”只能在“空地”和“目的地”上行走
2.“小人”可以推“箱子后面是 ‘空地’和‘目的地’ ”的“箱子”
3.所有“箱子”到达“目的地”游戏获胜

三、游戏设计

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

1.地图设计

首选需要知道的是,游戏地图是一个二维数组
根据玩推箱子的经验可以知道,游戏中会出现哪些组合情况

  1. “小人”在“目的地”
  2. “箱子”在“目的地”

下面我们给这些情况定义一些变量,数字大家可以随意,对应就好

enum material
{space=0,//空地wall=1,//墙壁box=3, //箱子person=4,//小人aim=5,//目的地    box_aim=8,//箱子在目的地 3+5=8person_aim=9,//小人在目的地  4+5=9
};

元素和数字已经对应起来了,先写一个初始化加载图片函数Loadimg(),素材就放在源文件旁边

#define SIZE 35//每个元素的大小IMAGE img[10];//存放小图片void Loadimg()//加载资源
{loadimage(&img[0],L"./images/0.jpg",SIZE,SIZE);//空地loadimage(&img[1],L"./images/1.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[8],L"./images/8.jpg",SIZE,SIZE);//箱子在目的地
}

然后你就知道为什么游戏地图是一个二维数组

是不是switch,case根据数字贴图就完事了,就是这么easy,一关怎么能行呢,当然要很多关,二维不够三维来凑,定义一个全局变量map三维数组,和全局变量number存放关卡数

int number=0;//存放关卡数,当前第一关
int map[3][7][7]=
{   //第一关1,1,1,1,1,1,1,1,5,0,0,0,5,1,1,0,3,0,3,0,1,1,0,0,4,0,0,1,1,0,3,0,3,0,1,1,5,0,0,0,5,1,1,1,1,1,1,1,1,//第二关1,1,1,1,1,1,1,1,5,5,5,5,5,1,1,0,0,3,0,0,1,1,0,3,3,3,0,1,1,0,0,3,0,0,1,1,0,0,4,0,0,1,1,1,1,1,1,1,1,//第三关1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,5,1,5,1,3,1,1,0,3,0,5,0,1,1,3,1,3,1,0,1,1,4,0,0,0,5,1,1,1,1,1,1,1,1,
};

地图定义好了,那就贴图吧,写一个Drawmap()函数画地图

#define ROWS 7//行数
#define COLS 7//列数void Drawmap()
{int i,j,x,y;for (i = 0; i < ROWS; i++){for (j = 0; j < COLS; j++){x=0;y=0;x += j * SIZE, y += i * SIZE;//确定每个图片的坐标switch (map[number][i][j]){case space://空地putimage(x, y, &img[space]);break;case wall://墙壁putimage(x, y, &img[wall]);break;case box://箱子putimage(x, y, &img[box]);break;case person://小人putimage(x, y, &img[person]);break;case aim://目的地putimage(x, y, &img[aim]);break;case box_aim://箱子在目的地putimage(x, y, &img[box_aim]);break;case person_aim://人在目的地还是人putimage(x, y, &img[person]);break;}}printf("\n");}system("cls");//清屏
}

2.移动设计

上文提到

1.“小人”只能在“空地”和“目的地”上行走
2.“小人”可以推“箱子后面是 ‘空地’和‘目的地’ ”的“箱子”

那么每次移动完都需要确定小人的位置,再判断能否移动

先定义全局变量记录小人位置,再写一个获取小人位置的函数Getpersonxy()

int ipos,jpos;//记录小人位置void Getpersonxy()
{int i,j;for (i = 0; i < ROWS; i++){  for (j = 0; j < COLS; j++){if(map[number][i][j]==person || map[number][i][j]==person_aim){//找到小人 或者 小人在目的地ipos=i;jpos=j;//找到小人位置break;}}}
}

找到小人位置后判断小人是否能移动,写一个Moveperson()函数,这个就要划重点了

void Moveperson()
{PlaySound(L"./images/move.wav", nullptr, SND_FILENAME | SND_ASYNC);//播放移动音乐char ch = _getch();switch (ch)//控制小人走{case 'w':case 'W':case 72://小键盘键值if (map[number][ipos-1][jpos] == space || map[number][ipos-1][jpos] == aim){//人前面是空地或者目的地map[number][ipos-1][jpos]+=person;//人来了map[number][ipos][jpos]-=person;//人走了}else if (map[number][ipos-1][jpos] == box || map[number][ipos-1][jpos] == box_aim){//人前面是箱子或者箱子在目的地//判断箱子是否能走if (map[number][ipos-2][jpos] == space || map[number][ipos-2][jpos] == aim)//箱子前面是空地或者目的地 才能走{map[number][ipos-2][jpos]+=box ; //箱子来了map[number][ipos-1][jpos]+=person-box ;//人来了 箱子走了 map[number][ipos][jpos]-=person;//人走了}}break;case 's':case 'S':case 80://小键盘键值if (map[number][ipos+1][jpos] == space || map[number][ipos+1][jpos] == aim){//人前面是空地或者目的地map[number][ipos+1][jpos]+=person;//人来了map[number][ipos][jpos]-=person;//人走了}else if (map[number][ipos+1][jpos] == box || map[number][ipos+1][jpos] == box_aim){//人前面是箱子或者箱子在目的地//判断箱子是否能走if (map[number][ipos+2][jpos] == space || map[number][ipos+2][jpos] == aim)//箱子前面是空地或者目的地 才能走{map[number][ipos+2][jpos]+=box ; //箱子来了map[number][ipos+1][jpos]+=person-box;//人来了 箱子走了 map[number][ipos][jpos]-=person;//人走了}}break;case 'a':case 'A':case 75://小键盘键值if (map[number][ipos][jpos-1] == space || map[number][ipos][jpos-1] == aim){//人前面是空地或者目的地map[number][ipos][jpos-1]+= person;//人来了map[number][ipos][jpos]-= person;//人走了}else if (map[number][ipos][jpos-1] == box || map[number][ipos][jpos-1] == box_aim){//人前面是箱子或者箱子在目的地//判断箱子是否能走if (map[number][ipos][jpos-2] == space || map[number][ipos][jpos-2] == aim)//箱子前面是空地或者目的地 才能走{map[number][ipos][jpos-2]+=box ; //箱子来了map[number][ipos][jpos-1]+=person-box ;//人来了 箱子走了 map[number][ipos][jpos]-=person;//人走了}}break;case 'd':case 'D':case 77://小键盘键值if (map[number][ipos][jpos+1] == space || map[number][ipos][jpos+1] == aim){//人前面是空地或者目的地map[number][ipos][jpos+1]+=person;//人来了map[number][ipos][jpos]-=person;//人走了}else if (map[number][ipos][jpos+1] == box || map[number][ipos][jpos+1] == box_aim){//人前面是箱子或者箱子在目的地//判断箱子是否能走if (map[number][ipos][jpos+2] == space || map[number][ipos][jpos+2] == aim)//箱子前面是空地或者目的地 才能走{map[number][ipos][jpos+2]+=box ; //箱子来了map[number][ipos][jpos+1]+=person-box ;//人来了 箱子走了 map[number][ipos][jpos]-=person;//人走了}}break;}
}

3.结束设计

上文提到

3.所有“箱子”到达“目的地”游戏获胜**

也就是判断地图上是否有box,如果有,游戏继续,没有box,进入下一关,写一个Gameover()函数

int Gameover()
{int i, j;for (i = 0; i < ROWS; i++){for (j = 0; j < COLS; j++){//遍历地图是否有箱子 if (map[number][i][j] == box){return 0;//有箱子退出循环 继续}}}return 1;
}

4.整体设计

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

#include<stdio.h>
#include<easyx.h>//图形库
#include<conio.h>//按键
#include<mmsystem.h>//音乐
#pragma comment(lib,"winmm.lib")//库文件int main()
{initgraph(SIZE*7,SIZE*7);//创建地图大小的窗口Loadimg();//加载资源//循环播放背景音乐mciSendString(L"open ./images/bg.mp3 ", 0, 0, 0);mciSendString(_T("play ./images/bg.mp3 repeat"), 0, 0, 0);while(true){//绘制界面BeginBatchDraw();Drawmap();//贴地图EndBatchDraw();if (Gameover()){ PlaySound(L"./images/success.wav", nullptr, SND_FILENAME | SND_ASYNC);//播放胜利音乐number++;//进入下一关Sleep(500);if (number>= 3)break;//第三关玩完结束}if (_kbhit())//获取按键消息{Getpersonxy();//找到小人位置Moveperson();//小人移动}    }mciSendString(L"close ./images/bg.mp3",0,0,0);//关闭背景音乐setbkmode(0);//设置文字背景透明settextcolor(RGB(167, 48, 48));//设置字体颜色settextstyle(30, 0, _T("宋体"));//64是字体大小 0是自适应 双引号里可以填字体名字outtextxy(0, 110, _T("游戏结束,你真棒!"));Sleep(5000);closegraph();//关闭窗口return 0;
}

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

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

基于EasyX的推箱子游戏相关推荐

  1. 基于java的推箱子游戏系统设计与实现(项目报告+答辩PPT+源代码+部署视频)

    项目报告 基于Java的推箱子游戏设计与实现 社会在进步,人们生活质量也在日益提高.高强度的压力也接踵而来.社会中急需出现新的有效方式来缓解人们的压力.此次设计符合了社会需求,Java推箱子游戏可以让 ...

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

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

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

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

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

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

  5. EasyX实现推箱子游戏

    文章目录 1 项目需求 2 模块划分 3 项目实现 3.1 地图初始化 3.2 热键控制 3.3 推箱子控制 3.4 游戏结束 1 项目需求 实现一款推箱子游戏,效果如下图所示,具体规则: 箱子只能推 ...

  6. 基于Python3-Pygame的推箱子游戏

    发现一款不错的小游戏,玩起来挺有趣,学习的话也有源码可以研究,分享出来大家一起学习. 原项目地址:https://gitee.com/milowork/cangkufan?_from=gitee_se ...

  7. 【java毕业设计】基于java+swing+Eclipse的推箱子游戏设计与实现(毕业论文+程序源码)——推箱子游戏

    基于java+swing+Eclipse的推箱子游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+swing+Eclipse的推箱子游戏设计与实现,文章末尾附有本毕业设计的论文 ...

  8. 基于Java+Swing实现推箱子游戏

    基于Java+Swing实现推箱子游戏 一.系统介绍 二.功能展示 三.其他系统 四.获取源码 一.系统介绍 基于JAVA的推箱子游戏系统主要用于实现游戏推箱子功能,提供多种不同难度的关卡.本系统结构 ...

  9. c语言基于easyX樱花特效,C++基于easyx图形库实现推箱子游戏

    本文实例为大家分享了C++实现推箱子游戏的具体代码,供大家参考,具体内容如下 头文件: #include #include //#include #include #include #include ...

  10. 推箱子游戏java毕业答辩ppt_基于Java推箱子游戏的设计与实现

    基于Java推箱子游戏的设计与实现(任务书,外文翻译,毕业论文20000字,程序代码,答辩PPT) 摘    要 社会在进步,人们生活质量也在日益提高.高强度的压力也接踵而来.社会中急需出现新的有效方 ...

最新文章

  1. AngularJS之Service(四)
  2. css 调用变量 php,PHP 变量
  3. MPSOC之3——centos环境配置及petalinux安装及使用
  4. FXK Javascript
  5. 利用python爬虫(part2)--urllib.parse模块
  6. 【312】◀▶ arcpy 常用函数说明
  7. [html] 举例说明当我们在写布局时,都有哪些边界的情况需要关注的?
  8. H.264算法的DSP移植与优化
  9. IT永远也不可能做到整体外包,这句话是我说的。。。
  10. display:none的表单也会被提交
  11. input中的name,value以及label中的for
  12. HUE与Zookeeper的集成
  13. 使用playsound播放音频(python)
  14. pandas读取excel文件(内含多张表)
  15. Linux sftp命令
  16. 中琅条码打印软件如何批量打印单色黑流水号
  17. 写博客,轻松拿大奖!博客征文第二期:那些年我们一起写过的代码
  18. 【算法岗求职笔记】降维 · 五问五答
  19. 明光市机器人_明光市情侣酒店客房语音智能控制系统厂家
  20. AUTOCAD——拉伸命令、拉长命令

热门文章

  1. 通过PS的图层样式制作透明的玻璃字
  2. C#小游戏,拼音打字练习
  3. LayUI分页查询展示数据(SSH框架)
  4. Flink 开发环境部署和配置
  5. QMH、AMC和STM之间的关系
  6. .mdf数据库恢复mysql_恢复mdf文件到数据库方法
  7. 工作近半年的一些个人感悟
  8. mysql analyze_技术分享 | MySQL EXPLAIN ANALYZE
  9. 总结Windows查看产品密匙方法
  10. 网口扫盲三:以太网芯片MAC和PHY的关系