利用C语言二维数组编写推箱子小游戏


写在前面

刚在整理大一上的文件的时候,无意中翻看到前年在学校写的推箱子,那时刚学完数组,想整点活,查阅了一些资料后花一下午写了这个,其实还有很多想法的,但后面因为时间原因就只弄了这个1.0版本
这些存在电脑里的东西随时都容易被误删,感觉也有点可惜哈哈
正好闲着就传到这里,一方面做个纪念,满足自己小小的虚荣心,如果有能帮助到刚学习C的朋友们那就更好了


程序思路

因为当时刚入门,没有写注释的习惯,便于理解,我稍微回忆了一下当时撰写的思路。
首先,这个小游戏是在基于在主函数里的死循环一遍遍刷新屏幕所产生的实时运行的效果。所以在循环里面我们需要:
1、清空上一帧内容
2、将地图数据输出
3、等待键盘输入
4、响应并修改地图数据
利用二维数组可以比较直观地观测和绘制游戏地图,并且在这样的小游戏中,并不会出现因数据处理效率带来的卡顿。
主要的写作在于角色移动,需要进行分类讨论:前进方向是否为墙壁、前进方向为箱子并且箱子是否与墙壁靠着、如箱子前方无墙壁是否推进或推出了标记点…
此处是一个细活,但只要在某个方向上写好了,另外三个方向稍加修改便可。


1.0源代码

#include<stdio.h>
#include<stdlib.h>
#include<conio.h> 
#define WIDTH 8
#define HEIGHT 8
//20191121 zc 
int map[HEIGHT][WIDTH]={
	{0, 0, 1, 1, 1, 0, 0, 0},
	{0, 0, 1, 4, 1, 0, 0, 0},
	{0, 0, 1, 0, 1, 1, 1, 1},
	{1, 1, 1, 3, 0, 3, 4, 1},
	{1, 4, 0, 3, 2, 1, 1, 1},
	{1, 1, 1, 1, 3, 1, 0, 0},
	{0, 0, 0, 1, 4, 1, 0, 0},
	{0, 0, 0, 1, 1, 1, 0, 0} 
};
int x,y;
int boxs,save,target;
int main(){
	initdata();
	char input;
	while(boxs<target){
	   system("cls");
	   drawmap();
	   input=getch();
	   switch(input){
	   	     case 'W':
			 case 'w':moveup();
			          break;
			 case 'S':
			 case 's':movedown();
			          break;
			 case 'A':
			 case 'a':moveleft();
			          break;
			 case 'D':
			 case 'd':moveright();
			          break;  
	   }
	}
	system("cls");
	drawmap(); 
	printf("恭喜你,成功了!") ; 
	return 0;
}

initdata(){
	y=4;
	x=4;
	save=0;
	boxs=0;
	target=4;
}

drawmap(){
	int i,j;
	printf("推箱子1.0\n"); 
	for(i=0;i<8;i++){
		for(j=0;j<8;j++){
			switch(map[i][j]){
				case 0:printf("   ");break;
				case 1:printf(" ■");break;
				case 2:printf(" ♀");break;
				case 3:printf(" o ");break;
				case 4:printf(" ☆");break;
				case 5:printf(" ★");break;
			}
		}
		printf("\n");
	}
}

moveup(){
	switch(map[y-1][x]){
		case 0:map[y-1][x]=2;
		       map[y][x]=save;
			   save=0;
			   y=y-1;
			   break;
		case 4:map[y-1][x]=2;
		       map[y][x]=save;
			   save=4;
			   y=y-1;
		       break;
		case 1:break;
		case 3:switch(map[y-2][x]){
			         case 0:map[y-2][x]=3;
					        map[y-1][x]=2;
					        map[y][x]=save;
					        save=0;
					        y=y-1;
					        break;
	                 case 1:
					 case 3:
					 case 5:break;
					 case 4:map[y-2][x]=5;
					        map[y-1][x]=2;
							map[y][x]=save;
							save=0;
							y=y-1;
							boxs=boxs+1;
							break;   	       
			   } 
			   break;
		case 5:switch(map[y-2][x]){
			         case 0:map[y-2][x]=3;
					        map[y-1][x]=2;
					        map[y][x]=save;
					        save=4;
					        y=y-1;
					        boxs=boxs-1;
					        break;
	                 case 1:
					 case 3:
					 case 5:break;
					 case 4:map[y-2][x]=5;
					        map[y-1][x]=2;
							map[y][x]=save;
							save=4;
							y=y-1;
						//	boxs=boxs;
							break;   	       
			   } 
			   break;
	}
}

movedown(){
	switch(map[y+1][x]){
		case 0:map[y+1][x]=2;
		       map[y][x]=save;
			   save=0;
			   y=y+1;
			   break;
		case 4:map[y+1][x]=2;
		       map[y][x]=save;
			   save=4;
			   y=y+1;
		       break;
		case 1:break;
		case 3:switch(map[y+2][x]){
			         case 0:map[y+2][x]=3;
					        map[y+1][x]=2;
					        map[y][x]=save;
					        save=0;
					        y=y+1;
					        break;
	                 case 1:
					 case 3:
					 case 5:break;
					 case 4:map[y+2][x]=5;
					        map[y+1][x]=2;
							map[y][x]=save;
							save=0;
							y=y+1;
							boxs=boxs+1;
							break;   	       
			   } 
			   break;
		case 5:switch(map[y+2][x]){
			         case 0:map[y+2][x]=3;
					        map[y+1][x]=2;
					        map[y][x]=save;
					        save=4;
					        y=y+1;
					        boxs=boxs-1;
					        break;
	                 case 1:
					 case 3:
					 case 5:break;
					 case 4:map[y+2][x]=5;
					        map[y+1][x]=2;
							map[y][x]=save;
							save=4;
							y=y+1;
						//	boxs=boxs;
							break;   	       
			   } 
			   break;
	}
}

moveleft(){
	switch(map[y][x-1]){
		case 0:map[y][x-1]=2;
		       map[y][x]=save;
			   save=0;
			   x=x-1;
			   break;
		case 4:map[y][x-1]=2;
		       map[y][x]=save;
			   save=4;
			   x=x-1;
		       break;
		case 1:break;
		case 3:switch(map[y][x-2]){
			         case 0:map[y][x-2]=3;
					        map[y][x-1]=2;
					        map[y][x]=save;
					        save=0;
					        x=x-1;
					        break;
	                 case 1:
					 case 3:
					 case 5:break;
					 case 4:map[y][x-2]=5;
					        map[y][x-1]=2;
							map[y][x]=save;
							save=0;
							x=x-1;
							boxs=boxs+1;
							break;   	       
			   } 
			   break;
		case 5:switch(map[y][x-2]){
			         case 0:map[y][x-2]=3;
					        map[y][x-1]=2;
					        map[y][x]=save;
					        save=4;
					        x=x-1;
					        boxs=boxs-1;
					        break;
	                 case 1:
					 case 3:
					 case 5:break;
					 case 4:map[y][x-2]=5;
					        map[y][x-1]=2;
							map[y][x]=save;
							save=4;
							x=x-1;
						//	boxs=boxs;
							break;   	       
			   } 
			   break;
	}
}

moveright(){
	switch(map[y][x+1]){
		case 0:map[y][x+1]=2;
		       map[y][x]=save;
			   save=0;
			   x=x+1;
			   break;
		case 4:map[y][x+1]=2;
		       map[y][x]=save;
			   save=4;
			   x=x+1;
		       break;
		case 1:break;
		case 3:switch(map[y][x+2]){
			         case 0:map[y][x+2]=3;
					        map[y][x+1]=2;
					        map[y][x]=save;
					        save=0;
					        x=x+1;
					        break;
	                 case 1:
					 case 3:
					 case 5:break;
					 case 4:map[y][x+2]=5;
					        map[y][x+1]=2;
							map[y][x]=save;
							save=0;
							x=x+1;
							boxs=boxs+1;
							break;   	       
			   } 
			   break;
		case 5:switch(map[y][x+2]){
			         case 0:map[y][x+2]=3;
					        map[y][x+1]=2;
					        map[y][x]=save;
					        save=4;
					        x=x+1;
					        boxs=boxs-1;
					        break;
	                 case 1:
					 case 3:
					 case 5:break;
					 case 4:map[y][x+2]=5;
					        map[y][x+1]=2;
							map[y][x]=save;
							save=4;
							x=x+1;
						//	boxs=boxs;
							break;   	       
			   } 
			   break;
	}
}



可扩展的思路

其实大一学完C语言导论之后,有挺多对这个游戏进行优化的想法的,但那门课的老师更偏向于应试,对这方面对非计算机类的学生也没有期末设计作业这些的要求;所以那时我就刷高数去了!拖到寒假以后又是和同学峡谷战斗,拖着拖着就忘了O(∩_∩)O
有兴趣的朋友可以试一下,下面是我那时记下来的一些想法:
1.欢迎界面、胜利界面、计步功能
2.选关功能:将地图改成结构体,设置菜单选项进行选关
3.DIY关卡:编写关卡设置模块,玩家能够自己对地图进行绘制
4.地图保存功能:能够将地图文件导出和导入
5.界面优化:变得更像现代化的小游戏,这个东西就多了,俺也不懂哈哈
6.未完待续

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值