【c语言】推箱子

news2024/11/24 4:47:12

所需知识:c语言枚举,数组,for循环,while循环,switch,case语句,图形库相关函数

1.调整控制台窗口大小

#define  _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>

#include <stdio.h>
int main()
{


	system("mode con lines=15 cols=25");//调整窗口大小
	return 0;
}

在这里插入图片描述

2.清掉控制台屏幕上的字

#define  _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>

#include <stdio.h>
int main()
{


	system("mode con lines=15 cols=25");
	system("cls");//清屏操作
	getchar();//不让程序退出,等待读字符
	return 0;
}

在这里插入图片描述

3. 枚举类型定义地图中空地,墙,目的地,箱子,玩家

enum  Mine
{
	SPACE,  //空地
	WALL,//墙
	DEST,  //目的地
	BOX,  //箱子
	PLAYER//玩家
};

4.定义二维数组做地图,并且打印出来看看效果

//定义一个二维数组,做地图 空地0  墙1  目的地2  箱子3  玩家4    箱子在目的地 5  玩家在目的地6,与枚举类型对应上了
int map[10][10] =
{
	{0,0,0,0,0,0,0,0,0,0},
	{0,0,0,1,1,1,0,0,0,0},
	{0,0,0,1,2,1,1,1,1,0},
	{0,1,1,1,3,0,3,2,1,0},
	{0,1,2,3,4,0,1,1,1,0},
	{0,1,1,1,1,3,1,0,0,0},
	{0,0,0,0,1,2,1,0,0,0},
	{0,0,0,0,1,1,1,0,0,0},
	{0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0}
};

void printmap()
{for(int i=0;i<10;i++)
{
	for (int j = 0; j < 10; j++)
	{
		printf("%d ", map[i][j]);





	}
	printf("\n");




}






}

将printmap()在main中调用
在这里插入图片描述

为了让程序不会输入字符后退出,加上while循环

int main()
{

	while (1)
	{
		system("mode con lines=15 cols=25");
		system("cls");//清屏操作
		printmap();
		getchar();//不让程序退出,等待读字符
	}
	return 0;
}

5.修改printmap函数为gamedraw()函数

为了保证游戏的美观性,我们将对应的数字转化为好看的图案
使用两层循环遍历二维数组,在使用switch已经将对应的数字用图案代替,此时我们要下载搜狗输入法
在这里插入图片描述

void gamedraw()
{
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			 
				switch (map[i][j])
				{case SPACE://如果二维数组元素为0
					printf("  ");  //空地        //一个中文字符相当于二个英文字符
					break;
				case WALL://如果二维数组元素为1
					printf("■");//墙
					break;
				case DEST://如果二维数组元素为2
					printf("☆");//目的地
					break;
				case BOX://如果二维数组元素为3
					printf("□");//箱子
					break;
				case PLAYER://如果二维数组元素为4
					printf("♀");//玩家
					break;
				case PLAYER+DEST://如果二维数组元素为6
					printf("♂");//玩家在目的地
					break;
				case BOX+DEST://如果二维数组元素为5
					printf("★");箱子在目的地
					break;
                }






		}
				
printf("\n");
	}





}

对应数字和枚举变量类型对应上,PLAYER+DEST表示玩家如果出现在目的地的话对应数字为6,BOX+DEST表示箱子在目的地,将主函数中的printmap用gamedraw()换掉。
在这里插入图片描述

6.按键控制移动

要想使玩家移动,就先得确定玩家的坐标,通过遍历二维数组,找到数组中数字等于4的和4+2的,后者表示玩家在目的地,也要获取坐标,当找到玩家坐标时,要跳出循环,而break只能跳出一次循环,所以使用goto函数,可以直接跳出多层循环.

int i = 0; int j = 0;//定义不要在for循环里面,要不然出作用域就会被销毁
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			if (map[i][j] == PLAYER||map[i][j] == PLAYER+DEST)
			{
				goto end;
			}
		}
	}
end:;//找到直接来这里

在使用_getch()函数将按键的信息放入ch字符变量中,如果不知道上下左右对应的键值,我们可以打印出ch看看,我们把这些都封装成一个函数 keyevent()获取玩家坐标,并且读取键盘按下的信息

void keyevent()
{
	int i = 0; int j = 0;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			if (map[i][j] == PLAYER || map[i][j] == PLAYER + DEST)
			{
				goto end;
			}
		}
	}
end:;
	char ch = _getch();
	printf("%d    %c", ch, ch);//w 119 a 97 s 115  d 100

















}

通过printf(“%d %c”, ch, ch);
得到虚拟键值为//w 119 a 97 s 115 d 100,然后注释掉printf(“%d %c”, ch, ch);然后通过swich,case 语句分别处理上下左右按键按下后的处理,

	switch (ch)
	{
	case 119:
	case 'w ':
	case 'W':
		break;
	case 97:
	case 'a ':
	case'A':
		break;
	case 115:
	case 's ':
	case'S':
		break;
	case 100:
	case 'd ':
	case'D':
		break;
	}

比如说按下w键,如果玩家上面是空地或者是目的地的话,玩家可以直接挪过去,因为没有障碍物阻碍,如果玩家的坐标为map[i][j];则玩家上面的的坐标就是map[i-1][j];要做的是

 if (map[i - 1][j] == SPACE||map[i - 1][j] == DEST)
		 {
			 map[i - 1][j] += PLAYER;
			 map[i][j] -= PLAYER;



		 }

如果map[i][j]只有玩家的话,上移动玩家就会map[i][j]=0,该位置变为空地,如果map[i][j]是玩家加目的地,上移动玩家就会map[i][j]=DEST,变为单纯的目的地.
如果玩家上面一个位置是箱子或者是箱子加目的地,就要看玩家上面的上面是什么了,如果是空地,或者是目的地,就可以推动,map[i - 2][j]是玩家上面的上面的坐标要做的是

 else  if(map[i-1][j]==BOX||map[i-1][j]==BOX+DEST)
		 {
			 if (map[i - 2][j] == SPACE || map[i - 2][j] == DEST)
			 {//完成玩家上面有箱子,箱子的上面是空地或者是目的地都可以推动
				 map[i - 2][j] += BOX;//玩家上面的上面加一个箱子
				 map[i - 1][j] = map[i - 1][j] - BOX + PLAYER;//玩家的上面减去一个箱子加上一个玩家
				 map[i][j] -= PLAYER;//玩家消失在原来位置





			 }



		 }

处理完的函数上键

case 119:
	case 'w ':
	case 'W':
		if (map[i - 1][j] == SPACE || map[i - 1][j] == DEST)
		{
			map[i - 1][j] += 4;
			map[i][j] -= 4;



		}
		else  if (map[i - 1][j] == BOX || map[i - 1][j] == BOX + DEST)
		{
			if (map[i - 2][j] == SPACE || map[i - 2][j] == DEST)
			{
				map[i - 2][j] += BOX;
				map[i - 1][j] = map[i - 1][j] - BOX + PLAYER;
				map[i][j] -= PLAYER;//玩家消失在原来位置





			}



		}
		break;

在这里插入图片描述
向上推了一下,如果懂了上键怎么移动,别的也就会处理了
在这里插入图片描述
整体的keyevent()

void keyevent()
{
	int i = 0; int j = 0;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			if (map[i][j] == PLAYER || map[i][j] == PLAYER + DEST)
			{
				goto end;
			}
		}
	}
end:;
	char ch = _getch();
	switch (ch)
	{
	case 119:
	case 'w ':
	case 'W':
		if (map[i - 1][j] == SPACE || map[i - 1][j] == DEST)
		{
			map[i - 1][j] += PLAYER;
			map[i][j] -=  PLAYER;



		}
		else  if (map[i - 1][j] == BOX || map[i - 1][j] == BOX + DEST)
		{
			if (map[i - 2][j] == SPACE || map[i - 2][j] == DEST)
			{
				map[i - 2][j] += BOX;
				map[i - 1][j] = map[i - 1][j] - BOX + PLAYER;
				map[i][j] -= PLAYER;//玩家消失在原来位置





			}



		}
		break;
	case 97:
	case 'a ':
	case'A':
		if (map[i][j - 1] == SPACE || map[i][j - 1] == DEST)
		{
			map[i][j - 1] += PLAYER;
			map[i][j] -=  PLAYER;



		}
		else  if (map[i][j - 1] == BOX || map[i][j - 1] == BOX + DEST)
		{
			if (map[i][j - 2] == SPACE || map[i][j - 2] == DEST)
			{
				map[i][j - 2] += BOX;
				map[i][j - 1] = map[i][j - 1] - BOX + PLAYER;
				map[i][j] -= PLAYER;//玩家消失在原来位置





			}



		}
		break;
	case 115:
	case 's ':
	case'S':
		if (map[i + 1][j] == SPACE || map[i + 1][j] == DEST)
		{
			map[i + 1][j] += PLAYER;
			map[i][j] -= PLAYER;



		}
		else  if (map[i + 1][j] == BOX || map[i + 1][j] == BOX + DEST)
		{
			if (map[i + 2][j] == SPACE || map[i + 2][j] == DEST)
			{
				map[i + 2][j] += BOX;
				map[i + 1][j] = map[i + 1][j] - BOX + PLAYER;
				map[i][j] -= PLAYER;//玩家消失在原来位置





			}



		}
		break;
	case 100:
	case 'd ':
	case'D':
		if (map[i][j + 1] == SPACE || map[i][j + 1] == DEST)
		{
			map[i][j + 1] +=  PLAYER;
			map[i][j] -=  PLAYER;



		}
		else  if (map[i][j + 1] == BOX || map[i][j + 1] == BOX + DEST)
		{
			if (map[i][j + 2] == SPACE || map[i][j + 2] == DEST)
			{
				map[i][j + 2] += BOX;
				map[i][j + 1] = map[i][j + 1] - BOX + PLAYER;
				map[i][j] -= PLAYER;//玩家消失在原来位置





			}



		}
		break;
	}


}

7.多组地图的制作,修改map数组

定义全局变量level=0;表示关数,
将二维数组改为三维数组,三维数组的每一个元素就是二维数组,就是一个地图.

int map[3][10][10] =
{
	{
	{0,0,0,0,0,0,0,0,0,0},
	{0,0,0,1,1,1,0,0,0,0},
	{0,0,0,1,2,1,1,1,1,0},
	{0,1,1,1,3,0,3,2,1,0},
	{0,1,2,3,4,0,1,1,1,0},
	{0,1,1,1,1,3,1,0,0,0},
	{0,0,0,0,1,2,1,0,0,0},
	{0,0,0,0,1,1,1,0,0,0},
	{0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0}
	},

	{
	{0,0,0,0,0,0,0,0,0,0},
	{0,0,1,1,0,0,1,1,0,0},
	{0,1,0,2,1,1,2,0,1,0},
	{1,0,0,0,3,0,0,0,0,1},
	{1,0,0,0,4,3,0,0,0,1},
	{0,1,0,0,3,3,0,0,1,0},
	{0,0,1,0,0,0,0,1,0,0},
	{0,0,0,1,2,2,1,0,0,0},
	{0,0,0,0,1,1,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0}
	},
	{
	{0,0,0,0,1,0,0,0,0,0},
	{0,0,0,1,0,1,0,0,0,0},
	{0,0,1,2,3,0,1,0,0,0},
	{0,1,0,0,0,0,0,1,0,0},
	{1,2,3,0,4,0,0,0,1,0},
	{0,1,0,0,0,0,0,3,2,1},
	{0,0,1,0,3,0,0,0,1,0},
	{0,0,0,1,2,0,0,1,0,0},
	{0,0,0,0,1,0,1,0,0,0},
	{0,0,0,0,0,1,0,0,0,0}
	}
};

将所有map[][]改成map[level][][];每通过一关,level++;

8.通关判断

循环遍历二维数组,如果有map[level][i][j]==BOX,说明有箱子没有推到目的地,返回false ,循环结束如果没有的话,说明通过此关,返回true,该判断函数返回布尔类型的值

bool jude()
{

	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			if (map[level][i][j] == BOX)
			{
				return false;
			}
		}
	}






}

	if (jude())
		{
			level++;
			if (level > 2)
			{
				
				printf("oioioioioioioioi奥哈呦学妹你通过了!");
			
				_getch();
				break;
			}
		}

主函数添加如果jude()返回1,然后就是通关,然后level++;
变成三维数组中的第二个元素,也就是换了地图,当level>2,表示通关,因为只设置了三个图

9.程序源码(无图形库)

#define  _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
enum  Mine
{
	SPACE,  //空地
	WALL,//墙
	DEST,  //目的地
	BOX,  //箱子
	PLAYER//玩家





};
int level = 0;
//定义一个二维数组,做地图 空地0  墙1  目的地2  箱子3  玩家4    箱子在目的地 5  玩家在目的地6,与枚举类型对应上了
int map[3][10][10] =
{
	{
	{0,0,0,0,0,0,0,0,0,0},
	{0,0,0,1,1,1,0,0,0,0},
	{0,0,0,1,2,1,1,1,1,0},
	{0,1,1,1,3,0,3,2,1,0},
	{0,1,2,3,4,0,1,1,1,0},
	{0,1,1,1,1,3,1,0,0,0},
	{0,0,0,0,1,2,1,0,0,0},
	{0,0,0,0,1,1,1,0,0,0},
	{0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0}
	},

	{
	{0,0,0,0,0,0,0,0,0,0},
	{0,0,1,1,0,0,1,1,0,0},
	{0,1,0,2,1,1,2,0,1,0},
	{1,0,0,0,3,0,0,0,0,1},
	{1,0,0,0,4,3,0,0,0,1},
	{0,1,0,0,3,3,0,0,1,0},
	{0,0,1,0,0,0,0,1,0,0},
	{0,0,0,1,2,2,1,0,0,0},
	{0,0,0,0,1,1,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0}
	},
	{
	{0,0,0,0,1,0,0,0,0,0},
	{0,0,0,1,0,1,0,0,0,0},
	{0,0,1,2,3,0,1,0,0,0},
	{0,1,0,0,0,0,0,1,0,0},
	{1,2,3,0,4,0,0,0,1,0},
	{0,1,0,0,0,0,0,3,2,1},
	{0,0,1,0,3,0,0,0,1,0},
	{0,0,0,1,2,0,0,1,0,0},
	{0,0,0,0,1,0,1,0,0,0},
	{0,0,0,0,0,1,0,0,0,0}
	}
};

void gamedraw()
{
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			 
				switch (map[level][i][j])
				{case SPACE:
					printf("  ");          //一个中文字符相当于二个英文字符
					break;
				case WALL:
					printf("■");
					break;
				case DEST:
					printf("☆");
					break;
				case BOX:
					printf("□");
					break;
				case PLAYER:
					printf("♀");
					break;
				case PLAYER+DEST:
					printf("♂");
					break;
				case BOX+DEST:
					printf("★");
					break;
                }






		}
				
printf("\n");
	}





}
void keyevent()
{
	int i = 0; int j = 0;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			if (map[level][i][j] == PLAYER || map[level][i][j] == PLAYER + DEST)
			{
				goto end;
			}
		}
	}
end:;
	char ch = _getch();
	switch (ch)
	{
	case 119:
	case 'w ':
	case 'W':
		if (map[level][i - 1][j] == SPACE || map[level][i - 1][j] == DEST)
		{
			map[level][i - 1][j] += 4;
			map[level][i][j] -= 4;



		}
		else  if (map[level][i - 1][j] == BOX || map[level][i - 1][j] == BOX + DEST)
		{
			if (map[level][i - 2][j] == SPACE || map[level][i - 2][j] == DEST)
			{
				map[level][i - 2][j] += BOX;
				map[level][i - 1][j] = map[level][i - 1][j] - BOX + PLAYER;
				map[level][i][j] -= PLAYER;//玩家消失在原来位置





			}



		}
		break;
	case 97:
	case 'a ':
	case'A':
		if (map[level][i][j - 1] == SPACE || map[level][i][j - 1] == DEST)
		{
			map[level][i][j - 1] += 4;
			map[level][i][j] -= 4;



		}
		else  if (map[level][i][j - 1] == BOX || map[level][i][j - 1] == BOX + DEST)
		{
			if (map[level][i][j - 2] == SPACE || map[level][i][j - 2] == DEST)
			{
				map[level][i][j - 2] += BOX;
				map[level][i][j - 1] = map[level][i][j - 1] - BOX + PLAYER;
				map[level][i][j] -= PLAYER;//玩家消失在原来位置





			}



		}
		break;
	case 115:
	case 's ':
	case'S':
		if (map[level][i + 1][j] == SPACE || map[level][i + 1][j] == DEST)
		{
			map[level][i + 1][j] += PLAYER;
			map[level][i][j] -= PLAYER;



		}
		else  if (map[level][i + 1][j] == BOX || map[level][i + 1][j] == BOX + DEST)
		{
			if (map[level][i + 2][j] == SPACE || map[level][i + 2][j] == DEST)
			{
				map[level][i + 2][j] += BOX;
				map[level][i + 1][j] = map[level][i + 1][j] - BOX + PLAYER;
				map[level][i][j] -= PLAYER;//玩家消失在原来位置





			}



		}
		break;
	case 100:
	case 'd ':
	case'D':
		if (map[level][i][j + 1] == SPACE || map[level][i][j + 1] == DEST)
		{
			map[level][i][j + 1] += 4;
			map[level][i][j] -= 4;



		}
		else  if (map[level][i][j + 1] == BOX || map[level][i][j + 1] == BOX + DEST)
		{
			if (map[level][i][j + 2] == SPACE || map[level][i][j + 2] == DEST)
			{
				map[level][i][j + 2] += BOX;
				map[level][i][j + 1] = map[level][i][j + 1] - BOX + PLAYER;
				map[level][i][j] -= PLAYER;//玩家消失在原来位置





			}



		}
		break;
	}


}
bool jude()
{

	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			if (map[level][i][j] == BOX)
			{
				return false;
			}
		}
	}






}








int main()
{
	system("mode con lines=15 cols=25");
	//system("cls");//清屏操作
	while (1)
	{
		
	
		
		gamedraw();
		
		//_getch();
		if (jude())
		{
			level++;
			if (level > 2)
			{
				
				printf("oioioioioioioioi奥哈呦学妹你通过了!");
			
				_getch();
				break;
			}
		}keyevent();
		
	}
	getchar();//不让程序退出,等待读字符
	return 0;
}

10.演示1

20231002_124830

11.加图形库版本

12.头文件增加

#include <graphics.h >

13.定义保存空地,目的地,玩家,箱子,墙,箱子推到目的地图片的类

IMAGE  ima_all[6];

14.将图片image文件放在.cpp文件同目录下

在这里插入图片描述
image文件夹是自己创建的,用于放推箱子的素材,就是图片,图片可以在网上自己找推箱子的图片
在这里插入图片描述

15.加载图片函数

void loadimg()
{
	
	for (int i = 0; i < 6; i++)
	{
		char file[20] = "";
		sprintf(file,"./images/%d.png", i);
		loadimage(ima_all + i,file, 40, 40);
		

	}





}

为什么这么加载图片,这里我们将照片命名为了0,1,2,3,4,5,要将这六个照片都加载进去,六个照片的相对路径里面只有照片名字不一样,我们可以循环将每个照片对应的相对路径的字符串放入到file字符串数组file中去,使用sprintf,如果这里不知道sprintf的用法,可以去看看我文件操作那一篇,文件操作,使用loadimage函数将六个图片加载进去,loadimage第一个参数是图片的首地址,第二个参数是该图片的相对路径,第三个,第四个参数是分辨率,也就是大小,后两个可以在在这里插入图片描述
可以看到4241,这里统一用4040;

16. gamedraw函数的修改

因为使用图形库的话就不用之前的gamedraw函数打印图案,而是将图片贴上去

void gamedraw()
{
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			int x = j * 40;
			int y = i * 40;

			switch (map[level][i][j])
			{
			case SPACE:
				putimage(x, y, ima_all+2);         //一个中文字符相当于二个英文字符
				break;
			case WALL:
				putimage(x, y, ima_all+1);
				break;
			case DEST:
				putimage(x, y, ima_all+4);
				break;
			case BOX:
				putimage(x, y, ima_all+3);
				break;
			case PLAYER:
				putimage(x, y, ima_all);
				break;
			case PLAYER + DEST:
				putimage(x, y, ima_all);
				break;
			case BOX + DEST://就是箱子推到目的地
				putimage(x, y, ima_all+5);
				break;
			}






		}

		
	}





}

在这里插入图片描述

由上图可知i,j和x,y反了过来,使用putimage函数将每个图片贴上去,putimage前两个参数为图片要贴在界面上左上角的坐标,第三个参数是要贴图片对应的地址,之前命名的照片在数组ima_all[6];是对应上的,就是说ima_all+3地址对应的就是对应的这个图片
在这里插入图片描述

17.主函数修改

int main()
{
	initgraph(400, 400);
	loadimg();
	//system("mode con lines=15 cols=25");
	//system("cls");//清屏操作
	while (1)
	{
		
	
		
		gamedraw();
		
		//_getch();
		if (jude())
		{
			level++;
			if (level > 2)
			{
				
				//printf("oioioioioioioioi奥哈呦学妹你通过了!");
			
				_getch();
				break;
			}
		}keyevent();
		
	}
	getchar();//不让程序退出,等待读字符
	return 0;
}

不使用控制台显示地图,初始化界面,在界面上显示地图,由于一个图片是40乘40的,二维数组是10乘10的,所以界面行列都应该是400,所以initgraph(400, 400);由于不用控制台,所以也就不使用printf函数,也不用将控制台大小改变,也不要清屏.
当你此时开始编译运行的时候会出现下列错误
在这里插入图片描述
解决方案:调试-》属性-》高级-》字符集-》多字符集

18.游戏通关显示

如果level>2

settextcolor(BLACK);//字体颜色
				settextstyle(25, 0, "微软雅黑");//字体风格
				setbkmode(TRANSPARENT);//字体背景透明
				
				outtextxy(100, 100, "oioioioioioioioi奥哈呦学妹你通过了!");//字体显示位置,以及内容
				_getch();
				break;

19.程序源码(带图形库版)

#define  _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>//_getch()函数头文件
#include <stdbool.h>//bool类型的头函数
#include <graphics.h >//图形库头文件
//定义一个二维数组,做地图
//空地0  墙1  目的地2  箱子3  玩家4    箱子在目的地 5  玩家在目的地6
IMAGE  ima_all[6];
int level = 0;
void loadimg()
{
	
	for (int i = 0; i < 6; i++)
	{
		char file[20] = "";
		sprintf(file,"./images/%d.png", i);
		loadimage(ima_all + i,file, 40, 40);
		

	}





}
enum  Mine
{
	SPACE,  //空地
	WALL,//墙
	DEST,  //目的地
	BOX,  //箱子
	PLAYER//玩家





};
int map[3][10][10] =
{
	{
	{0,0,0,0,0,0,0,0,0,0},
	{0,0,0,1,1,1,0,0,0,0},
	{0,0,0,1,2,1,1,1,1,0},
	{0,1,1,1,3,0,3,2,1,0},
	{0,1,2,3,4,0,1,1,1,0},
	{0,1,1,1,1,3,1,0,0,0},
	{0,0,0,0,1,2,1,0,0,0},
	{0,0,0,0,1,1,1,0,0,0},
	{0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0}
	},

	{
	{0,0,0,0,0,0,0,0,0,0},
	{0,0,1,1,0,0,1,1,0,0},
	{0,1,0,2,1,1,2,0,1,0},
	{1,0,0,0,3,0,0,0,0,1},
	{1,0,0,0,4,3,0,0,0,1},
	{0,1,0,0,3,3,0,0,1,0},
	{0,0,1,0,0,0,0,1,0,0},
	{0,0,0,1,2,2,1,0,0,0},
	{0,0,0,0,1,1,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0}
	},
	{
	{0,0,0,0,1,0,0,0,0,0},
	{0,0,0,1,0,1,0,0,0,0},
	{0,0,1,2,3,0,1,0,0,0},
	{0,1,0,0,0,0,0,1,0,0},
	{1,2,3,0,4,0,0,0,1,0},
	{0,1,0,0,0,0,0,3,2,1},
	{0,0,1,0,3,0,0,0,1,0},
	{0,0,0,1,2,0,0,1,0,0},
	{0,0,0,0,1,0,1,0,0,0},
	{0,0,0,0,0,1,0,0,0,0}
	}
};



void gamedraw()
{
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			int x = j * 40;
			int y = i * 40;

			switch (map[level][i][j])
			{
			case SPACE:
				putimage(x, y, ima_all+2);         //一个中文字符相当于二个英文字符
				break;
			case WALL:
				putimage(x, y, ima_all+1);
				break;
			case DEST:
				putimage(x, y, ima_all+4);
				break;
			case BOX:
				putimage(x, y, ima_all+3);
				break;
			case PLAYER:
				putimage(x, y, ima_all);
				break;
			case PLAYER + DEST:
				putimage(x, y, ima_all);
				break;
			case BOX + DEST:
				putimage(x, y, ima_all+5);
				break;
			}






		}

		
	}





}
void keyevent()
{
	int i = 0; int j = 0;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			if (map[level][i][j] == PLAYER||map[level][i][j] == PLAYER+DEST)
			{
				goto end;
			}
		}
	}
end:;
	char ch = _getch();
	//printf("%d    %c", ch, ch);//w 119 a 97 s 115  d 100
	switch (ch)
	{case 119:
	 case 'w ':
	 case 'W':
		 if (map[level][i - 1][j] == SPACE||map[level][i - 1][j] == DEST)
		 {
			 map[level][i - 1][j] += 4;
			 map[level][i][j] -= 4;



		 }
		 else  if(map[level][i-1][j]==BOX||map[level][i-1][j]==BOX+DEST)
		 {
			 if (map[level][i - 2][j] == SPACE || map[level][i - 2][j] == DEST)
			 {
				 map[level][i - 2][j] += BOX;
				 map[level][i - 1][j] = map[level][i - 1][j] - BOX + PLAYER;
				 map[level][i][j] -= PLAYER;//玩家消失在原来位置





			 }



		 }

		break;
	case 97:
	case 'a ':
	case'A':
		if (map[level][i][j-1] == SPACE || map[level][i][j-1] == DEST)
		{
			map[level][i][j-1] += 4;
			map[level][i][j] -= 4;



		}
		else  if (map[level][i][j-1] == BOX || map[level][i][j-1] == BOX + DEST)
		{
			if (map[level][i][j-2] == SPACE || map[level][i][j-2] == DEST)
			{
				map[level][i][j-2] += BOX;
				map[level][i][j-1] = map[level][i][j-1] - BOX + PLAYER;
				map[level][i][j] -= PLAYER;//玩家消失在原来位置





			}



		}
		break;
	case 115:
	case 's ':
	case'S':
		if (map[level][i+1][j] == SPACE || map[level][i+1][j] == DEST)
		{
			map[level][i+1][j] += 4;
			map[level][i][j] -= 4;



		}
		else  if (map[level][i+1][j] == BOX || map[level][i+1][j] == BOX + DEST)
		{
			if (map[level][i+2][j] == SPACE || map[level][i+2][j] == DEST)
			{
				map[level][i+2][j] += BOX;
				map[level][i+1][j] = map[level][i+1][j] - BOX + PLAYER;
				map[level][i][j] -= PLAYER;//玩家消失在原来位置





			}



		}
		break;
	case 100:
	case 'd ':
	case'D':
		if (map[level][i][j+1] == SPACE || map[level][i][j+1] == DEST)
		{
			map[level][i][j+1] += 4;
			map[level][i][j] -= 4;



		}
		else  if (map[level][i][j+1] == BOX || map[level][i][j+1] == BOX + DEST)
		{
			if (map[level][i][j+2] == SPACE || map[level][i][j +2] == DEST)
			{
				map[level][i][j+2] += BOX;
				map[level][i][j+1] = map[level][i][j+1] - BOX + PLAYER;
				map[level][i][j] -= PLAYER;//玩家消失在原来位置





			}



		}
		break;








	}



}

bool jude()
{
	
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			if (map[level][i][j] == BOX)
			{
				return false;
			}
		}
	}






}
int main()
{
	initgraph(10 * 40, 10 * 40);
	loadimg();
	system("mode con lines=15 cols=25");//调整窗口大小
	
	while (1)
	{
		//system("cls");
		gamedraw();
		if (jude())
		{
			level++;
			if (level > 2)
			{
				settextcolor(BLACK);
				settextstyle(25, 0, "微软雅黑");
				setbkmode(TRANSPARENT);
				
				outtextxy(100, 100, "oioioioioioioioi奥哈呦学妹你通过了!");
				_getch();
				break;
			}
		}
			keyevent();
			
		}
	getchar();//不让程序退出
	return 0;
		
	}

20.演示2

20231002_153153

21.关卡的增加

只需要将定义的全局变量map[3][10][10],中3改成你想要的关卡数,然后在三维数组中增加像上面的二维数组即可,全部通关的level需要>关卡数-1即可

22.关卡重开

需要再定义一个和map[][][]三维数组相同的数组用来保存每一关的初始情况resetmap[][][],

int mapreset[3][10][10] =
{
	{
	{0,0,0,0,0,0,0,0,0,0},
	{0,0,0,1,1,1,0,0,0,0},
	{0,0,0,1,2,1,1,1,1,0},
	{0,1,1,1,3,0,3,2,1,0},
	{0,1,2,3,4,0,1,1,1,0},
	{0,1,1,1,1,3,1,0,0,0},
	{0,0,0,0,1,2,1,0,0,0},
	{0,0,0,0,1,1,1,0,0,0},
	{0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0}
	},

	{
	{0,0,0,0,0,0,0,0,0,0},
	{0,0,1,1,0,0,1,1,0,0},
	{0,1,0,2,1,1,2,0,1,0},
	{1,0,0,0,3,0,0,0,0,1},
	{1,0,0,0,4,3,0,0,0,1},
	{0,1,0,0,3,3,0,0,1,0},
	{0,0,1,0,0,0,0,1,0,0},
	{0,0,0,1,2,2,1,0,0,0},
	{0,0,0,0,1,1,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0}
	},
	{
	{0,0,0,0,1,0,0,0,0,0},
	{0,0,0,1,0,1,0,0,0,0},
	{0,0,1,2,3,0,1,0,0,0},
	{0,1,0,0,0,0,0,1,0,0},
	{1,2,3,0,4,0,0,0,1,0},
	{0,1,0,0,0,0,0,3,2,1},
	{0,0,1,0,3,0,0,0,1,0},
	{0,0,0,1,2,0,0,1,0,0},
	{0,0,0,0,1,0,1,0,0,0},
	{0,0,0,0,0,1,0,0,0,0}
	}
};

注意还是全局变量,我们设置当r键按下重置本关,所以我们要修改 keyevent()函数,当r按下我们遍历map数组将他赋值为原来的地图

void keyevent()
{
	int i = 0; int j = 0;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			if (map[level][i][j] == PLAYER || map[level][i][j] == PLAYER + DEST)
			{
				goto end;
			}
		}
	}
end:;
	char ch = _getch();
	//printf("%d    %c", ch, ch);//w 119 a 97 s 115  d 100
	switch (ch)
	{
	case 119:
	case 'w ':
	case 'W':
		if (map[level][i - 1][j] == SPACE || map[level][i - 1][j] == DEST)
		{
			map[level][i - 1][j] += 4;
			map[level][i][j] -= 4;



		}
		else  if (map[level][i - 1][j] == BOX || map[level][i - 1][j] == BOX + DEST)
		{
			if (map[level][i - 2][j] == SPACE || map[level][i - 2][j] == DEST)
			{
				map[level][i - 2][j] += BOX;
				map[level][i - 1][j] = map[level][i - 1][j] - BOX + PLAYER;
				map[level][i][j] -= PLAYER;//玩家消失在原来位置





			}



		}

		break;
	case 97:
	case 'a ':
	case'A':
		if (map[level][i][j - 1] == SPACE || map[level][i][j - 1] == DEST)
		{
			map[level][i][j - 1] += 4;
			map[level][i][j] -= 4;



		}
		else  if (map[level][i][j - 1] == BOX || map[level][i][j - 1] == BOX + DEST)
		{
			if (map[level][i][j - 2] == SPACE || map[level][i][j - 2] == DEST)
			{
				map[level][i][j - 2] += BOX;
				map[level][i][j - 1] = map[level][i][j - 1] - BOX + PLAYER;
				map[level][i][j] -= PLAYER;//玩家消失在原来位置





			}



		}
		break;
	case 115:
	case 's ':
	case'S':
		if (map[level][i + 1][j] == SPACE || map[level][i + 1][j] == DEST)
		{
			map[level][i + 1][j] += 4;
			map[level][i][j] -= 4;



		}
		else  if (map[level][i + 1][j] == BOX || map[level][i + 1][j] == BOX + DEST)
		{
			if (map[level][i + 2][j] == SPACE || map[level][i + 2][j] == DEST)
			{
				map[level][i + 2][j] += BOX;
				map[level][i + 1][j] = map[level][i + 1][j] - BOX + PLAYER;
				map[level][i][j] -= PLAYER;//玩家消失在原来位置





			}



		}
		break;
	case 100:
	case 'd ':
	case'D':
		if (map[level][i][j + 1] == SPACE || map[level][i][j + 1] == DEST)
		{
			map[level][i][j + 1] += 4;
			map[level][i][j] -= 4;



		}
		else  if (map[level][i][j + 1] == BOX || map[level][i][j + 1] == BOX + DEST)
		{
			if (map[level][i][j + 2] == SPACE || map[level][i][j + 2] == DEST)
			{
				map[level][i][j + 2] += BOX;
				map[level][i][j + 1] = map[level][i][j + 1] - BOX + PLAYER;
				map[level][i][j] -= PLAYER;//玩家消失在原来位置





			}



		}
		break;
	case 'r':///新增
	case'R' :///新增
		for (int i = 0; i < 10; i++)///新增
		{///新增
			for (int j = 0; j < 10; j++)///新增
			{
				map[level][i][j] = mapreset[level][i][j];///新增




			}///新增
		}///新增
		break;///新增








	}///新增



}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1057303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySql017——组合查询

一、UNION作用 可用UNION操作符来组合数条SQL查询。 二、UNION 使用规则 1、UNION的使用很简单。所需做的只是给出每条SELECT语句&#xff0c;在各条语句之间放上关键字UNION。2、UNION必须由两条或两条以上的SELECT语句组成&#xff0c;语句之间用关键字UNION分隔&#xff…

Python绘图系统25:新增8种绘图函数

文章目录 常用绘图函数单选框的更改逻辑源代码 Python绘图系统&#xff1a; 前置源码&#xff1a; Python打造动态绘图系统&#x1f4c8;一 三维绘图系统 &#x1f4c8;二 多图绘制系统&#x1f4c8;三 坐 标 轴 定 制&#x1f4c8;四 定制绘图风格 &#x1f4c8;五 数据生成导…

PCB放置过孔技巧

合理的放置过孔能有效的节约面积。 我们根据嘉立创的pcb工艺能力中写出单双面板最小过孔为0.3mm(内径)/0.5mm(外径) 设置过孔尺寸外直径为24mil&#xff08;0.61mm&#xff09;&#xff09;内直径为12mil&#xff08;0.305mm&#xff09; 嘉立创PCB工艺加工能力范围说明-嘉立…

Blender 导出 fbx 到虚幻引擎中丢失材质!!!(使用Blender导出内嵌材质的fbx即可解决)

目录 0 引言1 Blender导出内嵌纹理的fbx模型 0 引言 我在Blender处理了一些fbx模型后再次导出到UE中就经常出现&#xff0c;材质空白的情况&#xff08;如下图所示&#xff09;&#xff0c;今天终于找到问题原因&#xff0c;记录下来&#xff0c;让大家避免踩坑。 其实原因很简…

Ubuntu18.04搭建Jenkins自动化部署Gitee仓库代码

1、安装Java环境 sudo apt install openjdk-8-jdk 然后通过java -version查看Java环境是否搭建成功&#xff1a; 2、安装Jenkins 下载Jenkins.war包&#xff1a; https://sg.mirror.servanamanaged.com/jenkins/war-stable/2.319.1/jenkins.war 然后参考Jenkins官网有关je…

springmvc-JSR303进行服务端校验分组验证SpringMVC定义Restfull接口异常处理流程RestController异常处理

目录& 1. JSR303 2. JSR303中含有的注解 3. spring中使用JSR303进行服务端校验 3.1 导入依赖包 3.2 添加验证规则 3.3 执行校验 4. 分组验证 4.1 定义分组验证规则 4.2 验证时通过参数指定验证规则 4.3 验证信息的显示 5. SpringMVC定义Restfull接口 5.1 增加s…

Moonbeam Ignite强势回归

参与Moonbeam上最新的流动性计划 还记得新一轮的流动性激励计划吗&#xff1f;Moonbeam Ignite社区活动带着超过300万枚GLMR奖励来啦&#xff01;体验新项目&#xff0c;顺便薅一把GLMR羊毛。 本次Moonbeam Ignite活动的参与项目均为第二批Moonbeam生态系统Grant资助提案中获…

数据结构与算法课后题-第三章(堆栈和队列的应用)

#include <iostream> //引入头文件 using namespace std;typedef char Elemtype;#define Maxsize 10 #define ERROR 0 #define OK 1typedef struct {Elemtype data[Maxsize];int top; }SqStack;SqStack S;void InitStack(SqStack& S) {S.top -1; } bool StackEm…

腾讯云双十一活动什么时候开始?具体有哪些优惠活动?

腾讯云双十一活动什么时候开始&#xff1f;具体有哪些优惠活动&#xff1f; 双十一购物狂欢节即将到来&#xff0c;各大电商平台都纷纷推出了一系列的优惠活动&#xff0c;吸引消费者前来购买。作为云服务行业的领导者&#xff0c;腾讯云自然也不会错过这个机会。腾讯云将为用户…

侯捷 C++ STL标准库和泛型编程 —— 6 算法 + 7 仿函数

6 算法 算法的标准样式&#xff1a;需要传进去两个指针 6.1 算法源码 6.1.1 accumulate 两个版本&#xff1a; 元素累加到 init 上 template <class InputIterator, class T> T accumulate(InputIterator first, InputIterator last, T init) {for (; first ! last; f…

【小沐学前端】从零开始搭建一个Vue项目

文章目录 1、简介1.1 Vue 核心功能1.2 Vue API风格1.3 node环境 2、构建项目2.1 vue create2.2 vue ui2.3 vue init2.4 vite 结语 1、简介 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&am…

ESP32设备驱动-I2C-LCD1602显示屏驱动

I2C-LCD1602显示屏驱动 1、LCD1602介绍 LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。 通过前面的实例我们知道,并口方式…

游戏开发者如何能达到5万月薪?这太难了......

引言 大家好&#xff0c;我是亿元程序员&#xff0c;一位有着8年游戏行业经验的主程。 在现代世界&#xff0c;游戏开发已经成为一个备受追捧的职业选择&#xff0c;而月薪5万则是许多年轻游戏开发者的梦想。虽然这个目标可能看起来有些遥不可及&#xff0c;但通过坚定的决心…

周记之反思

9.25 这篇总结我承认&#xff0c;是在26号上午写的&#xff0c;那昨天晚上又聊天了&#xff0c;但是对比之前来说好很多了&#xff0c;所以26号上午也就是今天我起了个大早&#xff0c;然后把昨天的尾巴收了一下&#xff0c;没收完&#xff0c;先说说成果&#xff1a; 完成了…

意大利开源硬件公司【Arduino】完成2200万美元融资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;意大利开源硬件公司【Arduino】今日宣布已完成2200万美元融资。 本轮融资总额已经达到5400万美元&#xff0c;本轮融资由CDP Venture Capital和Anzu Partners共同领投。 Arduino打算利用这笔资金在…

一款Python音频处理的利器

迷途小书童 读完需要 3分钟 速读仅需 1 分钟 当谈到音频处理和编辑时&#xff0c;PyDub 是一个非常强大且易于使用的开源库。它提供了许多功能&#xff0c;如音频剪切、合并、混音、变速、变调等。本篇带大家一起逐步了解 PyDub 的基本原理和使用方法。 安装 PyDub 非常简单。你…

“文化共传承 艺术润心灵”——江南大学国家艺术基金走向社区

2023年9月26日、28日晚19点&#xff0c;由无锡市文化广电和旅游局主办的2023年无锡市优秀民乐作品巡演在梁溪区、锡山区隆重举办&#xff0c;江南大学“山水清音”民乐团参演其中。 锡山区演出现场 《梅里春早》是由江南大学人文学院音乐系沈雷强教授领衔的国家艺术基金小型剧&…

OCTA数据集(Rose)+ OCTA-Net

ROSE: A Retinal OCT-Angiography Vessel Segmentation Dataset and New Model 目录 一、摘要 二、创新点 三、数据集 A. ROSE-1 B. ROSE-2 四、Method A. Coarse Stage: Split-based Coarse Segmentation Module&#xff08;粗分割模块&#xff09; 1. SCS模块概述&…

机器人中的数值优化(二十)——函数的光滑化技巧

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

黑豹程序员-CSS四种样式的定义方式及冲突后的就近原则

4种样式定义 浏览器缺省设置&#xff08;即默认&#xff09;外部样式表&#xff08;引用的css&#xff09;内部样式表&#xff08;位于 标签内部&#xff09;内联样式&#xff08;在 HTML 元素内部&#xff09; 样式冲突如何解决&#xff1f; 若多重样式将层叠为一个&#x…