【c语言】推箱子

所需知识: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://如果二维数组元素为0printf("  ");  //空地        //一个中文字符相当于二个英文字符break;case WALL://如果二维数组元素为1printf("■");//墙break;case DEST://如果二维数组元素为2printf("☆");//目的地break;case BOX://如果二维数组元素为3printf("□");//箱子break;case PLAYER://如果二维数组元素为4printf("♀");//玩家break;case PLAYER+DEST://如果二维数组元素为6printf("♂");//玩家在目的地break;case BOX+DEST://如果二维数组元素为5printf("★");箱子在目的地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 100switch (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 100switch (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.mzph.cn/news/93335.shtml

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

相关文章

STM32之DMA

简介 • DMA &#xff08; Direct Memory Access &#xff09;直接存储器存取 &#xff08;可以直接访问STM32内部存储器&#xff0c;如SRAM、程序存储器Flash和寄存器等&#xff09; •DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输&#xff0c;无须CPU干预&a…

pytorch函数reshape()和view()的区别及张量连续性

目录 1.view() 2.reshape() 3.引用和副本&#xff1a; 4.区别 5.总结 在PyTorch中&#xff0c;tensor可以使用两种方法来改变其形状&#xff1a;view()和reshape()。这两种方法的作用是相当类似的&#xff0c;但是它们在实现上有一些细微的区别。 1.view() view()方法是…

古记事法:Windows 下 16 位汇编环境搭建指南(DOSBox-X 篇)

文章目录 参考环境DOSBox-XWOWWindows On Windows 产生的原因Windows On Windows 的工作原理WOW16 的结束与 WOW64 的未来 在现代操作系统中运行 16 位应用程序DOSBox-X 16 位汇编环境的搭建应用准备挂载自动挂载dosbox-x.conf配置工具 参考 项目描述搜索引擎Bing、GoogleAI 大…

二极管的直流等效电路和微变等效电路

二级管的主要参数 1.IF&#xff08;最大整流的电流&#xff09; 二极管长期工作做能够通过电流的平均最大值&#xff1a;物理意义&#xff1a;功率电流值。 2.UR 二极管最高反向工作电压 需要留有裕度&#xff0c;通常能达到一半的裕度&#xff1b;UR不能等于UBR。 3.IR 未击穿…

自动驾驶技术:现状与未来

自动驾驶技术&#xff1a;现状与未来 文章目录 引言自动驾驶技术的现状自动驾驶技术的挑战自动驾驶技术的未来结论结论 2023星火培训【专项营】Apollo开发者社区布道师倾力打造&#xff0c;包含PnC、新感知等的全新专项课程上线了。理论与实践相结合&#xff0c;全新的PnC培训不…

傅里叶系列 P1 的定价选项

如果您想了解更多信息&#xff0c;请查看第 2 部分和第 3 部分。 一、说明 这是第一篇文章&#xff0c;我将帮助您获得如何使用这个新的强大工具来解决金融中的半分析问题并取代您的蒙特卡洛方法的直觉。 我们都知道并喜欢蒙特卡洛数字积分方法&#xff0c;但是如果我告诉你你可…

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

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

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石②

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石② 第十九章 驱动程序基石②19.3 异步通知19.3.1 适用场景19.3.2 使用流程19.3.3 驱动编程19.3.4 应用编程19.3.5 现场编程19.3.6 上机编程19.3.7 异步通知机制内核代码详解 19.4 阻塞与非阻塞19.4.1 应用编程19.4.2 驱动编程…

Unity HDRP Custom Pass 实现场景雪地效果

先使用Shader Graph连一个使用模型法线添加雪地的shader&#xff0c;并赋给一个material。 1.1 先拿到模型世界坐标下的顶点法线&#xff0c;简单处理一下&#xff0c;赋给透明度即可。 给场景添加Custom Pass&#xff0c;剔除不需要的层级。 1.在Hierarchy界面中&#xff…

用于自然语言处理的 Python:理解文本数据

一、说明 Python是一种功能强大的编程语言&#xff0c;在自然语言处理&#xff08;NLP&#xff09;领域获得了极大的普及。凭借其丰富的库集&#xff0c;Python 为处理和分析文本数据提供了一个全面的生态系统。在本文中&#xff0c;我们将介绍 Python for NLP 的一些基础知识&…

SSM - Springboot - MyBatis-Plus 全栈体系(十六)

第三章 MyBatis 三、MyBatis 多表映射 2. 对一映射 2.1 需求说明 根据 ID 查询订单&#xff0c;以及订单关联的用户的信息&#xff01; 2.2 OrderMapper 接口 public interface OrderMapper {Order selectOrderWithCustomer(Integer orderId); }2.3 OrderMapper.xml 配置…

讲讲项目里的仪表盘编辑器(三)布局组件

布局容器处理 看完前面两章的讲解&#xff0c;我们对仪表盘系统有了一个大概的理解。接着我们讲讲更深入的应用。 上文讲解的编辑器只是局限于平铺的组件集。而在编辑器中&#xff0c;还会有一种组件是布局容器。它允许其他组件拖拽进入在里面形成自己的一套布局。典型的有分页…

Python基础语法(1)

目录 一、常量和表达式 二、变量和类型 2.1 变量是什么 2.2 变量的语法 2.2.1 定义变量 2.2.2 使用变量 2.3 变量的类型 2.3.1 整数 2.3.2 浮点数(小数) 2.3.3 字符串 2.3.4 布尔 2.3.5 其他 2.4 为什么要有这么多类型 2.4.1 类型决定了数据在内存中占据多大空间…

【STM32 CubeMX】移植u8g2(一次成功)

文章目录 前言一、下载u8g2源文件二、复制和更改文件2.1 复制文件2.2 修改文件u8g2_d_setup文件u8g2_d_memory 三、编写oled.c和oled.h文件3.1 CubeMX配置I2C3.2 编写文件oled.holed.c 四、测试代码main函数测试代码 总结 前言 在本文中&#xff0c;我们将介绍如何在STM32上成…

[C++随想录] 优先级队列

优先级队列 基本使用题目训练 基本使用 priority_queue, 优先级队列, 又叫做双端队列, 头文件也是 <queue> 别看它叫做队列, 其实它是一个 堆 补充一下概念: 大根堆 — — 每一棵树的父节点比它的孩子都大小跟堆 — — 每一棵树的父节点比它的孩子都小 &#x1f447;&…

Golang语法、技巧和窍门

Golang简介 命令式语言静态类型语法标记类似于C&#xff08;但括号较少且没有分号&#xff09;&#xff0c;结构类似Oberon-2编译为本机代码&#xff08;没有JVM&#xff09;没有类&#xff0c;但有带有方法的结构接口没有实现继承。不过有type嵌入。函数是一等公民函数可以返…

设计模式10、外观模式Facade

解释说明&#xff1a;外观模式&#xff08;Facade Pattern&#xff09;又称为门面模式&#xff0c;属于结构型模式 Faade 为子系统中的一组接口提供了一个统一的高层接口&#xff0c;该接口使得子系统更加容易使用 外观&#xff08;Facade)角色&#xff1a;为多个子系统对外提供…

Sql注入(手工注入思路、绕过、防御)

一、Sql注入思路 1、判断注入点 在GET参数、POST参数、以及HTTP头部等&#xff0c;包括Cookie、Referer、XFF(X-Forwarded-for)、UA等地方尝试插入代码、符号或语句&#xff0c;尝试是否存在数据库参数读取行为&#xff0c;以及能否对其参数产生影响&#xff0c;如产生影响则…

信创办公–基于WPS的EXCEL最佳实践系列 (数据整理复制粘贴)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;数据整理复制粘贴&#xff09; 目录 应用背景操作步骤1、数据查找与替换2、复制或粘贴数据3、使用自动填充工具4、将数据拆分到多列5、应用数字格式 应用背景 数据的整理复制粘贴等在日常的工作中经常使用。本章内容主要学习…

设计模式 - 享元模式

目录 一. 前言 二. 实现 一. 前言 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;它主要解决的问题是创建大量相似对象时的内存开销问题。该模式通过共享具有相同状态的对象来减少内存使用量。 享元模式的思想是&#xff1a;当需要创建…