iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >【c语言】推箱子
  • 330
分享到

【c语言】推箱子

c语言 2023-10-09 14:10:35 330人浏览 薄情痞子
摘要

所需知识:C语言枚举,数组,for循环,while循环,switch,case语句,图形库相关函数 1.调整控制台窗口大小 #define _CRT_SECURE_NO_WARNINGS#in

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

1.调整控制台窗口大小

#define  _CRT_SECURE_NO_WARNINGS#include #include int main(){system("mode con lines=15 cols=25");//调整窗口大小return 0;}

在这里插入图片描述

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

#define  _CRT_SECURE_NO_WARNINGS#include #include 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 #include #include 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 

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 #include #include //_getch()函数头文件#include //bool类型的头函数#include //图形库头文件//定义一个二维数组,做地图//空地0  墙1  目的地2  箱子3  玩家4    箱子在目的地 5  玩家在目的地6IMAGE  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;///新增}///新增}

来源地址:https://blog.csdn.net/yyqzjw/article/details/133484321

--结束END--

本文标题: 【c语言】推箱子

本文链接: https://www.lsjlt.com/news/426321.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【c语言】推箱子
    所需知识:c语言枚举,数组,for循环,while循环,switch,case语句,图形库相关函数 1.调整控制台窗口大小 #define _CRT_SECURE_NO_WARNINGS#in...
    99+
    2023-10-09
    c语言
  • C语言实现推箱子代码
    本文实例为大家分享了C语言实现推箱子代码的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #...
    99+
    2024-04-02
  • C语言怎么实现推箱子
    本文小编为大家详细介绍“C语言怎么实现推箱子”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言怎么实现推箱子”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。具体代码如下#inc...
    99+
    2024-04-02
  • 怎么用C语言实现推箱子
    这篇文章主要介绍“怎么用C语言实现推箱子”,在日常操作中,相信很多人在怎么用C语言实现推箱子问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C语言实现推箱子”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-29
  • C语言系列之推箱子游戏
    本文实例为大家分享了C语言系列之推箱子游戏的具体代码,供大家参考,具体内容如下 输入WSAD控制行走,只需要把一个方向的代码写好了,剩下的是三个方向就是复制粘贴和简单的修改就可以了。...
    99+
    2024-04-02
  • C语言+MySQL实现推箱子游戏
    目录图片素材及源码数据库SQL语句操作数据库C++代码database.hdatabase.cpp推箱子游戏代码box_man.hbox_man.cpp图片素材及源码 下载链接 数据...
    99+
    2024-04-02
  • C语言实现推箱子功能汇总
    本文实例为大家分享了C语言实现推箱子功能的具体代码,供大家参考,具体内容如下 前言: 先说说我写推箱子小游戏的过程。 第一版:没有图形化界面,不能选关。只有推箱子的最基础功能。 第二...
    99+
    2024-04-02
  • C语言实现简单的推箱子游戏
    本文实例为大家分享了C语言实现简单的推箱子游戏的具体代码,供大家参考,具体内容如下 项目实现的具体方案: 先安装VS2019,后安装画图工具Easyx,安装以后就可以将推箱子中的(人...
    99+
    2024-04-02
  • 用C语言实现推箱子游戏实例
    目录前言游戏效果图游戏开发思路游戏逻辑的分析源代码实现 头文件PushBackGame.c文件test.c文件总结前言 本游戏需要用到的核心技术,如下:二维数组分支语句 技...
    99+
    2024-04-02
  • C语言如何实现推箱子小游戏
    本篇内容介绍了“C语言如何实现推箱子小游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本文实例为大家分享了C语言实现推箱子代码的具体代码,...
    99+
    2023-06-20
  • C语言实现简单的推箱子小游戏
    本文实例为大家分享了C语言实现简单推箱子小游戏的具体代码,供大家参考,具体内容如下 此推箱子游戏可以实现人物移动,箱子移动,人物不出框,自义定文件关卡,重新开始以及回退复位等功能的实...
    99+
    2024-04-02
  • 如何使用C语言实现推箱子游戏
    这篇文章主要为大家展示了“如何使用C语言实现推箱子游戏”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用C语言实现推箱子游戏”这篇文章吧。1.前言推箱子是c语言的一个经典的项目2.游戏效果展...
    99+
    2023-06-29
  • 详解C语言实现推箱子的基本功能
    目录1.前言2.游戏效果展示3.项目分析4.地图实现4.1存储地图4.2打印地图5.控制角色移动5.1找到控制的角色5.2实现移动6.判断胜利总结1.前言 首先推箱子是c语言的一个经...
    99+
    2024-04-02
  • 详解C语言实现推箱子的基本功能(2)
    目录1.前言2.地图代码修改成函数3.角色移动修改成函数3.1寻找角色函数3.2角色移动函数4.判断胜利修改成函数5.主体函数的实现6.推箱子能实现基本功能的源码总结1.前言 本文章...
    99+
    2024-04-02
  • C语言 完整游戏项目推箱子详细代码
    话不多说 我们今天就来创造出属于我们自己的《推箱子》,GOGOGO!!! 直接开始吧 首先是我们用二维数组特定的数字描绘出这个地图 int cas = 0; int map[3...
    99+
    2024-04-02
  • 怎么用C语言实现游戏项目推箱子效果
    本篇内容主要讲解“怎么用C语言实现游戏项目推箱子效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用C语言实现游戏项目推箱子效果”吧!直接开始吧首先是我们用二维数组特定的数字描绘出这个地图i...
    99+
    2023-06-25
  • C/C++实现推箱子小游戏
    本文实例为大家分享了C/C++实现推箱子小游戏的具体代码,供大家参考,具体内容如下 效果演示 实现功能 如上图所示。按键控制小猪的运动,推箱子到达目的地。 如何实现 1.首先思考要...
    99+
    2024-04-02
  • C/C++编写推箱子小游戏
    本文实例为大家分享了C/C++编写推箱子小游戏的具体代码,供大家参考,具体内容如下 我们用' #'来代表墙,‘O'来代表箱子,' * '代表终点,‘@'代表箱子已经到达终点,‘S来表...
    99+
    2024-04-02
  • C++实现推箱子小项目
    本文实例为大家分享了C++实现推箱子小项目的具体代码,供大家参考,具体内容如下 代码: #include <bits/stdc++.h> #include<c...
    99+
    2024-04-02
  • 用C++实现推箱子小游戏
    前言 推箱子小游戏相信是很多人的同年记忆了,今天用c++语言来尝试下,用的是vs编译器。 代码还有很多可以优化的地方,为了更直观了解函数的形参和实参,所以地图没有用全局变量声明了,其...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作