简单易学的推箱子源代码大放送
#include<easyx.h>
#include<conio.h>
//推箱子项目 10行10列的图片 ,假设每一个图片是正方形(边长50)
//1、打开窗口
//2、定义图片数组,把图片加载进图片数组里
//3、通过图片数组,把图片贴在图形窗口;定义一个三维数组(作为多个地图),定义辅助数组:把当前关卡的地图装进辅助数组里面
//4、人物的移动
//5、关卡的胜利判断
IMAGE img[5];//定义图片数组
//0表示空地 1表示墙 2表示人 3表示箱子 4表示目的地 6表示人在目的地上 7表示箱子在目的地上
int arr[3][10][10] =
{
{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 4, 0, 0, 0, 0, 0, 0, 1,
1, 0, 3, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 2, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1
},
{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 1, 0, 0, 0, 0, 1, 1,
1, 0, 4, 4, 4, 0, 4, 0, 0, 1,
1, 3, 3, 3, 0, 3, 3, 0, 1, 1,
1, 4, 3, 0, 2, 0, 3, 0, 0, 1,
1, 1, 0, 0, 0, 3, 0, 0, 1, 1,
1, 1, 0, 4, 4, 4, 0, 1, 1, 1,
1, 1, 1, 0, 0, 1, 1, 1, 1, 1,
1, 1, 0, 0, 0, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1
},
{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 4, 3, 0, 3, 4, 0, 1, 1,
1, 0, 4, 3, 0, 3, 4, 0, 1, 1,
1, 0, 4, 3, 0, 3, 4, 0, 1, 1,
1, 0, 4, 3, 2, 3, 4, 0, 1, 1,
1, 0, 4, 3, 0, 3, 4, 0, 1, 1,
1, 0, 4, 3, 0, 3, 4, 0, 1, 1,
1, 0, 0, 3, 3, 3, 0, 0, 1, 1,
1, 0, 0, 4, 4, 4, 0, 0, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1
}
};
int tempMap[10][10];//辅助数组 保存当前所在关卡的地图
int level = 0;//表示关卡
//函数功能:初始化地图
void initMap()
{
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
tempMap[i][j] = arr[level][i][j];//在这个三位数组中level,可以理解成第几个二维数组(从0开始)
}
}
}
//函数功能:把图片加载进图片数组里
void picLoadArr()
{
loadimage(&img[0], "1.jpg", 50, 50);//墙
loadimage(&img[1], "2.jpg", 50, 50);//人
loadimage(&img[2], "3.jpg", 50, 50);//箱子
loadimage(&img[3], "4.jpg", 50, 50);//目的地
loadimage(&img[4], "7.jpg", 50, 50);//箱子在目的地上
}
//函数功能:把图片贴在图形界面上
void drawMap()
{
BeginBatchDraw();//开始批量绘图
//putimage(200, 300, &img[0]);//贴墙
//putimage(200, 400, &img[1]);//贴人
//putimage(300, 300, &img[2]);//贴箱子
//putimage(300, 400, &img[3]);//贴目的地
//putimage(400, 400, &img[4]);//贴箱子在目的地上
//图形窗口的x坐标:与列下标j有关,50*j
//图形窗口的y坐标:与行下标i有关,50*i
for (int i = 0; i < 10; i++)//i作为二维数组的行下标
{
for (int j = 0; j < 10; j++)//j作为二维数组的列下标
{
switch (tempMap[i][j])
{
//贴墙
case 1:
putimage(j*50, i*50, &img[0]);
break;
//贴人物
case 2:
case 6:
putimage(j * 50, i * 50, &img[1]);
break;
//贴箱子
case 3:
putimage(j * 50, i * 50, &img[2]);
break;
//贴目的地
case 4:
putimage(j * 50, i * 50, &img[3]);
break;
//贴 箱子在目的地上
case 7:
putimage(j * 50, i * 50, &img[4]);
break;
}
}
}
EndBatchDraw();//结束批量绘制
}
//函数功能:人物移动
void move()
{
int X = 0, Y = 0;//X用来保存人物的行下标 Y用来保存人物的列下标
for (int i = 0; i <= 9; i++)
{
for (int j = 0; j <= 9; j++)
{
if (tempMap[i][j] == 2 || tempMap[i][j]==6)//找到了人
{
X = i;
Y = j;
break;
}
}
}
//通过改变二维数组元素的值,来形成一个人物移动的效果
//通过按键,判断人物的移动方向 asdw
//conio.h _getch()函数:等待从键盘输入一个字符,不需要和getchar函数一样以回车结束
switch (_getch())
{
//人物往上移动
case 'w':
if (tempMap[X - 1][Y] == 0 || tempMap[X - 1][Y] == 4)//人的上面是空地,或者是目的地
{
tempMap[X - 1][Y] = tempMap[X - 1][Y] + 2;
tempMap[X][Y] = tempMap[X][Y] - 2;
}
if (tempMap[X - 1][Y] == 3 || tempMap[X - 1][Y] == 7)//如果人的上面是箱子,或者人的上面是箱子在目的地上
{
if (tempMap[X - 2][Y] == 0 || tempMap[X - 2][Y] == 4)//如果箱子的上面是空地,或者是目的地
{
tempMap[X][Y] -= 2; //完全等价 tempMap[X][Y] = tempMap[X][Y] - 2;
tempMap[X - 1][Y] -= 1;
tempMap[X - 2][Y] += 3;
}
}
break;
case 's'://人物往下移动
if (tempMap[X + 1][Y] == 0 || tempMap[X + 1][Y] == 4)//如果人的下面是空地,或者是目的地,人就可以往下走
{
tempMap[X][Y] -= 2;
tempMap[X + 1][Y] += 2;
}
if (tempMap[X + 1][Y] == 3 || tempMap[X + 1][Y] == 7)//如果人的下面是箱子,或者人的下面是箱子在目的地上
{
if (tempMap[X + 2][Y] == 0 || tempMap[X + 2][Y] == 4)//如果箱子的下面是空地,或者是目的地
{
tempMap[X][Y] -= 2;
tempMap[X + 1][Y] -= 1;
tempMap[X + 2][Y] += 3;
}
}
break;
case 'a'://人物往左移动
if (tempMap[X][Y-1] == 0 || tempMap[X][Y-1] == 4)//如果人的左面是空地,或者是目的地,人就可以往左走
{
tempMap[X][Y] -= 2;
tempMap[X][Y-1] += 2;
}
if (tempMap[X][Y-1] == 3 || tempMap[X][Y-1] == 7)//如果人的左面是箱子,或者人的左面是箱子在目的地上
{
if (tempMap[X][Y-2] == 0 || tempMap[X][Y-2] == 4)//如果箱子的左面是空地,或者是目的地
{
tempMap[X][Y] -= 2;
tempMap[X][Y-1] -= 1;
tempMap[X][Y-2] += 3;
}
}
break;
case 'd'://人物往右移动
if (tempMap[X][Y + 1] == 0 || tempMap[X][Y + 1] == 4)//如果人的右面是空地,或者是目的地,人就可以往右走
{
tempMap[X][Y] -= 2;
tempMap[X][Y + 1] += 2;
}
if (tempMap[X][Y + 1] == 3 || tempMap[X][Y + 1] == 7)//如果人的右面是箱子,或者人的右面是箱子在目的地上
{
if (tempMap[X][Y + 2] == 0 || tempMap[X][Y + 2] == 4)//如果箱子的右面是空地,或者是目的地
{
tempMap[X][Y] -= 2;
tempMap[X][Y + 1] -= 1;
tempMap[X][Y + 2] += 3;
}
}
}
}
//函数功能:判断是否通过关卡
void isWin()
{
//找不到箱子(3),就是通过关卡
for (int i = 0; i <= 9; i++)
{
for (int j = 0; j <= 9; j++)
{
if (tempMap[i][j] == 3)//只要辅助数组里面有一个箱子(3),就继续推箱子
{
return;
}
}
}
//如果函数到这里还没有结束,表示已经通过了当前关卡
//如果到最后一关
if (level==2)//选择结束还是重新开始
{//MessageBox消息盒子:弹出一个窗口
int temp=MessageBox(GetHWnd(), "是否开始第一关", "提示", MB_YESNO);//窗口弹出两个按钮,一个是(6),一个否(7)
if (temp == IDYES)//如果我们按下的是:是
{
level = 0;//重新开始
initMap();//重新加载地图
}
else
{
exit(0);//退出程序
}
}
//否则就继续下一关卡
else
{
level++;
initMap();//重新加载地图
}
}
int main()
{
initgraph(500, 500);//初始化窗口
picLoadArr();//把图片加载进图片数组里
level = 2;
initMap();//把当前的关卡,装进辅助地图中
while (1)
{
isWin();//判断是否胜利
cleardevice();//清除屏幕
drawMap();//画地图
move();//人物的移动
cleardevice();//清除屏幕
drawMap();//画地图
}
closegraph();//关闭窗口
return 0;
}
简单易学的推箱子源代码大放送相关推荐
- ym——android源代码大放送(实战开发必备)
转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 目录 PATH 列表 卷序列号为 000A-8F50 E:. │ javaapk.c ...
- 【算力大放送2】GPU 专属服务器使用教程!!!
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 昨天,已给大家放送了如何获取免费GPU的方法,可以查看[算力大放送]专属 GPU ...
- 中秋福利大放送!教你既可朝九晚五,又可诗和远方!
2019独角兽企业重金招聘Python工程师标准>>> 中秋福利大放送!教你既可朝九晚五,又可诗和远方! 1.不废话,上福利! 中秋节佳节将至,提前祝所有关注「飞鱼说编程」的小伙伴们 ...
- mysql+8.0+新特性_MySQL 8.0备受瞩目的新特性大放送!
原标题:MySQL 8.0备受瞩目的新特性大放送! 作者介绍 杨奇龙,目前就职于有赞科技,负责数据库运维工作,熟悉MySQL性能优化.故障诊断.性能压测. MySQL于 2016-09-12正式发布8 ...
- 「分布式系统之美」知乎圆桌精选大放送第二期|不要放过任何你感兴趣的话题
相信大家看完上周「分布式系统之美」知乎圆桌精选大放送后还意犹未尽,新的一轮热门讨论已被小编盘点下来,快来跟随小编一起看看有什么新的答案吧. 标题精选问题 & 回答 MySQL 单表日均 15 ...
- 福州大学计算机英语复试自我介绍,英语复试攻略大放送!
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 英语复试攻略大放送! 21届考研人,初试成绩快要出来了,复试还远吗?学姐和大家分享下复试中英语的一些攻略吧.预祝大家一研为定,成功上岸! 英语复试的形式 ...
- 阿里系唯一对外开放数据分享平台天池数据集2020收官精品合集大放送
**简介:**阿里系唯一对外开放数据分享平台天池数据集2020收官精品合集大放送 作为国内"AI众智"首选平台,阿里云天池除了面向国内开发者组织大数据竞赛.免费开放AI学习内容.提 ...
- 从回收站删除的文件如何恢复?独门诀窍大放送
从回收站删除的文件如何恢复?我们往往在删除一些文件后,才发现这些文件的用处.这个时候,我们就需要进行回收站文件恢复了. 要进行回收站删除文件恢复,我们不能继续往删除数据的分区写入新数据,这是我们需要注 ...
- 九款mac必装软件大放送~~
mac电脑上手,想要快速的提高效率,一些必要的软件不可缺少,在众多软件中小编整理了几款专业.高效.简便的软件分享给大家,有了这些软件让您瞬间化身mac达人,一起来看看吧~ 九款mac必装软件大放送~~ ...
最新文章
- 编译器设计-代码优化
- eclipse导入lombok后打不开(如果你的lombok不是最新的,那就来下载最新的)
- 阿里团队最新实践:如何解决大规模分类问题?
- js变量传给java_如何把JavaScript中的变量值传给javabean?
- java怎么将字符串反序输出_对String字符串进行反序输出
- ubuntu linux下解决“no java virtual machine was found after searching the following locations:”的方法
- Maven配置将war包部署到Tomcat(tomcat7-maven-plugin)
- Zing加快了JVM应用程序的预热
- java的tcp实时接收json格式报文_tcp - 如何使用带有rsocket Java的TcpClientTransport将自定义数据格式转换为JSON - 堆栈内存溢出...
- CI如何接受POST请求中的JSON数据
- static关键字作用总结
- mysql批量插入优化
- win2003群集cluster下SQL2005和sp3补丁安装配置3
- springboot引入validation
- valgrnd调试详解
- window安装Linux
- php checkmobile,如何在php中檢查請求是來自移動設備還是計算機
- 人力资源数据分析 - case 分析拉钩数据分析师岗位
- Stochastic Answer Networks for Machine Reading Comprehension读书笔记
- Linux中的sda, sdb, sdc, sda1, sda2含义
热门文章
- 静态时序分析—时钟延时(Clock Latency)
- 笑话集网站最近更新网站内容采集
- Windows——[检测到可能的windows 更新数据库错误]解决方案
- 苹果cms利用定时任务生成静态执行操作
- 功利,是一种思维模式
- electron 打包后启动应用报错:Error: ENOENT: no such file or directory, open ‘xxx/manifest.json‘‘
- android 多包名apk,一个项目如何编译多个不同签名、包名、资源等,的apk?
- 解决Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart
- Flask 教程 第十三章:国际化和本地化 1
- “阿里云之父”王坚:硅谷不应当成为我们的天花板 | 腾讯2017年Q3营收同比增61%