精华内容
下载资源
问答
  • C++ 推箱子

    2012-10-09 13:51:32
    用C+=编写的推箱子游戏,功能简单易学,适合初学者使用
  • 推箱子c++推箱子.zip

    2020-03-28 18:18:59
    推箱子c++
  • C++推箱子源码

    2014-09-16 12:20:42
    经典的c++推箱子源码,关卡虽然不太多,但可以添加.因为算法都写好了的再多也是一样的
  • C++ 推箱子 源码

    2011-07-24 17:24:34
    C++ 推箱子 源码 适合SDK 初学者
  • C++推箱子游戏

    2012-10-17 08:53:11
    C++推箱子游戏 经典的小游戏,是学习C++来开发游戏的好实例。本人正在学习,拿出来与大家分享,共同学习。
  • C++推箱子游戏源代码

    2019-02-11 21:06:21
    C++推箱子完整代码,包含背景音乐播放,退步,跳过本关,更换背景颜色等多种功能,下载绝不会后悔。
  • C++ 推箱子 源程序

    2010-09-13 18:22:30
    C++ 推箱子 源程序,需要的可自行下载。
  • C++推箱子游戏最全源代码,游戏开发初学者必备可以进行扩展
  • 一个适合初学者的C++推箱子小游戏

    千次阅读 多人点赞 2018-11-11 19:51:35
    一个适合初学者的C++推箱子小游戏 当把所有箱子推到目的地,就完成游戏

    一个适合初学者的C++推箱子小游戏

    博主最近在学习关于C++的一些基础,这是本人突发奇想做的一个小游戏,编程其实并不难,重要的是,你的思路,以及优化,当然,这个小游戏,本人也是基于一个学习者编写的

    本篇文章会教大家用C++基本语句来实现一个推箱子的小游戏。

    展示

    这是游戏开始时的界面。

    游戏开始界面
    当然,如果你喜欢,你可以任意更改地图:
    在这里插入图片描述
    当把所有箱子推到目的地,就完成游戏
    在这里插入图片描述

    思路:

    当有一个问题出现的时候,我们首先应该先考虑这个问题有可能的解法:
    这里博主想到的方法是

    1. 通过二维数组来存储地图信息
    2. 通过交换数组元素,来达到角色移动的目的
    3. 而推箱子,则让箱子和角色同步移动便可。
    4. 移动控制:_getch()

    ps:_getch()方法需要头文件conio.h的支持,功能是不需要按回车键便可以得到输入的字符

    那么这里我们有了大概的思路,但是再实际操作中,我们发现二维数组并不方便,因为它有两个下标,会加剧问题的复杂度,这里我们用一维数组便可。
    移动:我们知道地图是一个方形:要么是m*n,要么就是m^2(正方形);
    在这里插入图片描述

    这里我们简单绘制一个长4,宽4的长方体来说明:
    在这里插入图片描述
    如果我在5的位置,那么我要左移,应该是当前位置 -1,同样,向右便是 +1,向上 -4,向下 +4。

    地图:

    有了这些知识,我们便可以开始编程了,首先写出地图:

    int map[100] =                   //玩家地图
     {
      1,1,1,1,1,1,1,1,1,1,
      1,0,0,0,0,0,0,0,0,1,
      1,0,0,0,3,0,4,0,0,1,
      1,2,0,0,0,0,0,0,0,1,
      1,0,0,0,0,0,0,0,0,1,
      1,0,0,3,0,4,0,0,0,1,
      1,0,0,0,0,0,0,0,0,1,
      1,0,0,0,3,0,0,0,0,1,
      1,0,0,0,0,0,0,4,0,1,
      1,1,1,1,1,1,1,1,1,1
     };
    

    上面地图中:0代表空地,1代表墙壁,2代表玩家,3代表箱子,4代表箱子目的地,5代表当人和箱子目的地重合的时候显示的图标,6代表箱子放在正确位置时候的图标

    for (int i = 0; i < 100; i++)
      {
       switch (map[i])
       {
       case 1:std::cout << "□"; break;     //墙壁
       case 0:std::cout << "  "; break;     //空地
       case 2:std::cout << "Pe"; break;     //人
       case 3:std::cout << "■"; break;    //箱子
       case 4:std::cout << "**"; break;    //箱子目的地
       case 5:std::cout << "×"; break;    //和人重合
       case 6:std::cout << "√"; break;    //和箱子重合
       }
       if (i % w == 9)
        std::cout << '\n';
      }
    

    我们打印一下:地图
    我们发现和我们一维数组里的数字所代表的意义是一样的!

    移动:

    移动需要记录当前位置和移动的目标位置,比如你向上,那么
    当前坐标=(当前坐标-地图宽度)

    我们声明如下变量:

        int input;						//输入常数
    	int nowpoint=31;				//玩家现在的地点
    	int shift;                       //玩家目标点
    	const int w=10;                  //地图宽度
    

    移动方法如下:

                        shift = map[nowpoint-w];         //把目标点赋值给shift
    				    map[nowpoint - w] = map[nowpoint];     
    					map[nowpoint] = shift;                   //移动目标点
    					nowpoint -= w;                              //移动当前所处的坐标位置
    

    当然,我们要保证它不会“穿墙”:于是:

    			shift = map[nowpoint-w];
    			if (shift == 0)              //目标点必须是空地才能移动!
    			{
    					map[nowpoint - w] = map[nowpoint];
    					map[nowpoint] = shift;
    					nowpoint -= w;
    			}
    

    但是我们的推箱子人物都是可以穿过箱子的目标地点,也就是:
    在这里插入图片描述

    在这里插入图片描述
    于是有如下代码:

    shift = map[nowpoint-w];         //下一个移动的目标点设置给shift
    			if (shift ==0)                    //当下一个目标是空地的时候
    			{
    				if (map[nowpoint] == 5)       //当和箱子目标点重合的时候且需要移动到空地
    				{
    					map[nowpoint] = 2;               //当前坐标设置为玩家
    					map[nowpoint - w] = map[nowpoint];    //下一个坐标为玩家
    					map[nowpoint] = 4;              //当前坐标为箱子目标点
    					nowpoint -= w;                  //移动当前坐标
    				}
    				else                        //如果没有和箱子目标点重合,则正常移动
    				{
    					map[nowpoint - w] = map[nowpoint];     
    					map[nowpoint] = shift;
    					nowpoint -= w;
    				}
    			}
    			if (shift == 4)                  //当下一个个目标点为箱子目标点时
    			{
    				map[nowpoint - w] = 5;            //目标点变为人和箱子重合的图案
    				map[nowpoint] = 0;                //当前点变为空地
    				nowpoint -= w;                    //移动人物的坐标
    			}
    

    那么有了这么一个开头,剩下的三个方向也就以此类推了。

    接下来是推箱子部分:

    这里我们需要注意的是,推箱子的时候,我们不仅仅要考虑玩家(2)的下一个坐标的情况,还要考虑箱子的移动坐标是否超出了我们的地图,那么通过本人总结,那么箱子前进的时候,玩家和箱子会遇到如下的情况:

    1. 前方是墙壁
    2. 前方是箱子
    3. 前方是箱子目的地
    4. 前方是放好的箱子
    5. 前方是空地

    玩家有两种情况:

    1. 玩家处于箱子目的地的时候推箱子
    2. 玩家处于箱子目的地,但是推动的方向是墙壁

    于是,我们有如下代码:

               if (shift == 3)                    //目标点为箱子
    			{
    				if (map[nowpoint- 2 * w]!=1&& map[nowpoint - 2 * w] != 3 && map[nowpoint - 2 * w] != 6)         //箱子的下一个目标点不能是墙壁,或者箱子
    				{
    					if (map[nowpoint - 2 * w] == 4)                     //箱子的下一个目标点是箱子目的地
    					{
    						map[nowpoint - 2*w] = 6;                       //箱子的下一个目标点变为和箱子重合
    						map[nowpoint - w] = map[nowpoint];             //箱子的位置变为玩家位置
    						map[nowpoint] = 0;                             //玩家为之变为空地
    						nowpoint -=	w;                                 //移动玩家坐标
    					}
    					else if (map[nowpoint] == 5)                       //目标点为箱子,并且玩家处在箱子目标点里面
    					{
    						map[nowpoint -w] = map[nowpoint - 2*w];         //箱子向上
    						map[nowpoint - 2*w] = shift;                  // 箱子目标点变为人物目标点
    						map[nowpoint - w ]= 2;                        //箱子位置变为玩家
    						map[nowpoint] = 4;							//玩家上一个点变为箱子目的地
    						nowpoint -= w;
    					}
    					else                                          //其他情况自由移动
    					{
    						map[nowpoint - 2*w] = shift;             //箱子的目标点变为箱子
    						map[nowpoint - w] = map[nowpoint];       //玩家目标点变为玩家
    						map[nowpoint] = 0;						//玩家下面的点变为空地
    						nowpoint -= w;							//移动玩家点
    					}
    				}
    			}
    

    我们不仅仅要把它推到目标点,还要能够推出来,所以:
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    
            if (shift == 6&& map[nowpoint - 2 * w] != 1)                  //如果下一个点为重合点,且前方不是墙壁
    			{
    				map[nowpoint - 2*w] = 3;                     //目标点的下一个点变为箱子
    				map[nowpoint - w] = 5;                       //下一个点变为和人重合
    				map[nowpoint] = 0;                           //人物当前点变为空地
    				nowpoint -= w;                                //变换当前坐标
    			}
    

    我们解决了一个方向的移动问题,那么接下来的移动,和前面类似,只需要改变移动变量就可以了。

    向下:当前坐标=(当前坐标+地图宽度)
    向左:当前坐标=(当前坐标-1)
    向右:当前坐标=(当前坐标+1)

    当你需要修改地图的时候,只需要修改数组里面的的1就可以了,如果觉得图案自己不喜欢,那么在switch里面就可以更换。

    游戏结束判断:

    我们做了移动和推箱子,但是并没有游戏成功的判定:我们加上如下判断成功的语句:

    bool Isgameover(int *map,int Rbox)     //Rbox  为了方便拓展,此参数为目的地个数
    {
    	int n=0;
    	for (int i = 0; i < 100; i++)
    	{
    		if (*(map+i)==6)
    		{
    			n++;
    		}
    	}
    	if (Rbox == n)
    	{
    		std::cout << "恭喜通关!!!\n";
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    }
    

    再于循环体里加入如下代码:

    if (Isgameover(map, 3))
    		{
    			break;
    		}
    

    完整源码,基于Vs2017:

    #include <iostream>
    #include<conio.h>
    bool Isgameover(int *map,int Rbox)     //Rbox  为了方便拓展,此参数为目的地个数
    {
    	int n=0;
    	for (int i = 0; i < 100; i++)
    	{
    		if (*(map+i)==6)
    		{
    			n++;
    		}
    	}
    	if (Rbox == n)
    	{
    		std::cout << "恭喜通关!!!\n";
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    }
    
    int main()
    {
    	int input;						//输入常数
    	int nowpoint=31;				//玩家现在的地点
    	int shift;                       //玩家目标点
    	const int w=10;                  //地图宽度
    	int map[100] =                   //玩家地图
    	{
    		1,1,1,1,1,1,1,1,1,1,
    		1,0,0,0,0,0,0,0,0,1,
    		1,0,0,0,3,0,4,0,0,1,
    		1,2,0,0,0,0,0,0,0,1,
    		1,0,0,0,0,0,0,0,0,1,
    		1,0,0,3,0,4,0,0,0,1,
    		1,0,0,0,0,0,0,0,0,1,
    		1,0,0,0,3,0,0,0,0,1,
    		1,0,0,0,0,0,0,4,0,1,
    		1,1,1,1,1,1,1,1,1,1
    	};
    	while (true)
    	{
    		system("cls");
    		for (int i = 0; i < 100; i++)
    		{
    			switch (map[i])
    			{
    			case 1:std::cout << "□"; break;     //墙壁
    			case 0:std::cout << "  "; break;     //空地
    			case 2:std::cout << "Pe"; break;     //人
    			case 3:std::cout << "■"; break;    //箱子
    			case 4:std::cout << "**"; break;    //箱子目的地
    			case 5:std::cout << "×"; break;    //和人重合
    			case 6:std::cout << "√"; break;    //和箱子重合
    			}
    			if (i % w == 9)
    				std::cout << '\n';
    		}
    		if (Isgameover(map, 3))
    		{
    			break;
    		}
    		input=_getch();
    
    
    		//往上
    		if (input=='w'||input=='W')
    		{
    			shift = map[nowpoint-w];         //下一个移动的目标点设置给shift
    			if (shift ==0)                    //当下一个目标是空地的时候
    			{
    				if (map[nowpoint] == 5)       //当和箱子目标点重合的时候且需要移动到空地
    				{
    					map[nowpoint] = 2;               //当前坐标设置为玩家
    					map[nowpoint - w] = map[nowpoint];    //下一个坐标为玩家
    					map[nowpoint] = 4;              //当前坐标为箱子目标点
    					nowpoint -= w;                  //移动当前坐标
    				}
    				else                        //如果没有和箱子目标点重合,则正常移动
    				{
    					map[nowpoint - w] = map[nowpoint];     
    					map[nowpoint] = shift;
    					nowpoint -= w;
    				}
    			}
    			else if (shift == 4)                  //当下一个个目标点为箱子目标点时
    			{
    				map[nowpoint - w] = 5;            //目标点变为人和箱子重合的图案
    				map[nowpoint] = 0;                //当前点变为空地
    				nowpoint -= w;                    //移动人物的坐标
    			}
    			else if (shift == 6&& map[nowpoint - 2 * w] != 1)                  //如果下一个点为箱子和箱子的目标点重合
    			{
    				map[nowpoint - 2*w] = 3;                     //目标点的下一个点变为箱子
    				map[nowpoint - w] = 5;                       //下一个点变为和人重合
    				map[nowpoint] = 0;                           //人物当前点变为空地
    				nowpoint -= w;
    			}
    			else if (shift == 3)                    //目标点为箱子
    			{
    				if (map[nowpoint- 2 * w]!=1&& map[nowpoint - 2 * w] != 3 && map[nowpoint - 2 * w] != 6)         //箱子的下一个目标点不能是墙壁,或者箱子
    				{
    					if (map[nowpoint - 2 * w] == 4)                     //箱子的下一个目标点是箱子目的地
    					{
    						map[nowpoint - 2*w] = 6;                       //箱子的下一个目标点变为和箱子重合
    						map[nowpoint - w] = map[nowpoint];             //箱子的位置变为玩家位置
    						map[nowpoint] = 0;                             //玩家为之变为空地
    						nowpoint -=	w;                                 //移动玩家坐标
    					}
    					else if (map[nowpoint] == 5)                       //目标点为箱子,并且玩家处在箱子目标点里面
    					{
    						map[nowpoint -w] = map[nowpoint - 2*w];         //箱子向上
    						map[nowpoint - 2*w] = shift;                  // 箱子目标点变为人物目标点
    						map[nowpoint - w ]= 2;                        //箱子位置变为玩家
    						map[nowpoint] = 4;							//玩家上一个点变为箱子目的地
    						nowpoint -= w;
    					}
    					else                                          //其他情况自由移动
    					{
    						map[nowpoint - 2*w] = shift;             //箱子的目标点变为箱子
    						map[nowpoint - w] = map[nowpoint];       //玩家目标点变为玩家
    						map[nowpoint] = 0;						//玩家下面的点变为空地
    						nowpoint -= w;							//移动玩家点
    					}
    				}
    			}
    			
    			
    		}
    		//往下
    		else if (input == 's' || input == 'S')
    		{
    			shift = map[nowpoint+w];
    			if (shift == 0)
    			{
    				if (map[nowpoint]==5)
    				{
    					map[nowpoint] = 2;
    					map[nowpoint + w] = map[nowpoint];
    					map[nowpoint] = 4;
    					nowpoint += w;
    				}
    				else
    				{
    					map[nowpoint + w] = map[nowpoint];
    					map[nowpoint] = shift;
    					nowpoint += w;
    				}
    				
    			}
    			else if (shift==4)
    			{
    				map[nowpoint + w] = 5;
    				map[nowpoint] = 0;
    				nowpoint += w;
    			}
    			else if (shift == 6 && map[nowpoint + 2 * w] != 1)
    			{
    				map[nowpoint + 2*w] = 3;
    				map[nowpoint + w] = 5;
    				map[nowpoint] = 0;
    				nowpoint += w;
    			}
    			else if (shift == 3)
    			{
    				if (map[nowpoint+2*w]!=1 && map[nowpoint + 2 * w] != 3 && map[nowpoint + 2 * w] != 6)
    				{
    					if (map[nowpoint + 2 * w] == 4)
    					{
    						map[nowpoint + 2 * w] = 6;
    						map[nowpoint + w] = map[nowpoint];
    						map[nowpoint] = 0;
    						nowpoint += w;
    					}
    					else if (map[nowpoint] == 5)
    					{
    						map[nowpoint + w] = map[nowpoint + 2 * w];
    						map[nowpoint + 2 * w] = shift;
    						map[nowpoint + w] = 2;
    						map[nowpoint] = 4;
    						nowpoint += w;
    					}
    					else
    					{
    						map[nowpoint + 2 * w] = shift;
    						map[nowpoint + w] = map[nowpoint];
    						map[nowpoint] = 0;
    						nowpoint += w;
    					}
    				}
    				
    			}
    		}
    
    
    		//往左
    		else if (input == 'a' || input == 'A')
    		{
    			shift = map[nowpoint-1];
    			if (shift == 0)
    			{
    				if (map[nowpoint] == 5)
    				{
    					map[nowpoint] = 2;
    					map[nowpoint - 1] = map[nowpoint];
    					map[nowpoint] = 4;
    					nowpoint -= 1;
    				}
    				else
    				{
    					map[nowpoint - 1] = map[nowpoint];
    					map[nowpoint] = shift;
    					nowpoint -= 1;
    				}
    			}
    			else if (shift == 4)
    			{
    				map[nowpoint -1] = 5;
    				map[nowpoint] = 0;
    				nowpoint -= 1;
    			}
    			else if (shift == 6 && map[nowpoint - 2] != 1)
    			{
    				map[nowpoint - 2] = 3;
    				map[nowpoint - 1] = 5;
    				map[nowpoint] = 0;
    				nowpoint -= 1;
    			}
    			else if (shift == 3)
    			{
    				if (map[nowpoint - 2]!=1 && map[nowpoint - 2] != 3 && map[nowpoint - 2] != 6)
    				{
    					if (map[nowpoint - 2]==4)
    					{
    						map[nowpoint - 1] = map[nowpoint - 2];
    						map[nowpoint - 2] = 6;
    						map[nowpoint - 1] = map[nowpoint];
    						map[nowpoint] = 0;
    						nowpoint -= 1;
    					}
    					else if (map[nowpoint] == 5)
    					{
    						map[nowpoint - 1] = map[nowpoint - 2];
    						map[nowpoint - 2] = shift;
    						map[nowpoint - 1] = 2;
    						map[nowpoint] = 4;
    						nowpoint -= 1;
    					}
    					else
    					{
    						map[nowpoint - 2] = shift;
    						map[nowpoint - 1] = map[nowpoint];
    						map[nowpoint] = 0;
    						nowpoint -= 1;
    					}
    					
    				}
    				
    			}
    			
    		}
    
    		//往右
    		else if (input == 'd' || input == 'D')
    		{
    			shift = map[nowpoint+1];
    			if (shift == 0)
    			{
    				if (map[nowpoint] == 5)
    				{
    
    					map[nowpoint] = 2;
    					map[nowpoint + 1] = map[nowpoint];
    					map[nowpoint] = 4;
    					nowpoint += 1;
    				}
    				else
    				{
    					map[nowpoint + 1] = map[nowpoint];
    					map[nowpoint] = shift;
    					nowpoint += 1;
    				}
    			}
    			else if (shift == 4)
    			{
    				map[nowpoint + 1] = 5;
    				map[nowpoint] = 0;
    				nowpoint += 1;
    			}
    			else if (shift == 6 && map[nowpoint +2] != 1)
    			{
    				map[nowpoint + 2] = 3;
    				map[nowpoint + 1] = 5;
    				map[nowpoint] = 0;
    				nowpoint += 1;
    			}
    			else if (shift == 3)
    			{
    				if (map[nowpoint + 2]!=1 && map[nowpoint + 2] != 3 && map[nowpoint + 2 ] != 6)
    				{
    					if (map[nowpoint + 2] == 4)
    					{
    						map[nowpoint + 1] = map[nowpoint + 2];
    						map[nowpoint + 2] = 6;
    						map[nowpoint + 1] = map[nowpoint];
    						map[nowpoint] = 0;
    						nowpoint += 1;
    						std::cout << "!!!";
    					}
    					else if (map[nowpoint] == 5)
    					{
    						map[nowpoint + 1] = map[nowpoint + 2];
    						map[nowpoint + 2] = shift;
    						map[nowpoint + 1] = 2;
    						map[nowpoint] = 4;
    						nowpoint += 1;
    						std::cout << "!!";
    					}
    					else
    					{
    						map[nowpoint + 2] = shift;
    						map[nowpoint + 1] = map[nowpoint];
    						map[nowpoint] = 0;
    						nowpoint += 1;
    						std::cout << "!";
    					}
    				}
    			}
    		}
    	}
    	system("pause");
    	return 0;
    	
    }
    

    这里由于博主的编程水平处于学习阶段,此代码并不够高效,如果对代码有任何建议,都可以给博主发邮件,我很欢迎大家来讨论。

    展开全文
  • C++推箱子初解源代码

    2012-09-20 00:11:55
    C++推箱子初解源代码 (详细的中文注释 最适合初学者模仿和学习的简化程序)
  • c++推箱子程序

    2018-07-30 14:06:20
    简单的推箱子小程序,本人纯手工编写,操作简单,望大家采纳。
  • C++推箱子游戏(可以撤回)

    千次阅读 多人点赞 2019-01-02 19:20:31
    C++推箱子小游戏制作 期末了,需要交一个C++大作业,就准备了一下写了一个推箱子小游戏,内容借鉴于网友, 不过进行了一些修改添加了一些新的内容,下面放出源码和效果. ![游戏界面,第一关(一共5关)]...

    C++推箱子小游戏制作

    	期末了,需要交一个C++大作业,就准备了一下写了一个推箱子小游戏,内容借鉴于网友,
    不过进行了一些修改添加了一些新的内容,下面放出源码和效果.
    

    第一关
    第二关
    一共有五个关卡,具体内容在下面代码中的注释

    /*-----推箱子游戏-----created by 汤圆*/
    /*
    	======待完成项目======
    	一.在死局的情况下重开关卡
    	二.自动生成新地图(目前只有5张地图,自己可以通过给MAP添加数组进行新地图的添加)
    */
    //障碍为█,箱子为□,玩家为♀,目的地为◎,到达目的地之后为★,空地为" ",人在目的地上表示☆;
    #include "pch.h"
    #include <iostream>
    #include <conio.h>
    #include <Windows.h>
    #include <string>
    #include <string.h>
    #include <iomanip>
    #include <fstream>
    #include <cstdlib>
    using namespace std;
    #define ROW 12
    #define COL 12
    char but;//按键
    //定义结构体玩家位置,x,y为玩家的坐标
    struct pos {
    	int x;
    	int y;
    }player;
    struct MAP {
    	const int row;
    	const int col;
    	char map[ROW][COL];
    };
    //颜色
    void color(int x)
    {
    	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);
    }
    //地图
    struct MAP map1[5] = { { 8, 8, { { 0, 0, 1, 1, 1, 0, 0, 0 },  //地图一
    { 0, 0, 1, 3, 1, 0, 0, 0 },
    { 0, 0, 1, 0, 1, 1, 1, 1 },
    { 1, 1, 1, 2, 0, 2, 3, 1 },
    { 1, 3, 0, 2, 4, 1, 1, 1 },
    { 1, 1, 1, 1, 2, 1, 0, 0 },
    { 0, 0, 0, 1, 3, 1, 0, 0 },
    { 0, 0, 0, 1, 1, 1, 0, 0 } } },
    { 9, 9, { {1,1,1,1,1,0,0,0,0},   //地图二
    {1,4,0,0,1,0,0,0,0},
    {1,0,2,2,1,0,1,1,1},
    {1,0,2,0,1,0,1,3,1},
    {1,1,1,0,1,1,1,3,1},
    {0,1,1,0,0,0,0,3,1},
    {0,1,0,0,0,1,0,0,1},
    {0,1,0,0,0,1,1,1,1},
    {0,1,1,1,1,1,0,0,0} } },
    { 7, 10, { { 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 },  //地图三
    { 0, 1, 0, 0, 0, 0, 0, 1, 1, 1 },
    { 1, 1, 2, 1, 1, 1, 0, 0, 0, 1 },
    { 1, 0, 4, 0, 2, 0, 0, 2, 0, 1 },
    { 1, 0, 3, 3, 1, 0, 2, 0, 1, 1 },
    { 1, 1, 3, 3, 1, 0, 0, 0, 1, 0 },
    {0,1,1,1,1,1,1,1,1,0} } },
    { 8, 6, { { 0, 1, 1, 1, 1, 0 },    //地图四
    { 1, 1, 0, 0, 1, 0 },
    { 1, 4, 2, 0, 1, 0 },
    { 1, 1, 2, 0, 1, 1 },
    { 1, 1, 0, 2, 0, 1 },
    { 1, 3, 2, 0, 0, 1 },
    { 1, 3, 3, 5, 3, 1 },
    { 1, 1, 1, 1, 1, 1 } } },
    { 8, 8, { { 0, 1, 1, 1, 1, 1, 0, 0 },  //地图五
    { 0, 1, 0, 4, 0, 1, 1, 1 },
    { 1, 1, 0, 1, 2, 0, 0, 1 },
    { 1, 0, 5, 3, 0, 3, 0, 1 },
    { 1, 0, 0, 2, 2, 0, 1, 1 },
    { 1, 1, 1, 0, 1, 3, 1, 0 },
    { 0, 0, 1, 0, 0, 0, 1, 0 },
    { 0, 0, 1, 1, 1, 1, 1, 0 } } } };   //在这里增加地图,行数,列数,以及地图元素
    
    /*
    *
    *
    *生成地图
    *
    *
    */
    
    void mapInit(char(*map)[COL], const int *row, const int *col) {
    	for (int i = 0; i < *row; i++) {
    		cout << "\t\t\t\t\t";
    		for (int j = 0; j < *col; j++) {
    			switch ((map[i][j])) {
    			case 0: color(15); cout << "  ";
    				break;
    			case 1:color(27); cout << "█";
    				break;
    			case 2:color(4); cout << "□";
    				break;
    			case 3:color(5); cout << "◎";
    				break;
    			case 4:color(6); cout << "♀";
    				break;
    			case 5:color(8); cout << "★";
    				break;
    			case 7:color(9); cout << "☆";
    				break;
    			}
    		}
    		cout << endl;
    	}
    	color(27);
    	cout << "\n\t\t\t\t\t█";
    	color(15);
    	cout << "障碍\n";
    	color(4);
    	cout << "\t\t\t\t\t□"; 
    	color(15);
    	cout << "箱子\n";
    	color(5); 
    	cout << "\t\t\t\t\t◎";
    	color(15);
    	cout << "目标点\n";
    	color(6);
    	cout << "\t\t\t\t\t♀";
    	color(15);
    	cout << "人物\n";
    	color(8);
    	cout << "\t\t\t\t\t★";
    	color(15);
    	cout << "箱子在目标点上\n";
    	color(9);
    	cout << "\t\t\t\t\t☆";
    	color(15);
    	cout << "人物在目标点上\n";
    
    
    
    
    	cout << "\n\t\t\t\t\tW A S D控制人物移动\n\t\t\t\t\tR键撤销移动,ESC键退出" << endl;
    }
    
    /*
    *
    *
    *锁定玩家位置
    *
    *
    */
    void lockPlayerPosition(char(*map)[COL], const int *row, const int *col, int *x, int *y) {
    	for (int i = 0; i < *row; i++) {
    		for (int j = 0; j < *col; j++) {
    			if ((map[i][j]) == 4 || (map[i][j] == 7)) {
    				*x = i;
    				*y = j;
    				return;
    			}
    		}
    	}
    }
    /*
    *
    *
    *判断是否胜利
    *
    *
    */
    int isWin(char(*map)[COL], const int*row, const int *col) {
    	int count = 0;
    	for (int i = 0; i < *row; i++) {
    		for (int j = 0; j < *col; j++) {
    			if (map[i][j] == 2 || map[i][j] == 7) {
    				return 0;
    			}
    		}
    	}
    	return 1;
    }
    /*
    *
    *
    *控制玩家移动
    *
    *
    */
    void playerMov(char(*map)[COL], int *x, int *y) {
    	char CheckBut = but;
    	switch (but = _getch()) {
    		//退出
    	case 'Q':
    	case 'q':
    	case 27: {
    		exit(1);
    	}
    		//撤回
    	case 'R':
    	case 'r': { 
    		if (CheckBut == 0) {
    			cout << "\n之前没有进行任何移动操作,请移动之后再试" << endl;
    		}
    		//上一次操作按的是W键
    		else if (CheckBut == 'w') {
    			//(1)上次人物要到的下一个位置是空地
    			if (map[(*x) + 1][*y] == 0 && map[*x][*y] == 4&& map[(*x) - 1][*y] != 2 && map[(*x) - 1][*y] != 5) {
    				map[*x][*y] = 0;
    				map[(*x) + 1][*y] = 4;
    				++*x;
    			}
    			//(2)上次人物要到的下一个位置是空目的地
    			else if (map[(*x) + 1][*y] == 0 && map[*x][*y] == 7&&map[(*x) - 1][*y] != 5 && map[(*x) - 1][*y] != 2) {
    				map[*x][*y] = 3;
    				map[(*x) + 1][*y] =4 ;
    				++*x;
    			}
    			//(3)上次人物要推着箱子到一个空地
    			else if (map[(*x) + 1][*y] == 0 && map[*x][*y] == 4 && map[(*x) - 1][*y] == 2) {
    				map[*x][*y] = 2;
    				map[(*x) - 1][(*y)] = 0;
    				map[(*x) +1 ][(*y)] =4 ;
    				
    			}
    			//(4)上次人物要推着箱子到一个空目的地
    			else if (map[(*x) + 1][*y] == 0 && map[*x][*y] == 4 && map[(*x) - 1][*y] == 5) {
    				map[*x][*y] = 2;
    				map[(*x) - 1][*y] = 3;
    				map[(*x) + 1][*y] = 4;
    			}
    			//(5)上次人物要推着目的地中的箱子到空地
    			else if (map[(*x) + 1][*y] == 0 && map[*x][*y] == 7 && map[(*x) - 1][*y] == 2) {
    				map[*x][*y] = 5;
    				map[(*x) - 1][*y] = 0;
    				map[(*x) +1][*y] = 4;
    				
    			}
    			//(6)上次人物要推着目的地中的箱子到新的目的地中
    			else if (map[(*x) - 1][*y] == 5 && map[*x][*y] == 7 && map[(*x) + 1][*y] == 0) {
    				map[*x][*y] = 5;
    				map[(*x) - 1][*y] = 3;
    				map[(*x) +1][*y] = 4;
    				
    			}
    			//(7)上次人物在目的地中到空地
    			else if (map[(*x) + 1][*y] == 3 && map[*x][*y] == 4&&map[(*x) - 1][*y] != 5) {
    				map[(*x) + 1][*y] = 7;
    				map[*x][*y] = 0;
    				
    			}
    			//(8)上次人物在目的地中推箱子到空地
    			else if (map[(*x) - 1][*y] == 2 && map[*x][*y] ==4 && map[(*x) + 1][*y] == 3) {
    				map[*x][*y] = 2;
    				map[(*x) - 1][*y] = 0;
    				map[(*x) +1][*y] = 7;
    			}
    			//(9)上次人物在目的地中推箱子到新的目的地
    			else if (map[(*x) - 1][*y] == 5 && map[*x][*y] == 4 && map[(*x) +1][*y] == 3) {
    				map[*x][*y] = 2;
    				map[(*x) - 1][*y] = 3;
    				map[(*x) +1][*y] = 7;
    				
    			}
    			//(10)上次人物在目的地中到新的目的地
    			else if (map[(*x) + 1][*y] == 3 && map[*x][*y] == 7&&map[(*x) - 1][*y] != 2&& map[(*x) - 1][*y] != 5) {
    				map[(*x) + 1][*y] =7;
    				map[*x][*y] = 3;
    			}
    			//(11)人物在目的地中推下一个目的地中的箱子到空地
    			else if (map[(*x) - 1][*y] == 2 && map[*x][*y] == 7 && map[(*x) +1][*y] == 3) {
    				map[*x][*y] = 5;
    				map[(*x) - 1][*y] = 0;
    				map[(*x) +1][*y] = 7;
    			}
    			//(12)人物在目的地中推下一个目的地中的箱子到新目的地
    			else if (map[(*x) - 1][*y] == 5 && map[*x][*y] == 7 && map[(*x) +1][*y] == 3) {
    				map[*x][*y] = 5;
    				map[(*x) - 1][*y] = 3;
    				map[(*x)+1][*y] = 7;
    			}
    		}
    		//上一次操作按的是S键
    		else if (CheckBut == 's') {
    			//(1)上次人物要到的下一个位置是空地
    			if (map[(*x) - 1][*y] == 0 && map[*x][*y] == 4 && map[(*x) + 1][*y] != 2 && map[(*x) + 1][*y] != 5) {
    				map[*x][*y] = 0;
    				map[(*x) - 1][*y] = 4;
    				--*x;
    			}
    			//(2)上次人物要到的下一个位置是空目的地
    			else if (map[(*x) - 1][*y] == 0 && map[*x][*y] == 7 && map[(*x) + 1][*y] != 5 && map[(*x) + 1][*y] != 2) {
    				map[*x][*y] = 3;
    				map[(*x) - 1][*y] = 4;
    				--*x;
    			}
    			//(3)上次人物要推着箱子到一个空地
    			else if (map[(*x) - 1][*y] == 0 && map[*x][*y] == 4 && map[(*x) + 1][*y] == 2) {
    				map[*x][*y] = 2;
    				map[(*x) + 1][(*y)] = 0;
    				map[(*x) - 1][(*y)] = 4;
    
    			}
    			//(4)上次人物要推着箱子到一个空目的地
    			else if (map[(*x) - 1][*y] == 0 && map[*x][*y] == 4 && map[(*x) + 1][*y] == 5) {
    				map[*x][*y] = 2;
    				map[(*x) + 1][*y] = 3;
    				map[(*x) - 1][*y] = 4;
    			}
    			//(5)上次人物要推着目的地中的箱子到空地
    			else if (map[(*x) - 1][*y] == 0 && map[*x][*y] == 7 && map[(*x) + 1][*y] == 2) {
    				map[*x][*y] = 5;
    				map[(*x) + 1][*y] = 0;
    				map[(*x) - 1][*y] = 4;
    
    			}
    			//(6)上次人物要推着目的地中的箱子到新的目的地中
    			else if (map[(*x) + 1][*y] == 5 && map[*x][*y] == 7 && map[(*x) - 1][*y] == 0) {
    				map[*x][*y] = 5;
    				map[(*x) + 1][*y] = 3;
    				map[(*x) - 1][*y] = 4;
    
    			}
    			//(7)上次人物在目的地中到空地
    			else if (map[(*x) - 1][*y] == 3 && map[*x][*y] == 4 && map[(*x) + 1][*y] != 5) {
    				map[(*x) - 1][*y] = 7;
    				map[*x][*y] = 0;
    
    			}
    			//(8)上次人物在目的地中推箱子到空地
    			else if (map[(*x) + 1][*y] == 2 && map[*x][*y] == 4 && map[(*x) - 1][*y] == 3) {
    				map[*x][*y] = 2;
    				map[(*x) + 1][*y] = 0;
    				map[(*x) - 1][*y] = 7;
    			}
    			//(9)上次人物在目的地中推箱子到新的目的地
    			else if (map[(*x) + 1][*y] == 5 && map[*x][*y] == 4 && map[(*x) - 1][*y] == 3) {
    				map[*x][*y] = 2;
    				map[(*x) + 1][*y] = 3;
    				map[(*x) - 1][*y] = 7;
    
    			}
    			//(10)上次人物在目的地中到新的目的地
    			else if (map[(*x) - 1][*y] == 3 && map[*x][*y] == 7 && map[(*x) +1][*y] != 2 && map[(*x) + 1][*y] != 5) {
    				map[(*x) - 1][*y] = 7;
    				map[*x][*y] = 3;
    			}
    			//(11)人物在目的地中推下一个目的地中的箱子到空地
    			else if (map[(*x) + 1][*y] == 2 && map[*x][*y] == 7 && map[(*x) - 1][*y] == 3) {
    				map[*x][*y] = 5;
    				map[(*x) + 1][*y] = 0;
    				map[(*x) - 1][*y] = 7;
    			}
    			//(12)人物在目的地中推下一个目的地中的箱子到新目的地
    			else if (map[(*x) + 1][*y] == 5 && map[*x][*y] == 7 && map[(*x) - 1][*y] == 3) {
    				map[*x][*y] = 5;
    				map[(*x) + 1][*y] = 3;
    				map[(*x) - 1][*y] = 7;
    			}
    			
    		}
    		//上一次操作按的是A键
    		else if (CheckBut == 'a') {
    		//(1)上次人物要到的下一个位置是空地
    		if (map[*x][*y] == 4 && map[*x][(*y) + 1] == 0&& map[*x][(*y) - 1]!=2&& map[*x][(*y) + 1]!=5&&map[*x][(*y) -1] != 5) {
    			map[*x][*y] = 0;
    			map[*x][(*y) + 1] = 4;
    		}
    		//(2)上次人物要到的下一个位置是空目的地
    		else if (map[(*x) ][(*y)+1] == 0 && map[*x][*y] == 7 && map[(*x) ][(*y)-1] != 5 && map[(*x) ][(*y)-1] != 2) {
    			map[*x][*y] = 3;
    			map[(*x) ][(*y)+1] = 4;
    			
    		}
    		//(3)上次人物要推着箱子到一个空地
    		else if (map[*x][(*y)+1] == 0 && map[*x][*y] == 4 && map[*x][(*y)-1] == 2) {
    			map[*x][*y] = 2;
    			map[(*x) ][(*y)-1] = 0;
    			map[(*x) ][(*y)+1] = 4;
    
    		}
    		//(4)上次人物要推着箱子到一个空目的地
    		else if (map[*x][(*y)+1] == 0 && map[*x][*y] == 4 && map[*x][(*y)-1] == 5) {
    			map[*x][*y] = 2;
    			map[*x][(*y)-1] = 3;
    			map[*x][(*y)+1] = 4;
    		}
    		//(5)上次人物要推着目的地中的箱子到空地
    		else if (map[*x][(*y)+1] == 0 && map[*x][*y] == 7 && map[*x][(*y)-1] == 2) {
    			map[*x][*y] = 5;
    			map[*x][(*y)-1] = 0;
    			map[*x][(*y)+1] = 4;
    
    		}
    		//(6)上次人物要推着目的地中的箱子到新的目的地中
    		else if (map[*x][(*y)-1] == 5 && map[*x][*y] == 7 && map[*x][(*y)+1] == 0) {
    			map[*x][*y] = 5;
    			map[*x][(*y)-1] = 3;
    			map[*x][(*y)+1] = 4;
    
    		}
    		//(7)上次人物在目的地中到空地
    		else if (map[*x][(*y)+1] == 3 && map[*x][*y] == 4 && map[*x][(*y)-1] != 5) {
    			map[*x][(*y)+1] = 7;
    			map[*x][*y] = 0;
    
    		}
    		//(8)上次人物在目的地中推箱子到空地
    		else if (map[*x][(*y)-1] == 2 && map[*x][*y] == 4 && map[*x][(*y)+1] == 3) {
    			map[*x][*y] = 2;
    			map[*x][(*y)-1] = 0;
    			map[*x][(*y)+1] = 7;
    		}
    		//(9)上次人物在目的地中推箱子到新的目的地
    		else if (map[*x][(*y)-1] == 5 && map[*x][*y] == 4 && map[*x][(*y)+1] == 3) {
    			map[*x][*y] = 2;
    			map[*x][(*y)-1] = 3;
    			map[*x][(*y)+1] = 7;
    
    		}
    		//(10)上次人物在目的地中到新的目的地
    		else if (map[*x][(*y)+1] == 3 && map[*x][*y] == 7 && map[*x][(*y)-1] != 2 && map[*x][(*y)-1] != 5) {
    			map[*x][(*y)+1] = 7;
    			map[*x][*y] = 3;
    		}
    		//(11)人物在目的地中推下一个目的地中的箱子到空地
    		else if (map[*x][(*y)-1] == 2 && map[*x][*y] == 7 && map[*x][(*y)+1] == 3) {
    			map[*x][*y] = 5;
    			map[*x][(*y)-1] = 0;
    			map[*x][(*y)+1] = 7;
    		}
    		//(12)人物在目的地中推下一个目的地中的箱子到新目的地
    		else if (map[*x][(*y)-1] == 5 && map[*x][*y] == 7 && map[*x][(*y)+1] == 3) {
    			map[*x][*y] = 5;
    			map[*x][(*y)-1] = 3;
    			map[*x][(*y)+1] = 7;
    		}
    		}
    		//上一次操作按的是D键
    		else if (CheckBut == 'd') {
    		//(1)上次人物要到的下一个位置是空地
    		if (map[*x][*y] == 4 && map[*x][(*y) - 1] == 0 && map[*x][(*y) + 1] != 2 && map[*x][(*y) - 1] != 5 && map[*x][(*y) + 1] != 5) {
    			map[*x][*y] = 0;
    			map[*x][(*y) - 1] = 4;
    		}
    		//(2)上次人物要到的下一个位置是空目的地
    		else if (map[(*x)][(*y) - 1] == 0 && map[*x][*y] == 7 && map[(*x)][(*y) + 1] != 5 && map[(*x)][(*y) + 1] != 2) {
    			map[*x][*y] = 3;
    			map[(*x)][(*y) - 1] = 4;
    
    		}
    		//(3)上次人物要推着箱子到一个空地
    		else if (map[*x][(*y) - 1] == 0 && map[*x][*y] == 4 && map[*x][(*y) + 1] == 2) {
    			map[*x][*y] = 2;
    			map[(*x)][(*y) + 1] = 0;
    			map[(*x)][(*y) - 1] = 4;
    
    		}
    		//(4)上次人物要推着箱子到一个空目的地
    		else if (map[*x][(*y) -1] == 0 && map[*x][*y] == 4 && map[*x][(*y) +1] == 5) {
    			map[*x][*y] = 2;
    			map[*x][(*y) +1] = 3;
    			map[*x][(*y) -1] = 4;
    		}
    		//(5)上次人物要推着目的地中的箱子到空地
    		else if (map[*x][(*y) -1] == 0 && map[*x][*y] == 7 && map[*x][(*y) +1] == 2) {
    			map[*x][*y] = 5;
    			map[*x][(*y) +1] = 0;
    			map[*x][(*y) -1] = 4;
    
    		}
    		//(6)上次人物要推着目的地中的箱子到新的目的地中
    		else if (map[*x][(*y) +1] == 5 && map[*x][*y] == 7 && map[*x][(*y) -1] == 0) {
    			map[*x][*y] = 5;
    			map[*x][(*y) +1] = 3;
    			map[*x][(*y) -1] = 4;
    
    		}
    		//(7)上次人物在目的地中到空地
    		else if (map[*x][(*y) -1] == 3 && map[*x][*y] == 4 && map[*x][(*y) +1] != 5) {
    			map[*x][(*y) -1] = 7;
    			map[*x][*y] = 0;
    
    		}
    		//(8)上次人物在目的地中推箱子到空地
    		else if (map[*x][(*y) +1] == 2 && map[*x][*y] == 4 && map[*x][(*y) -1] == 3) {
    			map[*x][*y] = 2;
    			map[*x][(*y) +1] = 0;
    			map[*x][(*y) -1] = 7;
    		}
    		//(9)上次人物在目的地中推箱子到新的目的地
    		else if (map[*x][(*y) +1] == 5 && map[*x][*y] == 4 && map[*x][(*y) -1] == 3) {
    			map[*x][*y] = 2;
    			map[*x][(*y) +1] = 3;
    			map[*x][(*y) -1] = 7;
    
    		}
    		//(10)上次人物在目的地中到新的目的地
    		else if (map[*x][(*y) -1] == 3 && map[*x][*y] == 7 && map[*x][(*y) +1] != 2 && map[*x][(*y) +1] != 5) {
    			map[*x][(*y) -1] = 7;
    			map[*x][*y] = 3;
    		}
    		//(11)人物在目的地中推下一个目的地中的箱子到空地
    		else if (map[*x][(*y) +1] == 2 && map[*x][*y] == 7 && map[*x][(*y) -1] == 3) {
    			map[*x][*y] = 5;
    			map[*x][(*y) +1] = 0;
    			map[*x][(*y) -1] = 7;
    		}
    		//(12)人物在目的地中推下一个目的地中的箱子到新目的地
    		else if (map[*x][(*y) +1] == 5 && map[*x][*y] == 7 && map[*x][(*y) -1] == 3) {
    			map[*x][*y] = 5;
    			map[*x][(*y) +1] = 3;
    			map[*x][(*y) -1] = 7;
    		}
    		}
    		break;
    	}
    		//向上走,在键盘上按下W键
    	case 'W':
    	case 'w':
    	case 38: {
    		//(1)人物要到的下一个位置是空地
    		if (map[(*x) - 1][*y] == 0 && map[*x][*y] == 4) {
    			map[*x][*y] = 0;
    			map[(*x) - 1][*y] = 4;
    			--*x;
    		}
    		//(2)人物要到的下一个位置是空目的地
    		else if (map[(*x) - 1][*y] == 3 && map[*x][*y] == 4) {
    			map[*x][*y] = 0;
    			map[(*x) - 1][*y] = 7;
    			--*x;
    		}
    		//(3)人物要推着箱子到一个空地
    		else if (map[(*x) - 1][*y] == 2 && map[*x][*y] == 4 && map[(*x) - 2][*y] == 0) {
    			map[*x][*y] = 0;
    			map[(*x) - 1][(*y)] = 4;
    			map[(*x) - 2][(*y)] = 2;
    			--*x;
    		}
    		//(4)人物要推着箱子到一个空目的地
    		else if (map[(*x) - 1][*y] == 2 && map[*x][*y] == 4 && map[(*x) - 2][*y] == 3) {
    			map[*x][*y] = 0;
    			map[(*x) - 1][*y] = 4;
    			map[(*x) - 2][*y] = 5;
    			--*x;
    		}
    		//(5)人物要推着目的地中的箱子到空地
    		else if (map[(*x) - 1][*y] == 5 && map[*x][*y] == 4 && map[(*x) - 2][*y] == 0) {
    			map[*x][*y] = 0;
    			map[(*x) - 1][*y] = 7;
    			map[(*x) - 2][*y] = 2;
    			--*x;
    		}
    		//(6)人物要推着目的地中的箱子到新的目的地中
    		else if (map[(*x) - 1][*y] == 5 && map[*x][*y] == 4 && map[(*x) - 2][*y] == 3) {
    			map[*x][*y] = 0;
    			map[(*x) - 1][*y] = 7;
    			map[(*x) - 2][*y] = 5;
    			--*x;
    		}
    		//(7)人物在目的地中到空地
    		else if (map[(*x) - 1][*y] == 0 && map[*x][*y] == 7) {
    			map[(*x) - 1][*y] = 4;
    			map[*x][*y] = 3;
    			--*x;
    		}
    		//(8)人物在目的地中推箱子到空地
    		else if (map[(*x) - 1][*y] == 2 && map[*x][*y] == 7 && map[(*x) - 2][*y] == 0) {
    			map[*x][*y] = 3;
    			map[(*x) - 1][*y] = 4;
    			map[(*x) - 2][*y] = 2;
    			--*x;
    		}
    		//(9)人物在目的地中推箱子到新的目的地
    		else if (map[(*x) - 1][*y] == 2 && map[*x][*y] == 7 && map[(*x) - 2][*y] == 3) {
    			map[*x][*y] = 3;
    			map[(*x) - 1][*y] = 4;
    			map[(*x) - 2][*y] = 5;
    			--*x;
    		}
    		//(10)人物在目的地中到新的目的地
    		else if (map[(*x) - 1][*y] == 3 && map[*x][*y] == 7) {
    			map[(*x) - 1][*y] = 7;
    			map[*x][*y] = 3;
    			--*x;
    		}
    		//(11)人物在目的地中推下一个目的地中的箱子到空地
    		else if (map[(*x) - 1][*y] == 5 && map[*x][*y] == 7 && map[(*x) - 2][*y] == 0) {
    			map[*x][*y] = 3;
    			map[(*x) - 1][*y] = 7;
    			map[(*x) - 2][*y] = 2;
    			--*x;
    		}
    		//(12)人物在目的地中推下一个目的地中的箱子到新目的地
    		else if (map[(*x) - 1][*y] == 5 && map[*x][*y] == 7 && map[(*x) - 2][*y] == 3) {
    			map[*x][*y] = 3;
    			map[(*x) - 1][*y] = 7;
    			map[(*x) - 2][*y] = 5;
    			--*x;
    		}
    	}
    
    			   break;
    	
    			   //向下走,在键盘上按下S键
    	case 'S':
    	case 's':
    	case 40: {
    		//(1)人物要到的下一个位置是空地
    		if (map[(*x) + 1][(*y)] == 0 && map[*x][*y] == 4) {
    			map[*x][(*y)] = 0;
    			map[(*x) + 1][*y] = 4;
    			++*x;
    		}
    		//(2)人物要到的下一个位置是空目的地
    		else if (map[(*x) + 1][*y] == 3 && map[*x][*y] == 4) {
    			map[*x][*y] = 0;
    			map[(*x) + 1][*y] = 7;
    			++*x;
    		}
    		//(3)人物要推着箱子到一个空地
    		else if (map[(*x) + 1][*y] == 2 && map[*x][*y] == 4 && map[(*x) + 2][*y] == 0) {
    			map[*x][*y] = 0;
    			map[(*x) + 1][(*y)] = 4;
    			map[(*x) + 2][(*y)] = 2;
    			++*x;
    		}
    		//(4)人物要推着箱子到一个空目的地
    		else if (map[(*x) + 1][*y] == 2 && map[*x][*y] == 4 && map[(*x) + 2][*y] == 3) {
    			map[*x][*y] = 0;
    			map[(*x) + 1][*y] = 4;
    			map[(*x) + 2][*y] = 5;
    			++*x;
    		}
    		//(5)人物要推着目的地中的箱子到空地
    		else if (map[(*x) + 1][*y] == 5 && map[*x][*y] == 4 && map[(*x) + 2][*y] == 0) {
    			map[*x][*y] = 0;
    			map[(*x) + 1][*y] = 7;
    			map[(*x) + 2][*y] = 2;
    			++*x;
    		}
    		//(6)人物要推着目的地中的箱子到新的目的地中
    		else if (map[(*x) + 1][*y] == 5 && map[*x][*y] == 4 && map[(*x) + 2][*y] == 3) {
    			map[*x][*y] = 0;
    			map[(*x) + 1][*y] = 7;
    			map[(*x) + 2][*y] = 5;
    			++*x;
    		}
    		//(7)人物在目的地中到空地
    		else if (map[(*x) + 1][*y] == 0 && map[*x][*y] == 7) {
    			map[(*x) + 1][*y] = 4;
    			map[*x][*y] = 3;
    			++*x;
    		}
    		//(8)人物在目的地中推箱子到空地
    		else if (map[(*x) + 1][*y] == 2 && map[*x][*y] == 7 && map[(*x) + 2][*y] == 0) {
    			map[*x][*y] = 3;
    			map[(*x) + 1][*y] = 4;
    			map[(*x) + 2][*y] = 2;
    			++*x;
    		}
    		//(9)人物在目的地中推箱子到新的目的地
    		else if (map[(*x) + 1][*y] == 2 && map[*x][*y] == 7 && map[(*x) + 2][*y] == 3) {
    			map[*x][*y] = 3;
    			map[(*x) + 1][*y] = 4;
    			map[(*x) + 2][*y] = 5;
    			++*x;
    		}
    		//(10)人物在目的地中到新的目的地
    		else if (map[(*x) + 1][*y] == 3 && map[*x][*y] == 7) {
    			map[(*x) + 1][*y] = 7;
    			map[*x][*y] = 3;
    			++*x;
    		}
    		//(11)人物在目的地中推下一个目的地中的箱子到空地
    		else if (map[(*x) + 1][*y] == 5 && map[*x][*y] == 7 && map[(*x) + 2][*y] == 0) {
    			map[*x][*y] = 3;
    			map[(*x) + 1][*y] = 7;
    			map[(*x) + 2][*y] = 2;
    			++*x;
    		}
    		//(12)人物在目的地中推下一个目的地中的箱子到新目的地
    		else if (map[(*x) + 1][*y] == 5 && map[*x][*y] == 7 && map[(*x) + 2][*y] == 3) {
    			map[*x][*y] = 3;
    			map[(*x) + 1][*y] = 7;
    			map[(*x) + 2][*y] = 5;
    			++*x;
    		}
    	}
    
    			   break;
    			   //向左走,在键盘上按下A键
    	case 'A':
    	case 'a':
    	case 37: {
    		//(1)人物要到的下一个位置是空地
    		if (map[*x][(*y) - 1] == 0 && map[*x][*y] == 4) {
    			map[*x][(*y)] = 0;
    			map[*x][(*y) - 1] = 4;
    			--*y;
    		}
    		//(2)人物要到的下一个位置是空目的地
    		else if (map[*x][(*y) - 1] == 3 && map[*x][*y] == 4) {
    			map[*x][*y] = 0;
    			map[*x][(*y) - 1] = 7;
    			--*y;
    		}
    		//(3)人物要推着箱子到一个空地
    		else if (map[*x][(*y) - 1] == 2 && map[*x][*y] == 4 && map[*x][(*y) - 2] == 0) {
    			map[*x][*y] = 0;
    			map[*x][(*y) - 1] = 4;
    			map[*x][(*y) - 2] = 2;
    			--*y;
    		}
    		//(4)人物要推着箱子到一个空目的地
    		else if (map[*x][(*y) - 1] == 2 && map[*x][*y] == 4 && map[*x][(*y) - 2] == 3) {
    			map[*x][*y] = 0;
    			map[*x][(*y) - 1] = 4;
    			map[*x][(*y) - 2] = 5;
    			--*y;
    		}
    		//(5)人物要推着目的地中的箱子到空地
    		else if (map[*x][(*y) - 1] == 5 && map[*x][*y] == 4 && map[*x][(*y) - 2] == 0) {
    			map[*x][*y] = 0;
    			map[*x][(*y) - 1] = 7;
    			map[*x][(*y) - 2] = 2;
    			--*x;
    		}
    		//(6)人物要推着目的地中的箱子到新的目的地中
    		else if (map[*x][(*y) - 1] == 5 && map[*x][*y] == 4 && map[*x][(*y) - 2] == 3) {
    			map[*x][*y] = 0;
    			map[*x][(*y) - 1] = 7;
    			map[*x][(*y) - 2] = 5;
    			--*x;
    		}
    		//(7)人物在目的地中到空地
    		else if (map[*x][(*y) - 1] == 0 && map[*x][*y] == 7) {
    			map[*x][(*y) - 1] = 4;
    			map[*x][*y] = 3;
    			--*x;
    		}
    		//(8)人物在目的地中推箱子到空地
    		else if (map[*x][(*y) - 1] == 2 && map[*x][*y] == 7 && map[*x][(*y) - 2] == 0) {
    			map[*x][*y] = 3;
    			map[*x][(*y) - 1] = 4;
    			map[*x][(*y) - 2] = 2;
    			--*x;
    		}
    		//(9)人物在目的地中推箱子到新的目的地
    		else if (map[*x][(*y) - 1] == 2 && map[*x][*y] == 7 && map[*x][(*y) - 2] == 3) {
    			map[*x][*y] = 3;
    			map[*x][(*y) - 1] = 4;
    			map[*x][(*y) - 2] = 5;
    			--*x;
    		}
    		//(10)人物在目的地中到新的目的地
    		else if (map[*x][(*y) - 1] == 3 && map[*x][*y] == 7) {
    			map[*x][(*y) - 1] = 7;
    			map[*x][*y] = 3;
    			--*x;
    		}
    		//(11)人物在目的地中推下一个目的地中的箱子到空地
    		else if (map[*x][(*y) - 1] == 5 && map[*x][*y] == 7 && map[*x][(*y) - 2] == 0) {
    			map[*x][*y] = 3;
    			map[*x][(*y) - 1] = 7;
    			map[*x][(*y) - 2] = 2;
    			--*x;
    		}
    		//(12)人物在目的地中推下一个目的地中的箱子到新目的地
    		else if (map[*x][(*y) - 1] == 5 && map[*x][*y] == 7 && map[*x][(*y) - 2] == 3) {
    			map[*x][*y] = 3;
    			map[*x][(*y) - 1] = 7;
    			map[*x][(*y) - 2] = 5;
    			--*x;
    		}
    	}
    
    			   break;
    			   //向右走,在键盘上按下D键
    	case 'D':
    	case 'd':
    	case 39: {
    		//(1)人物要到的下一个位置是空地
    		if (map[*x][(*y) + 1] == 0 && map[*x][*y] == 4) {
    			map[*x][(*y)] = 0;
    			map[*x][(*y) + 1] = 4;
    			++*y;
    		}
    		//(2)人物要到的下一个位置是空目的地
    		else if (map[*x][(*y) + 1] == 3 && map[*x][*y] == 4) {
    			map[*x][*y] = 0;
    			map[*x][(*y) + 1] = 7;
    			++*y;
    		}
    		//(3)人物要推着箱子到一个空地
    		else if (map[*x][(*y) + 1] == 2 && map[*x][*y] == 4 && map[*x][(*y) + 2] == 0) {
    			map[*x][*y] = 0;
    			map[*x][(*y) + 1] = 4;
    			map[*x][(*y) + 2] = 2;
    			++*y;
    		}
    		//(4)人物要推着箱子到一个空目的地
    		else if (map[*x][(*y) + 1] == 2 && map[*x][*y] == 4 && map[*x][(*y) + 2] == 3) {
    			map[*x][*y] = 0;
    			map[*x][(*y) + 1] = 4;
    			map[*x][(*y) + 2] = 5;
    			++*y;
    		}
    		//(5)人物要推着目的地中的箱子到空地
    		else if (map[*x][(*y) + 1] == 5 && map[*x][*y] == 4 && map[*x][(*y) + 2] == 0) {
    			map[*x][*y] = 0;
    			map[*x][(*y) + 1] = 7;
    			map[*x][(*y) + 2] = 2;
    			++*x;
    		}
    		//(6)人物要推着目的地中的箱子到新的目的地中
    		else if (map[*x][(*y) + 1] == 5 && map[*x][*y] == 4 && map[*x][(*y) + 2] == 3) {
    			map[*x][*y] = 0;
    			map[*x][(*y) + 1] = 7;
    			map[*x][(*y) + 2] = 5;
    			++*x;
    		}
    		//(7)人物在目的地中到空地
    		else if (map[*x][(*y) + 1] == 0 && map[*x][*y] == 7) {
    			map[*x][(*y) + 1] = 4;
    			map[*x][*y] = 3;
    			++*x;
    		}
    		//(8)人物在目的地中推箱子到空地
    		else if (map[*x][(*y) + 1] == 2 && map[*x][*y] == 7 && map[*x][(*y) + 2] == 0) {
    			map[*x][*y] = 3;
    			map[*x][(*y) + 1] = 4;
    			map[*x][(*y) + 2] = 2;
    			++*x;
    		}
    		//(9)人物在目的地中推箱子到新的目的地
    		else if (map[*x][(*y) + 1] == 2 && map[*x][*y] == 7 && map[*x][(*y) + 2] == 3) {
    			map[*x][*y] = 3;
    			map[*x][(*y) + 1] = 4;
    			map[*x][(*y) + 2] = 5;
    			++*x;
    		}
    		//(10)人物在目的地中到新的目的地
    		else if (map[*x][(*y) + 1] == 3 && map[*x][*y] == 7) {
    			map[*x][(*y) + 1] = 7;
    			map[*x][*y] = 3;
    			++*x;
    		}
    		//(11)人物在目的地中推下一个目的地中的箱子到空地
    		else if (map[*x][(*y) + 1] == 5 && map[*x][*y] == 7 && map[*x][(*y) + 2] == 0) {
    			map[*x][*y] = 3;
    			map[*x][(*y) + 1] = 7;
    			map[*x][(*y) + 2] = 2;
    			++*x;
    		}
    		//(12)人物在目的地中推下一个目的地中的箱子到新目的地
    		else if (map[*x][(*y) + 1] == 5 && map[*x][*y] == 7 && map[*x][(*y) + 2] == 3) {
    			map[*x][*y] = 3;
    			map[*x][(*y) + 1] = 7;
    			map[*x][(*y) + 2] = 5;
    			++*x;
    		}
    	}
    
    			   break;
    	}
    }
    /*
    *
    *
    *游戏主函数
    *
    */
    void game() {
    	int i = 0, x = 0, y = 0, step = 0;
    	struct MAP *pmap = NULL;
    	pmap = map1;
    	mapInit(pmap->map, &(pmap->row), &(pmap->col));
    	while (1) {
    		lockPlayerPosition(pmap->map, &(pmap->row), &(pmap->col), &x, &y);
    		cout << "\n\t\t\t\t\t你一共走了" << step << "步" << endl;
    		cout << but;
    		playerMov(pmap->map, &x, &y);
    		step++;
    		system("cls");
    		mapInit(pmap->map, &(pmap->row), &(pmap->col));
    		if ((isWin(pmap->map, &(pmap->row), &pmap->col)) && i <= 5) {
    			system("cls");
    			color(5);
    			cout << "\t\t\t\t\t牛逼,按任意键继续" << endl;
    			step = -1;
    			color(14);
    			mapInit(pmap->map, &(pmap->row), &(pmap->col));
    			//system("pause");
    			pmap++;
    			x = 0; y = 0;
    			i++;
    			lockPlayerPosition(pmap->map, &(pmap->row), &(pmap->col), &x, &y);
    		}
    	}
    }
    /*
    *
    *
    *菜单
    *
    *
    */
    void menu() {
    	cout << "\t\t\t\t\t菜 单" << endl;
    	cout << "\t\t\t\t\t1.开始游戏" << endl;
    	cout << "\t\t\t\t\t2.退出" << endl;
    
    }
    void Display();
    void Register()
    {
    	ofstream outFile;
    	outFile.open("web1.txt", ios_base::out | ios_base::app);
    	if (!outFile.is_open())
    	{
    		cout << "\t\t\t\t\t很遗憾,连接不上服务器";
    		cout << "\t\t\t\t\t程序结束";
    		cin.get();
    		exit(0);
    	}
    	string name;
    	string code;
    	cout << "\t\t\t\t\t请输入用户名:";
    	cin.get();
    	getline(cin, name);
    
    
    	outFile << name << endl;
    
    	cout << "\t\t\t\t\t请输入密码: ";
    	getline(cin, code);
    	outFile << code << endl;
    	outFile<<"========="<<endl; 
    	cout << "\t\t\t\t\t注册成功";
    	outFile.close();
    	Display();
    }
    void login()
    {
    	cin.get();
    	ifstream inFile;
    	inFile.open("web1.txt");
    	string strVec[100];
    	int i = 1;
    	if (!inFile.is_open())
    	{
    		cout << "\t\t\t\t\t很遗憾,连接不上服务器";
    		exit(0);
    	}
    	string name;
    	string code;
    	string temp;
    	char ch;
    	char str[20];
    	cout << "\t\t\t\t\t请输入用户名:";
    	getline(cin, name);
    	FILE *pFile;
    	int c;
    	int n = 0;
    	errno_t err;
    	err = fopen_s(&pFile,"web1.txt", "r");
    	if (pFile == NULL)
    	{
    		return;
    	}
    	else
    	{
    		do
    		{
    			c = fgetc(pFile);
    			if (c == '\n')
    				n++;
    		} while (c != EOF);
    	}
    	for (i = 0; i <= n; i ++)
    	{
    		getline(inFile, temp);
    		if (name == temp)
    		{
    			getline(inFile, temp);
    			while (1)
    			{
    				i = 0;
    				system("cls");
    				cout << "\t\t\t\t\t请输入登陆密码:";
    				ch = _getch();
    				while (ch != 13)
    				{
    					if (ch == 8 && i > 0)
    					{
    						i--;
    						str[i] = '\0';
    						system("cls");//清屏 重新输出*
    						cout << "\t\t\t\t\t输入密码:";
    						for (int j = 0; j < i; j++)
    						{
    							cout << "*";
    						}
    						ch = _getch();
    					}
    					else
    					{
    						printf("*");
    						str[i] = ch;
    						i++;
    						ch = _getch();
    					}
    				}
    				str[i] = '\0';
    				string temps = str;
    				if (temps==temp)
    				{
    					system("cls");
    					cout << "\t\t\t\t\t密码输入正确" << endl;
    					break;
    				}
    				else
    				{
    					cout << "\n\t\t\t\t\t密码错误!!";
    					_getch();
    				}
    			}
    
    		}
    	}
    	
    }
    void Display()
    {
    	cout << "\n\t\t\t\t\t1.注册\n\t\t\t\t\t2.登录\n\t\t\t\t\t3.退出\n\t\t\t\t\t请输入选项:";
    	int choice;
    	cin >> choice;
    
    	switch (choice)
    	{
    	case 1:
    		Register();
    		break;
    	case 2:
    		login();
    		break;
    	case 3:
    		exit(0);
    	}
    }
    
    int main(void) {
    	int choice = 0;
    	Display();
    	cout << "\n\n\tLoading";
    	for (int i = 0; i < 100; i++) {
    		cout << ".";
    		Sleep(10);
    	}
    	cout << "\n\n\n";
    	do {
    		menu();
    		cout << "\n\t\t\t\t\t输入您的选项:";
    		cin >> choice;
    		switch (choice) {
    		case 1:
    			system("cls"), game(), system("cls");
    			break;
    		case 2:
    			exit(1);
    			break;
    		}
    	} while (choice);
    
    	return 0;
    }
    

    参考https://blog.csdn.net/qq_41866437/article/details/80267831

    展开全文
  • C++ 推箱子(源码)

    2018-08-25 19:26:20
    写的时候还只学到了数组,所以推箱子只会涉及到数组和函数 程序实现了:基本推箱子的功能之外还实现了重玩,计步,有效撤回(撞墙的步数不计在内)
  • VB C++ 推箱子

    2012-09-20 20:06:54
    这款推箱子游戏是寄上一版推箱子的改进版 ,它的中文注释更清晰, 代码更加优化
  • C++推箱子.cpp

    2021-03-01 16:44:37
    控制台程序,初学C++
  • C++ 推箱子游戏,界面做的很漂亮,同时包含源代码,值得学习和借鉴
  • C/C++推箱子游戏

    2018-06-16 15:43:45
    这是一个由C/C++编写的模拟经典推箱子游戏的程序,里面的核心算法看懂了,你就可以开发很多其他类似的小游戏,如贪吃蛇等。
  • [推荐] C++推箱子游戏源码及箱子生成器源码 用C++写的推箱子游戏 和游戏制作器 【推荐】 @或直接从这里寻找@ http://download.csdn.net/user/cleopard/album @更多@ http://cleopard.download.csdn.net/ 福利 ...
  • C++推箱子项目(带图带资料)

    千次阅读 2018-09-15 21:55:53
    c++推箱子项目 开发背景 大一结束的专业见习项目,使用c++的HGE游戏引擎开发一个推箱子游戏。大概用了三天时间基本每天有十几个小时,最后一天为了加一个信息框提示自己找素材,抠图做到凌晨两点多。而最后...

    c++推箱子项目

    开发背景

    大一结束的专业见习项目,使用c++的HGE游戏引擎开发一个推箱子游戏。大概用了三天时间基本每天有十几个小时,最后一天为了加一个信息框提示自己找素材,抠图做到凌晨两点多。而最后见习老师看都没看一眼,当是心里特别气愤。不过回想起来也学到了很多,也是第一次使用c++开发完整的项目,第一次用到了git工具,也体会到了程序员赶进度加班的感觉。

    项目地址

    GitHub地址

    项目介绍

    功能介绍

    • 人物动画移动,推箱子,游戏过关
    • 进度条加载
    • 关卡,步数显示
    • 游戏特效
      • 人物动画移动
      • 箱子颜色变化
      • 重新开始人物沿原路线返回
    • 游戏音效,音效控制:
      • 背景音乐
      • 箱子到达终点音效
      • 人物移动音效
      • 鼠标点击音效
      • 推箱子音效
      • 过关,通过音效
      • 后退一步,重新开始,上下关卡切换
      • 退出信息框提示

    运行图片

     '开始界面'

     '游戏界面'

     '游戏界面2'

     '退出提示框'

    项目总结

    ​ 项目采用HGE引擎开发,引擎源码,中文资料等在资料文件夹中。2005年的引擎虽说很古老,但做学习使用却很合适,比unity3D等大型游戏引擎底层,按钮,进度条等UI控件都是自己写的类。总而言之学习肯定学底层,开发讲效率。

    展开全文
  • C++推箱子源代码

    2018-06-21 09:23:10
    支持VC 6.0 平台开发的小,对初学者非常 有帮助
  • C++ 推箱子游戏

    2019-10-26 11:02:26
    C语言实现推箱子游戏 更新自上一个文章:https://blog.csdn.net/MeZhangBorui/article/details/102643565 //导入函数库 #include <cstdio> #include <cstdlib> #include <cstring> #include...

    C语言实现推箱子游戏

    更新自上一个文章https://blog.csdn.net/MeZhangBorui/article/details/102643565

    //导入函数库
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <conio.h>
    using namespace std;
    
    //宏定义
    #define WIDTH 10
    #define HEIGHT 11
    
    //定义地图数组,二维数组有两个维度,而地图也是二维的矩形
    int map[HEIGHT][WIDTH] = {
    	{0,0,1,1,1,1,1,1,0,0},
    	{0,0,1,0,0,2,0,1,0,0},
    	{1,1,1,0,0,0,0,1,1,1},
    	{1,4,3,0,3,0,3,0,4,1},
    	{1,1,1,0,0,0,0,0,0,1},
    	{0,0,1,0,0,0,0,0,0,1},
    	{1,1,1,1,0,0,1,0,0,1},
    	{1,4,0,0,0,0,1,3,0,1},
    	{1,1,1,1,1,1,1,0,0,1},
    	{1,4,0,0,0,0,0,0,0,1},
    	{1,1,1,1,1,1,1,1,1,1} 
    };
    
    int start_map[HEIGHT][WIDTH] = {
    	{0,0,1,1,1,1,1,1,0,0},
    	{0,0,1,0,0,2,0,1,0,0},
    	{1,1,1,0,0,0,0,1,1,1},
    	{1,4,3,0,3,0,3,0,4,1},
    	{1,1,1,0,0,0,0,0,0,1},
    	{0,0,1,0,0,0,0,0,0,1},
    	{1,1,1,1,0,0,1,0,0,1},
    	{1,4,0,0,0,0,1,3,0,1},
    	{1,1,1,1,1,1,1,0,0,1},
    	{1,4,0,0,0,0,0,0,0,1},
    	{1,1,1,1,1,1,1,1,1,1} 
    };
    
    //人的位置,在二维地图中,我们可以用坐标表示一个人的位置,就好比经纬度
    int x, y;
    
    //箱子的个数,推箱子肯定要有箱子嘛。
    int boxs;
    
    void initData(){
    	int i, j;
    	
    	//加载数据时让用户等待,一般情况加载数据比较快
    	printf("游戏加载中,请稍后........."); 
    	
    	x = -1;
    	y = -1;
    	boxs = 0;
    	
    	//遍历地图中的数据
    	for(i = 0; i < HEIGHT; i++){
    		for(j = 0; j < WIDTH; j++){
    			//遍历到2(人)时,记录人的坐标。x, y是前面定义的全局变量
    			if(map[i][j] == 2){
    				x = j;
    				y = i;
    			} 
    			//遍历到3时,箱子的数目增加。boxs是前面定义的全局变量 
    			if(map[i][j] == 3){
    				boxs++;
    			}
    		}
    	} 
    }
    
    void drawMap(){
    	int i, j;
    	for(i = 0; i < HEIGHT; i++){
    		for(j = 0; j < WIDTH; j++){
    			switch(map[i][j]){
    				case 0:
    					printf("  ");
    					break;
    				case 1:
    					printf("■");
    					break;
    				case 2:
    					printf("♀");
    					break;
    				case 3:
    					printf("◆");
    					break;
    				case 4:
    					printf("●");
    					break;
    				case 5:
    					printf("★");
    					break; 
    			}
    		}
    		printf("\n");
    	}
    }
    
    void moveUp(){
    	//定义变量存放人物上方的坐标
    	int ux, uy; 
    	
    	//当上方没有元素时,直接return	(其实人不可能在边缘)
    	if(y == 0){
    		return;
    	}
    	
    	//记录上方坐标,x为横,y为纵,所有ux = x, uy = y - 1;
    	ux = x;
    	uy = y - 1; 
    	
    	//上方为已完成的箱子
    	if(map[uy][ux] == 5){
    		return;
    	} 
    	//假设上方为墙,直接return,这个和上面的判断可以合在一起,这里为了看清楚分开写 
    	if(map[uy][ux] == 1){
    		return;
    	}
    	
    	//假设上方为箱子
    	if(map[uy][ux] == 3){
    		//判断箱子上方是否为墙 
    		if(map[uy - 1][ux] == 1){
    			return;
    		}
    		
    		if(map[uy - 1][ux] == 3){
    			//判断箱子上边是否为箱子 
    			return;
    		}
    		
    		//判断箱子上方是否为终点
    		if(map[uy - 1][ux] == 4){
    			//将箱子上面内容赋值为5★ 
    			map[uy - 1][ux] = 5;
    			map[uy][ux] = 0;
    					
    			//箱子的数目减1	
    			boxs--; 
    		}else{
    			//移动箱子
    			map[uy - 1][ux] = 3;
    		}
    	}
    	//当上面几种return的情况都没遇到,人肯定会移动,移动操作如下
    	map[y][x] = 0;
    	map[uy][ux] = 2;
    	//更新人的坐标
    	y = uy; 
    } 
    
    void moveLeft(){
    	//定义变量存放人物左边的坐标
    	int lx, ly; 
    	
    	//当左边没有元素时,直接return	
    	if(x == 0){
    		return;
    	}
    	
    	//记录左边坐标
    	lx = x - 1;
    	ly = y; 
    	
    	//左边为已完成方块
    	if(map[ly][lx] == 5){
    		return;
    	} 
    	
    	//假设左边为墙,直接return 
    	if(map[ly][lx] == 1){
    		return;
    	}
    	
    	//假设左边为箱子
    	if(map[ly][lx] == 3){
    		//判断箱子左边是否为墙 
    		if(map[ly][lx - 1] == 1){
    			return;
    		}
    		
    		if(map[ly][lx - 1] == 3){
    			//判断箱子左边是否为箱子 
    			return;
    		}
    	
    		//判断箱子左边是否为球
    		if(map[ly][lx - 1] == 4){
    			//将箱子左边内容赋值为5★ 
    			map[ly][lx - 1] = 5;
    			map[ly][lx] = 0;
    		
    			//箱子的数目减1 
    			boxs--; 
    		}else{
    			//移动箱子 
    			map[ly][lx - 1] = 3; 
    		}
    	}
    	
    	
    	
    	map[y][x] = 0;
    	map[ly][lx] = 2;
    	x = lx; 
    }
    
    void moveDown(){
    	//定义变量存放人物下方的坐标
    	int dx, dy; 
    	
    	//当下方没有元素时,直接return	
    	if(y == HEIGHT - 1){
    		return;
    	}
    	
    	//记录下方坐标
    	dx = x;
    	dy = y + 1; 
    	
    	//下方为已完成方块
    	if(map[dy][dx] == 5){
    		return;
    	} 
    	
    	//假设下方为墙,直接return 
    	if(map[dy][dx] == 1){
    		return;
    	}
    	
    	//假设下方为箱子
    	if(map[dy][dx] == 3){
    		//判断箱子下方是否为墙 
    		if(map[dy + 1][dx] == 1){
    			return;
    		}
    		
    		if(map[dy + 1][dx] == 3){
    			//判断箱子下边是否为箱子 
    			return;
    		}
    		
    		//判断箱子下方是否为球
    		if(map[dy + 1][dx] == 4){
    			//将箱子下面内容赋值为5★ 
    			map[dy + 1][dx] = 5;
    			map[dy][dx] = 0;
    			
    			//箱子的数目减1 
    			boxs--; 
    		}else{
    			//移动箱子
    			map[dy + 1][dx] = 3; 
    		}
    	}
    	map[y][x] = 0;
    	map[dy][dx] = 2;
    	y = dy; 
    }
    
    void moveRight(){
    	//定义变量存放人物右边的坐标
    	int rx, ry; 
    	
    	//当右边没有元素时,直接return	
    	if(x == WIDTH - 1){
    		return;
    	}
    	
    	//记录右边坐标
    	rx = x + 1;
    	ry = y; 
    	
    	//右边为已完成方块
    	if(map[ry][rx] == 5){
    		return;
    	} 
    	
    	//假设右边为墙,直接return 
    	if(map[ry][rx] == 1){
    		return;
    	}
    	
    	//假设右边为箱子
    	if(map[ry][rx] == 3){
    		//判断箱子右边是否为墙 
    		if(map[ry][rx + 1] == 1){
    			return;
    		}
    		
    		if(map[ry][rx + 1] == 3){
    			//判断箱子右边是否为箱子 
    			return;
    		}
    		
    		//判断箱子左边是否为球
    		if(map[ry][rx + 1] == 4){
    			//将箱子右边内容赋值为5★ 
    			map[ry][rx + 1] = 5;
    			map[ry][rx] = 0;
    			
    			//箱子的数目减1 
    			boxs--; 
    		}else{
    			//移动箱子 
    			map[ry][rx + 1] = 3; 
    		}
    	}
    	map[y][x] = 0;
    	map[ry][rx] = 2;
    	x = rx; 
    }
    
    int main(int argc, char *argv[]) {
    	char direction;		//存储键盘按的方向 
    	initData();			//初始化一些数据
    	
    	//开始游戏的循环,这里是个死循环,每按一次按钮循环一次
    	while(1){
    		//每次循环的开始清除屏幕
    		system("cls");
    		//绘画地图
    		drawMap();
    
    		//判断,当boxs的数量0时,!0为真,然后走break跳出循环(结束游戏) 
    		if(!boxs){
    			break;
    		}
    		
    		//键盘输入方向,这里使用getch,因为getch读取字符不会显示在屏幕上
    		direction = getch();
    		
    		//用switch判断用户输入的方向
    		switch(direction){
    			case 'w':
    				//按w时,调用向上移动函数
    				moveUp();
    				break;
    			case 'a':
    				//按a时,调用向左移动函数
    				moveLeft(); 
    				break;
    			case 's':
    				moveDown();
    				break;
    			case 'd':
    				moveRight();
    				break; 
    			case 'W':
    				moveUp();
    				break;
    			case 'A':
    				moveLeft();
    				break;
    			case 'S':
    				moveDown();
    				break;
    			case 'D':
    				moveRight();
    				break;
    			case 72:
    				//72为上方向键键值
    				moveUp();
    				break;
    			case 80:
    				//80为下方向键值
    				moveDown();
    				break;
    			//75为左,77为右
    			case 75:
    				moveLeft();
    				break;
    			case 77:
    				moveRight();
    				break;
    			case 'R':
    				//因为要重置地图 
    				memcpy(map,start_map,sizeof(start_map));
    				initData();	
    				break;
    			case 'r':
    				//因为要重置地图 
    				memcpy(map,start_map,sizeof(start_map));
    				initData();	
    				break;
    		}
    	}  
    	//当跳出循环时,运行该语句,游戏结束
    	printf("\n** 恭喜你完成游戏!**\n\n** 请按任意键退出!**");
    	system("pause > .tmp");
    	system("del .tmp");
    	return 0;
    }
    

    更新日志

    1、重新写地图。

    2、intData()里的for循环,HEIGHT遍历和WIDTH遍历替换,因为非正方形的地图需要先访问行,再访问行里的列。

    3、moveUpmoveDownmoveRightmoveLeft有BUG。在推箱子的时候,如果把箱子推向箱子,会覆盖箱子。在移动的时候需要先检测是否是箱子。

    4、新添加Rr重置地图。新#include <cstring>导入复制数组的函数memcpy();,并定义数组map用来存储现在的地图,start_map用来定义初始数组。重置时把map赋值为start_map。代码:memcpy(map,start_map,sizeof(start_map));,然后重新载入地图initData();

    5、在游戏成功后等待system("pause > .tmp");会留下临时文件。用system("del .tmp");删除临时文件。

    展开全文
  • c++推箱子 游戏

    2008-07-28 16:32:26
    c++.net编写的推箱子游戏 不带源码
  • 利用QT实现一关推箱子游戏

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,351
精华内容 940
关键字:

c++推箱子

c++ 订阅