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

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

    2021-03-29 16:55:10
    这个小游戏是我开始学c++的时候写的,它里面实现了推箱子的逻辑和界面展示 二、思路 1.它界面素材有:背景图,人物,墙,箱子,目标,空地,成功图这样7个 2.把图按照一行一行的进行分组 并用数字把图片的位置和...

    一、简介
    这个小游戏是我开始学c++的时候写的,它里面实现了推箱子的逻辑和界面展示
    下载试玩:http://www.shopnc.cladmining.top/Sokoban.exe
    二、思路
    图片

    1.它界面素材有:背景图,人物,墙,箱子,目标,空地,成功图这样7个
    2.把图按照一行一行的进行分组 并用数字把图片的位置和信息表示出来下面是我进行的切片素材
    图片素材
    把图片分成7*8组 表示如下
    图片用数字表示
    3.加载图片并渲染页面(注意:图片等资源要先引用到项目)
    资源右键-》添加-资源-acre...-导入

    渲染
    4.玩耍(具体的逻辑我就不多说了直接上代码)
    5.截图
    效果图
    三、源代码

    #include <iostream>
    #include "resource.h"
    #include <conio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <graphics.h> //c++图形界面库
    
    //存放每个图片对应的位置
    int Map[7][8] = {
    	{ 0,0,0,0,0,0,0,0 },{ 0,1,1,1,1,1,1,0 },{ 0,1,5,1,2,3,1,0 },{ 0,1,0,1,0,1,1,0 },{ 0,1,1,4,1,1,1,0 },{ 0,1,0,1,0,1,1,0 },{ 0,0,0,0,0,0,0,0 }
    };
    IMAGE Img[6], bk;
    //把图片数据读到数组里
    void LoadImg() {
    	for (int i = 0; i < 6;i++) {
    		if (i==5) {
    			loadimage(&Img[i], "jpeg",MAKEINTRESOURCE(107), 60, 60);
    		}
    		else {
    			loadimage(&Img[i], "jpg", MAKEINTRESOURCE(101+i), 60, 60);
    		}
    	}
    	loadimage(&bk, "jpg",MAKEINTRESOURCE(IDR_JPG6),800,800);
    }
    
    void Draw() {
    	putimage(0, 0, &bk);//显示背景图
    	int pass = 0;
    	for (int i = 0; i < 7; i++) {//i行 0-7
    		for (int j = 0; j < 8; j++) {//j列 0-7
    			switch (Map[i][j]) {
    			case 0:
    				putimage(j * 60+160, i * 60+190, &Img[0]);
    				break;
    			case 1:
    				putimage(j * 60 + 160, i * 60 + 190, &Img[1]);
    				break;
    			case 2:
    				putimage(j * 60 + 160, i * 60 + 190, &Img[2]);
    				pass++;
    				break;
    			case 3:
    				putimage(j * 60 + 160, i * 60 + 190, &Img[3]);
    				break;
    			case 4:
    				putimage(j * 60 + 160, i * 60 + 190, &Img[4]);
    				break;
    			case 5:
    				putimage(j * 60 + 160, i * 60 + 190, &Img[5]);
    				break;
    			}
    		}
    
    	}
    	if (pass==0) {
    		printf("%d\n",MessageBox(GetForegroundWindow(), "恭喜过关!!!","闯关结果",1));
    	}
    }
    
    
    //1.确定人物的位置
    //2.监听键盘的输入
    //3.改变人物的坐标
    void PlayGame() {
    	//1.找到人物的位置  
    	int x, y;
    	for (int i = 0; i < 7; i++) {
    		for (int j = 0; j < 8; j++) {
    			if (Map[i][j] == 4) {
    				y = i;  //行
    				x = j;  //列
    			}
    		}
    	}
    	//getch 从键盘输入一个字符 
    	switch (getch()) {
    	case 'w':
    		if (Map[y - 1][x] == 1) {
    			//人物可以往前面走
    			Map[y - 1][x] = 4;
    			Map[y][x] = 1;
    		}
    		else if (Map[y - 1][x] == 3) {
    			if (Map[y - 2][x] == 2) {
    				Map[y - 2][x] = 5;
    				Map[y - 1][x] = 4;  //人物
    				Map[y][x] = 1;  //清0
    			}else if (Map[y - 2][x] == 1) {
    				Map[y - 2][x] = 3;
    				Map[y - 1][x] = 4;  //人物
    				Map[y][x] = 1;  //清0
    			}
    		}
    		break;
    	case 's':
    		if (Map[y + 1][x] == 1) {
    			//人物可以往前面走
    			Map[y + 1][x] = 4;
    			Map[y][x] = 1;
    		}
    		else if (Map[y + 1][x] == 3) {
    			if (Map[y + 2][x] == 2) {
    				Map[y + 2][x] = 5;
    				Map[y + 1][x] = 4;  //人物
    				Map[y][x] = 1;  //清0
    			}
    			else if (Map[y + 2][x] == 1) {
    				Map[y + 2][x] = 3;
    				Map[y + 1][x] = 4;  //人物
    				Map[y][x] = 1;  //清0
    			}
    		}
    		break;
    	case 'a':
    		if (Map[y][x-1] == 1) {
    			//人物可以往前面走
    			Map[y][x-1] = 4;
    			Map[y][x] = 1;
    		}
    		else if (Map[y][x-1] == 3) {
    			if (Map[y][x-2] == 2) {
    				Map[y][x-2] = 5;
    				Map[y][x-1] = 4;  //人物
    				Map[y][x] = 1;  //清0
    			}
    			else if (Map[y][x - 2] == 1) {
    				Map[y][x - 2] = 3;
    				Map[y][x-1] = 4;  //人物
    				Map[y][x] = 1;  //清0
    			}
    		}
    		break;
    	case 'd':
    		if (Map[y][x+1] == 1) {
    			//人物可以往前面走
    			Map[y][x+1] = 4;
    			Map[y][x] = 1;
    		}
    		else if (Map[y][x+1] == 3) {
    			if (Map[y][x+2] == 2) {
    				Map[y][x + 2] = 5;
    				Map[y][x + 1] = 4;  //人物
    				Map[y][x] = 1;  //清0
    			}
    			else if (Map[y][x+ 2] == 1) {
    				Map[y][x + 2] = 3;
    				Map[y][x + 1] = 4;  //人物
    				Map[y][x] = 1;  //清0
    			}
    		}
    		break;
    	}
    }
    
    int main() {
    	initgraph(800, 800);
    	LoadImg();
    	while (1) {
    		Draw();
    		PlayGame();
    	}
    	system("pause");
    	return EXIT_SUCCESS;
    
    }
    

    资源的话可以从我上面的截图里面切。

    展开全文
  • 一个适合初学者的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++推箱子小游戏

    2021-01-12 09:59:05
    简单易懂的推箱子闯关小游戏游戏代码 #include <bits/stdc++.h> #include <windows.h> #include <conio.h> using namespace std; #define VERSION "2.2" #define M 55 int n, m, wall[M][M], ...

    游戏效果
    简单易懂的推箱子闯关小游戏。
    游戏代码

    #include <bits/stdc++.h>
    #include <windows.h>
    #include <conio.h>
    using namespace std;
    #define VERSION "2.2"
    #define M 55
    int n, m, wall[M][M], hole[M][M], box[M][M];
    int step, dct, query, cross, rx[233], ry[233];
    char str[M][M], title[M], o;
    char atlas[M][M][M] = {
    	{"...#@.","@..*..","#*##..","..##*#","..X.&.",".@#..."},
    	{"########...####","########..*####","########*....##","######.*..*..##"
    	,"@@..##.###.#...","@@.X......*..*.","@@..#.####.####","#####......####"},
    	{"####..#...##","##.*..*.#.##","...#.**#....","X*.....#*##.","#.*###**....","##..##.#*..."
    	,"###@@@.#.*#.","###@@@@@#.*.","####@@@@@...","#######.#*.#","#######....#","#######...##"},
    	{"..@*.##",".@*@*..","&*@*@X.",".@*@*.#","..@*..#"}
    };
    int A[M] = {6, 8, 12, 5}, B[M] = {6, 15, 12, 7};
    struct pos {
    	int x, y;
    } player;
    struct node {
        pos man;
    	int dct;
        vector<pos> box;
        node() {
    		box.clear ();
    	}
    } rec[M * M * M];
    void color (int x);
    void clean ();
    bool check (int x, int y, int cross);
    bool forward (int rx, int ry);
    bool win ();
    void pt ();
    void update ();
    void playing ();
    void in ();
    void pass ();
    void Init ();
    void remain ();
    int main() {
    	MessageBox (NULL, "欢迎来到推箱子游戏!", "温馨提示", MB_OK);
    	Init ();
    	while (true) {
    		remain ();
    	}
    	return 0;
    }
    void color (int x) {
    	SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), x);
    }
    void clean () {
    	system("cls");
    	color(7);
    }
    bool check (int x, int y, int cross) {
        if (!cross) {
        	return x < 1 || x > n || y < 1 || y > m || wall[x][y];		
    	}
        return x < 0 || x > n + 1 || y < 0 || y > m + 1;
    }
    bool forward (int rx, int ry) {
    	int x = player.x + rx, y = player.y + ry, X = x + rx, Y = y + ry;
    	if (check (x,y,cross)) {
    		return false;
    	}
    	if(box[x][y]) {
    		if (check (X, Y, 0) || box[X][Y]) {
    			return false;
    		}
    	}
    	return true;
    }
    bool win () {
    	for (int i = 0; i < rec[step].box.size (); i++) {
    		if (!hole[rec[step].box[i].x][rec[step].box[i].y]) {
    			return false;
    		}
    	}		
    	return true;
    }
    void pt () {
        memset (box, 0, sizeof (box));
        for (int i = 0; i < rec[step].box.size (); i++) {
        	box[rec[step].box[i].x][rec[step].box[i].y] = 1;
    	}
        player.x = rec[step].man.x;
    	player.y = rec[step].man.y;
        dct = rec[step].dct;
        clean ();
    	color (154);
        puts ("按方向键进行移动,按删除键进行撤销");
        puts ("按空格键查询步数。");
        puts ("按0返回,按Esc键退出游戏");
    	color (7);
        for (int i = 0; i <= n + 1; i++) {
    		printf("  ");
            for (int j = 0; j <= m + 1; j++) {
    			if (i == player.x && j == player.y) {
                    color (15);
    				if (check (i, j, 0)) {
    					color (63);
    				}
    				printf ("♀");
                    color (7);
                } else if (i == 0 || i == n + 1 || j == 0 || j == m + 1 || wall[i][j]) {
    				color (3);
    				printf ("■");
    			} else if(box[i][j]) {
    				color (14);
                    if (hole[i][j]) {
    					color (12);                	
    				}
                    printf ("▓");
                } else if (hole[i][j]) {
    				color (3);
    				printf ("※");
    			} else {
    				printf ("  ");
    			}
            }
    		puts ("");
        }
    	color (7);
    }
    void update () {
    	node temp;
    	int i, j;
    	for (i = 1; i <= n; i++) {
    		for (j = 1; j <= m; j++) {
    			if (box[i][j]) {
    				pos po;
    				po.x = i;
    				po.y = j;
    				temp.box.push_back (po);
    			}
    		}
    	}
    	temp.man.x = player.x;
    	temp.man.y = player.y;
    	temp.dct = dct;
    	rec[step] = temp;
    }
    void playing () {
    	dct = 72;
    	step = 0;
    	update ();
    	pt ();
    	int winstep = -1;
    	while (o = getch ()) {
    		int tp = 0;
    		if (o == 72 || o == 77 || o == 80 || o == 75) {
    			if (forward (rx[o],ry[o])) {
    				int x = player.x + rx[o], y = player.y + ry[o];
    				if (box[x][y]) {
    					box[x][y] = 0;
    					box[x + rx[o]][y + ry[o]] = 1;
    				}
    				player.x = x;
    				player.y = y;
    				step++;
    			} else {
    				tp = 1;				
    			}
    			dct = o;
    			update ();
    		} else if (o == 8) {
    			tp = 3;
    			step = max (0, step - 1);
    			if (step <= winstep) {
    				winstep = -1;
    			}
    		} else if (o == 48) {
    			break;
    		}
    		else if (o == 27) {
    			exit (0);
    		}
    		else if (o == 32) {
    			query ^= 1;
    		}
    		else {
    			tp = 2;
    		}
    		pt ();
    		color (154);
    		if (query) {
    			printf ("当前步数为%d!\n", step);
    		}
    		if(win () || winstep != -1) {
    			if (winstep == -1) {
    				winstep = step;
    			}
    			printf ("恭喜您,您赢了!共用了%d步。\n", winstep);
    			MessageBox (NULL, "恭喜您,您赢了!", "温馨提示", MB_OK);
    		} else if (tp == 1) {
    			color (207);
    			puts("对不起,您无法推动这个方块!");
    		} else if (tp == 2) {
    			color (207);
    		} else if (tp == 3) {
    			puts ("撤销成功!");
    		}
    		color (7);
    	}
    }
    void in () {
    	memset (wall, 0, sizeof (wall));
    	memset (hole, 0, sizeof(hole));
    	memset (box, 0, sizeof(box));
    	clean ();
    	puts ("第一行输入两个整数n和m,表示地图的大小");
    	puts ("接下来n行,每行m个元素。");
    	puts ("'.'表示空地");
    	puts ("'#'表示墙");
    	puts ("'*'表示箱子");
    	puts ("'@'表示洞");
    	puts ("'X'表示人" );
    	puts ("'&'表示箱子已在洞上");
    	scanf ("%d %d", &n, &m);
    	int i,j;
    	for (i = 1; i <= n; i++) {
    		scanf ("%s", str[i] + 1);
    	}
    	for (i = 1; i <= n; i++) {
    		for (j = 1; j <= m; j++) {
    			o = str[i][j];
    			if (o == 'X') {
    				player.x = i;
    				player.y = j;
    			}
    			if (o == '#') {
    				wall[i][j] = 1;
    			}
    			if (o == '@' || o == '&') {
    				hole[i][j] = 1;
    			}
    			if (o == '*' || o =='&') {
    				box[i][j] = 1;
    			}
    		}
    	}
    	playing ();
    }
    void pass () {
    	memset (wall, 0, sizeof (wall));
    	memset (hole, 0, sizeof (hole));
    	memset (box, 0, sizeof (box));
    	clean ();
    	puts ("1.第一关");
    	puts ("2.第二关");
    	puts ("3.第三关");
    	puts ("4.第四关");
    	puts ("\n0.返回");
    	puts ("Esc.退出游戏");
    	while (o = getch ()) {
    		if (o >= '1' && o <= '4') {
    			int id = o - 48 - 1;
    			n = A[id];
    			m = B[id];
    			for (int i = 1; i <= n; i++) {
    				for (int j = 1; j <= m; j++) {
    					char o = atlas[id][i - 1][j - 1];
    		    		if (o == 'X') {
    						player.x = i;
    						player.y = j;
    					}
    					if (o == '#') {
    						wall[i][j] = 1;
    					}
    					if (o == '@' || o == '&') {
    						hole[i][j] = 1;
    					}
    					if (o == '*' || o =='&') {
    						box[i][j] = 1;
    					}
    	   			}
    			}
    			playing ();
    			break;
    		} else if (o == 48) {
    			break;
    		}
    	}
    }
    void Init () {
    	system ("mode con cols=40 lines=20");
    	SetConsoleTitle ("推箱子");
    	rx[72] = -1;
    	rx[80] = 1;
    	ry[77] = 1;
    	ry[75] = -1;
    }
    void remain () {
    	clean ();
    	puts ("1.闯关模式");
    	puts ("2.输入模式");
    	puts ("Esc.退出游戏");
    	while (o = getch ()) {
    		if (o=='1') {
    			pass ();
    			break;
    		} else if (o == '2') {
    			in ();
    			break;
    		} else if (o == 27) {
    			exit (0);			
    		}
    	}
    }
    
    展开全文
  • 主要为大家详细介绍了C++实现推箱子小游戏源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要为大家详细介绍了DEVC++实现推箱子小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 推箱子小游戏,感觉思路还凑合,由于我是按照网上的Flash游戏弄得,我自己本人都没法通关。。。囧死了
  • 推箱子小游戏C++代码

    千次阅读 2018-03-11 22:30:40
    一个推箱子小游戏上学期课设作业,交上去后就没用了,分享出来给大家玩玩,完成度一般,只能算是一个demo源代码地址:GitHub

    一个推箱子的小游戏

    上学期课设作业,交上去后就没用了,分享出来给大家玩玩,完成度一般,只能算是一个demo

    源代码地址:GitHub

    展开全文
  • c++版本推箱子小游戏2.0源代码c++版本推箱子小游戏2.0源代码c++版本推箱子小游戏2.0源代码
  • c++实现推箱子小游戏

    2019-03-26 17:08:50
    c++实现推箱子
  • //箱子推到目的地上 loadimage(&img[2], "素材/墙.jpg", 80, 80); loadimage(&img[3], "素材/人物.jpg", 80, 80); loadimage(&img[4], "素材/箱子.jpg", 80, 80); loadimage(&img[5], "素材/源氏.jpg", 80, 80);//空...
  • C++ 推箱子小游戏(VS2017)

    千次阅读 热门讨论 2018-09-16 08:37:31
    printf("推箱子小游戏\n"); printf("基础操作wsad\n"); printf("*************************\n"); } void showMap() { init();//操作介绍 //遍历数组,打印形状 for (int i = 0; i ; ++i) { for (int j = ...
  • C++推箱子小游戏(源码)

    千次阅读 多人点赞 2019-07-05 20:04:26
    推箱子有三个关卡,可直接按F1、F2、F3切换或在游戏设置里选关,代码通俗易懂,且尚存不少bug,精力有限,暂不更新。 // ConsoleApplication2.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #...
  • 主要为大家详细介绍了C++实现简单推箱子小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • C++ 推箱子代码

    2009-08-14 10:52:30
    提供一个小游戏————推箱子 的源代码 希望大家仔细研究代码 成为自己都东西
  • C++实现推箱子小游戏(源代码

    万次阅读 多人点赞 2020-02-09 17:41:27
    //4 + 3 箱子在目的地中 printf ( "★" ) ; break ; case 8 : // 5 + 3 人在目的地当中 人? printf ( "♀" ) ; break ; } } printf ( "\n" ) ; } } void PlayGame ( ) { ...
  • C++自作小游戏 推箱子(源代码) 大家好,我做了一个推箱子c++的源代码,适合初学者,可以交流交流,学习学习 可以拿走,收藏哦! 目前只有一种地图,还会改进,多多关照 实际操作: 按W向上,按S向下,按A向左,...
  • c++推箱子小游戏源码

    2020-11-15 22:40:36
    c++推箱子小游戏源码 由于本人才疏学浅特意附上一份控制台小游戏,欢迎前来讨论. 目前目标点也是不可以移动上去的. 废话不多说了,直接上源码 #include<iostream> using namespace std; //地图数据 int map[10]...
  • C语言实现推箱子游戏

    万次阅读 多人点赞 2019-09-28 22:57:23
    很早就想过做点小游戏了,但是一直没有机会动手。今天闲来无事,动起手来。过程还是蛮顺利的,代码也不是非常难。今天给大家分享一下~ 一、介绍 开发语言:C语言 开发工具:Dev-C++ 5.11 日期:2019年9月28日 作者:...
  • c++推箱子小游戏

    2021-07-26 19:54:08
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.... 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,...代码
  • c++代码,关于经典游戏推箱子的实现代码,算法的思想和是实现。
  • C++实现推箱子游戏

    2020-08-25 12:00:19
    主要为大家详细介绍了C++实现推箱子游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的伙伴们可以参考一下

空空如也

空空如也

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

c++推箱子小游戏代码

c++ 订阅