#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;
}

简单易学的推箱子源代码大放送相关推荐

  1. ym——android源代码大放送(实战开发必备)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 目录 PATH 列表 卷序列号为 000A-8F50 E:. │  javaapk.c ...

  2. 【算力大放送2】GPU 专属服务器使用教程!!!

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 昨天,已给大家放送了如何获取免费GPU的方法,可以查看[算力大放送]专属 GPU ...

  3. 中秋福利大放送!教你既可朝九晚五,又可诗和远方!

    2019独角兽企业重金招聘Python工程师标准>>> 中秋福利大放送!教你既可朝九晚五,又可诗和远方! 1.不废话,上福利! 中秋节佳节将至,提前祝所有关注「飞鱼说编程」的小伙伴们 ...

  4. mysql+8.0+新特性_MySQL 8.0备受瞩目的新特性大放送!

    原标题:MySQL 8.0备受瞩目的新特性大放送! 作者介绍 杨奇龙,目前就职于有赞科技,负责数据库运维工作,熟悉MySQL性能优化.故障诊断.性能压测. MySQL于 2016-09-12正式发布8 ...

  5. 「分布式系统之美」知乎圆桌精选大放送第二期|不要放过任何你感兴趣的话题

    相信大家看完上周「分布式系统之美」知乎圆桌精选大放送后还意犹未尽,新的一轮热门讨论已被小编盘点下来,快来跟随小编一起看看有什么新的答案吧. 标题精选问题 & 回答 MySQL 单表日均 15 ...

  6. 福州大学计算机英语复试自我介绍,英语复试攻略大放送!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 英语复试攻略大放送! 21届考研人,初试成绩快要出来了,复试还远吗?学姐和大家分享下复试中英语的一些攻略吧.预祝大家一研为定,成功上岸! 英语复试的形式 ...

  7. 阿里系唯一对外开放数据分享平台天池数据集2020收官精品合集大放送

    **简介:**阿里系唯一对外开放数据分享平台天池数据集2020收官精品合集大放送 作为国内"AI众智"首选平台,阿里云天池除了面向国内开发者组织大数据竞赛.免费开放AI学习内容.提 ...

  8. 从回收站删除的文件如何恢复?独门诀窍大放送

    从回收站删除的文件如何恢复?我们往往在删除一些文件后,才发现这些文件的用处.这个时候,我们就需要进行回收站文件恢复了. 要进行回收站删除文件恢复,我们不能继续往删除数据的分区写入新数据,这是我们需要注 ...

  9. 九款mac必装软件大放送~~

    mac电脑上手,想要快速的提高效率,一些必要的软件不可缺少,在众多软件中小编整理了几款专业.高效.简便的软件分享给大家,有了这些软件让您瞬间化身mac达人,一起来看看吧~ 九款mac必装软件大放送~~ ...

最新文章

  1. 编译器设计-代码优化
  2. eclipse导入lombok后打不开(如果你的lombok不是最新的,那就来下载最新的)
  3. 阿里团队最新实践:如何解决大规模分类问题?
  4. js变量传给java_如何把JavaScript中的变量值传给javabean?
  5. java怎么将字符串反序输出_对String字符串进行反序输出
  6. ubuntu linux下解决“no java virtual machine was found after searching the following locations:”的方法
  7. Maven配置将war包部署到Tomcat(tomcat7-maven-plugin)
  8. Zing加快了JVM应用程序的预热
  9. java的tcp实时接收json格式报文_tcp - 如何使用带有rsocket Java的TcpClientTransport将自定义数据格式转换为JSON - 堆栈内存溢出...
  10. CI如何接受POST请求中的JSON数据
  11. static关键字作用总结
  12. mysql批量插入优化
  13. win2003群集cluster下SQL2005和sp3补丁安装配置3
  14. springboot引入validation
  15. valgrnd调试详解
  16. window安装Linux
  17. php checkmobile,如何在php中檢查請求是來自移動設備還是計算機
  18. 人力资源数据分析 - case 分析拉钩数据分析师岗位
  19. Stochastic Answer Networks for Machine Reading Comprehension读书笔记
  20. Linux中的sda, sdb, sdc, sda1, sda2含义

热门文章

  1. 静态时序分析—时钟延时(Clock Latency)
  2. 笑话集网站最近更新网站内容采集
  3. Windows——[检测到可能的windows 更新数据库错误]解决方案
  4. 苹果cms利用定时任务生成静态执行操作
  5. 功利,是一种思维模式
  6. electron 打包后启动应用报错:Error: ENOENT: no such file or directory, open ‘xxx/manifest.json‘‘
  7. android 多包名apk,一个项目如何编译多个不同签名、包名、资源等,的apk?
  8. 解决Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart
  9. Flask 教程 第十三章:国际化和本地化 1
  10. “阿里云之父”王坚:硅谷不应当成为我们的天花板 | 腾讯2017年Q3营收同比增61%