C语言实现简单推箱子游戏
使用C语言实现超简单的推箱子游戏,供大家参考,具体内容如下
感谢您打开了这篇文章,下面我将讲述一下推箱子是如何实现的。
另外附赠适配该程序简单好用专属推箱子地图编辑器让您在16*16大地图的条件下也能轻松编辑地图。
链接:地图编辑器
本程序在没有检测到地图文件的情况下也能独自运行!代码中储存了推箱子游戏第一关的标准地图,让您在没有地图文件的情况下也能熟悉整个程序的流程!
当然,拥有地图文件会也会获得更好的游戏体验,请自行编辑。
废话不多说!
下面进入技术环节:
C语言版多功能推箱子
编译环境:WindowsVS2019
其他编译器,可通过查看下文的“注意事项”将代码更正为其他平台可正常版本
需求:
控制人物将箱子推至目标中,目标全部完成进入下一关。
思路:
使用二维数组储存不同数字,数字包括了地图中所有的元素,通过按键控制人物完成推箱子的操作,达成关卡内的所有目标后,自动进入下一关。
做法:
主要逻辑移动推箱子部分:按下方向键后,双重循环找到人物,根据移动方向储存人物、人物前面、箱子、箱子前面四大基础信息,并通过判断前方数组值是否是墙壁、目标等,进行人物移动和箱子移动操作。
具体详细做法我已经整理到了代码注释当中,以便一一对应查看。
使用到知识点:
循环、二维数组、读取文件
难点:
在人物和箱子移动的同时,有需要注意当人物移动到了未完成目标或已完成目标、箱子移动到了已完成目标的情况,这种情况需要判断在人物/箱子离开之后,原地又再次变为原元素。
说明:
程序前部分有较多代码用于写出未检测到文件的情况逻辑和关卡选择逻辑,如果要直接查看核心代码请移动到operation();操作人物函数和gbszszhs(charch);修改二维数组函数。
注意:
由于编译器原因,程序中_kbhit()和_getch()函数可能在其他编译器上编译会出现错误,解决办法是去掉函数前面的“_”。
同时,要将文件打开函数fopen_s(&fp,FLPA,“r”);更改为fp=fopen(FLPA,“r”);
fcanf_s更改为fcanf scanf_s()更改为scanf
运行效果:
菜单选择:
游戏进行:
代码实现:
#include#include #include //0代表空地,1代表墙,2代表未达成的目标,3代表箱子,4代表玩家,5代表已放箱子的目标, //6代表人暂时所在的未达成的目标,7代表人暂时所在的已达成的目标,8代表箱子暂时所在的已达成的目标 #defineWH16//地图的宽高 #defineBYT529//一关需要跳过的字数因为文件指针定位函数的原因,有时定位可能会不准确,可以通过修改BYT进行适配 #defineFLPA"C:\\Users\\ASUS\\Desktop\\推箱子地图.txt"//需要读取地图文件的路径游戏之前需进行设置!! //找不到路径将只能进行第一关游戏 //注意:游戏地图边界不可以当做墙壁使用! #defineINITMAP\ intmapch_init[WH][WH]={\ {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,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,1,0,0,0,0,0,0,0},\ {0,0,0,0,0,0,1,2,1,0,0,0,0,0,0,0},\ {0,0,0,0,0,0,1,0,1,1,1,1,0,0,0,0},\ {0,0,0,0,1,1,1,3,0,3,2,1,0,0,0,0},\ {0,0,0,0,1,2,0,3,4,1,1,1,0,0,0,0},\ {0,0,0,0,1,1,1,1,3,1,0,0,0,0,0,0},\ {0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,0},\ {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,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},\ }; intmapch[WH][WH]; //所有函数之间不是独立和顺序的,会互相调用 voidHideCursor();//隐藏光标 voidgotoxy(intx,inty);//光标定位 voidscmbxyhs();//输出地图下方文字信息函数 voidwjzdwjzjjrqk();//未找到文件直接进入第一关情况 intgkxzhs();//关卡选择函数 voidcwjzjrwkdhs();//从文件中进入关卡的函数 voidgnxzjm();//主菜单选择 voidcshhs();//初始化函数 voidtranmap();//翻译并画出地图 voiddetection();//寻找所有该地图中未完成的目标 voidgktgszxhs();//判断关卡是否通过,是进行下一关卡 voidoperation();//操作人物主要函数*** voidgbszszhs(charch);//改变数组数值函数 intupdatetime();//获取一次电脑现在的时间 voidprocess();//主要流程 intmain() { cshhs();//初始化函数 process();//主要流程 return0; } //游戏开始初始化部分 voidscmbxyhs()//输出地图提示信息函数 { gotoxy(34,17); printf("本关剩余目标数:"); gotoxy(34,19); printf("本关已走步数:"); gotoxy(32,21); printf("您使用秒完成了本关!"); gotoxy(49,19); printf("0");//输出初始的步数0 } voidwjzdwjzjjrqk()//未找到文件直接进入第一关情况 { system("cls"); printf("地图文件不存在,\n直接进入第一关"); INITMAP//初始地图数组 for(inti=0;i maxn)//对输入的错误关卡信息加以限制 { gotoxy(36,12); printf(""); gotoxy(33,11); printf("请输入正确的关数"); gotosrgk;//如果输入错误的关卡输出提示信息并返回到输入的地方重新输入 } return1;//如果找到了文件就返回1 } voidcwjzjrwkdhs()//从文件中进入关卡,适用于可以找到地图文件的情况 { //关数变量n的默认初始化值为1 FILE*fp=NULL; fopen_s(&fp,FLPA,"rb"); if(fp==NULL) { wjzdwjzjjrqk();//直接进入第一关函数 return;//地图文件不存在则直接进入第一关 } //读文件进入关卡的代码,从第一关进入和选择特定关从n关进入两种情况都会执行 //流程如果用到该函数,检测已达成的目标和未达成目标的个数一直则调用函数,n关数自增1 intskip=(n-1)*BYT;//到n关需要跳过的字数跳过一关需要的字数为512 fseek(fp,skip,0);//定位到地图文件第skip个字节处开始读取 inti,j; for(i=0;i maxn)//如果关数n大于了最大关卡数则返回主菜单 { tranmap();//画出地图 gotoxy(26,22); printf("您已通关所有关卡,3秒后返回主菜单!"); Sleep(3000);//等待三秒 opnum=0,time=updatetime(),time_2=0;//行走的步数,本关时间清0,重新获取当前时间,\ 因为需要输出的time_2是用当前时间-刚开始的时间 gnxzjm();//主菜单页面选择函数 } else { tranmap();//画出地图 Sleep(2000);//等候两秒 cwjzjrwkdhs();//当前关卡目标为0时,从文件中向地图数组中读入下一关卡的信息 detection();//统计当前关卡目标个数 scmbxyhs();//输出地图下方的信息 opnum=0,time=updatetime(),time_2=0;//注释见297行 //按键结束之后操控函数会调用画出地图函数 } } } inti,j;//找到后的人的坐标 intbox_x,box_y;//箱子的坐标 intboxnext_x,boxnext_y;//箱子前面的坐标 intpeonext_x,peonext_y;//人前面的坐标 voidgbszszhs(charch)//修改地图数组值主要函数** { for(i=0;i 主要函数:gbszszhs()里面的逻辑是比较复杂的,我当时写这段代码的时候也是反反复复修改好多次甚至推翻重做才理通顺这些逻辑的。
如果对于程序代码注释有我没写明白的地方,欢迎在评论区下方留言询问,如果我看到会尽最大的努力为您解惑。
不足之处:
地图在屏幕上显示时容易出错,需要调整每关字数。原因并不明确。
因为作者对C语言的学习还比较浅薄,代码写到初始化游戏的两种模式(有文件和无文件)时思维有些混乱,导致代码在这一部分有很多的缺陷,但最终程序的效果还是出来了。
但其实对整篇所有代码而言最重要的部分还是gbszszhs()函数,只要将这个函数完全理解并熟练掌握了,那么整个“推箱子”游戏也就非常简单了。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。