C语言推箱子的代码

#include <stdio.h>
#include <stdlib.h>
#include <conio.h> 

#define HEIGHT   10		//纵向  
#define WIDIH    10		//横向  

int x, y;				//人的位置 
int boxs;				//箱子数 

//函数声明 
void drawMap();			//打印地图  
void game();			//按键
void initData();		//初始化数据   
int map[HEIGHT][WIDIH] = {
    {0,0,0,0,0,0,0,0,0,0},
    {0,1,1,1,1,1,0,0,0,0},
    {0,1,2,0,0,1,0,0,0,0},
    {0,1,0,3,3,1,0,1,1,1},
    {0,1,0,3,0,1,0,1,4,1},
    {0,1,1,1,0,1,1,1,4,1},
    {0,0,1,1,0,0,0,0,4,1},
    {0,0,1,0,0,0,1,0,0,1},
    {0,0,1,0,0,0,1,1,1,1},
    {0,0,1,1,1,1,1,0,0,0}

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

int main() {
	initData();
	while(1){
		system("cls");	//清屏并打印地图  
		printf("箱子数:%d\n",boxs);
		drawMap();
		if(boxs==0){
			break;		//箱子数等于零,跳出循环  
		}
		
		game();
		initData();

	}
	printf("恭喜你完成游戏..........");
}

void drawMap(){
	int i, j;
	for(i=0; i<HEIGHT; i++){
		for(j=0; j<WIDIH; j++){
			switch(map[i][j]){
				case 0:  printf("  ");break;   //    空地 
				case 1:  printf("■");break;   //    墙 
				case 2:  printf("♀");break;   //    人 
				case 3:  printf("◆");break;   //    箱子 
				case 4:  printf("☆");break;   //    目的地
				case 5:  printf("★");break;   //    已完成 
				case 6:  printf("♀");break;   //    人+目的地 
			}
		}
		printf("\n");
	}
}

void initData(){
	int i, j;
	boxs = 0;
	for(i=0; i<HEIGHT; i++){
		for(j=0; j<WIDIH; j++){
			if(map[i][j]==2){		 
				y = i;
				x = j;	
			}
			if(map[i][j]==3){
				boxs++;
			}
		}
	}
}

void game(){
	char direction;	  //定义按键输入  
	direction = getch();
	
		switch(direction){
			//向上
			case 'w':
			case 'W':
				int wx,wy;
				wx = x;
				wy = y-1;
				
				//判断边界  
				if(y==0){
					break;
				}
					//人上方是墙  1
					if(map[wy][wx]==1){
						break;
					}
					//人上方是箱子或者已完成 3,5 
					if(map[wy][wx]==3||map[wy][wx]==5){
						//箱子上方是墙或者是箱子或者是已完成(球)  1,3,5 
						if(map[wy-1][wx]==1||map[wy-1][wx]==3||map[wy-1][wx]==5){
							break;
						}	
						//箱子上面是目的地 4
						if(map[wy-1][wx]==4){
							map[wy-1][wx] = 5;
						}else{ 	//箱子上面是空 0
							map[wy-1][wx] = 3; 
						}
					} 
					
					if(map[y][x]!=6){ 
						map[y][x] = 0;	//人向上移动,上面为空也是这种情况  0  
					}
					
					if(map[y][x]==6){
						map[y][x] = 4;
					}
					//人上面是目的地或者已完成 4,6 
					if(map[wy][wx]==4||map[wy][wx]==5){
						map[wy][wx] = 6; 
					}else{
						map[wy][wx]	= 2;
					}
					y = wy;
			break;
			
			//向下 
			case 's':
			case 'S':
				int sx,sy;
				sx = x;
				sy = y+1;

				if(y==HEIGHT-1){
					break;
				}
					if(map[sy][sx]==1){
						break;
					}
					if(map[sy][sx]==3||map[sy][sx]==5){
						if(map[sy+1][sx]==1||map[sy+1][sx]==3||map[sy+1][sx]==5){
							break;
						}	
						if(map[sy+1][sx]==4){
							map[sy+1][sx] = 5;
						}else{ 	
							map[sy+1][sx] = 3; 
						}
					} 
					if(map[y][x]!=6){ 
						map[y][x] = 0;	
					}
					
					if(map[y][x]==6){
						map[y][x] = 4;
					}	
					if(map[sy][sx]==4||map[sy][sx]==5){
						map[sy][sx] = 6; 
					}else{
						map[sy][sx]	= 2;
					}
					y = sy;
			break;
			
			//向左
			case 'a':
			case 'A':
				int ax,ay;
				ax = x-1;
				ay = y;
				
			 
				if(x==0){
					break;
				}

					if(map[ay][ax]==1){
						break;
					}
	
					if(map[ay][ax]==3||map[ay][ax]==5){
						if(map[ay][ax-1]==1||map[ay][ax-1]==3||map[ay][ax-1]==5){
							break;
						}	

						if(map[ay][ax-1]==4){
							map[ay][ax-1] = 5;
						}else{ 
							map[ay][ax-1] = 3; 
						}
					} 
					
					map[y][x] = 0;	
					if(map[ay][ax]==4||map[ay][ax]==5){
						map[ay][ax] = 6; 
					}else{
						map[ay][ax]	= 2;
					}
					x = ax;
			
			break;
			
				
			//向右
			case 'd':
			case 'D':
				int dx,dy;
				dx = x+1;
				dy = y;
				

				if(x==WIDIH-1){
					break;
				}

					if(map[dy][dx]==1){
						break;
					}

					if(map[dy][dx]==3||map[dy][dx]==5){

						if(map[dy][dx+1]==1||map[dy][dx+1]==3||map[dy][dx+1]==5){
							break;
						}	

						if(map[dy][dx+1]==4){
							map[dy][dx+1] = 5;
						}else{ 
							map[dy][dx+1] = 3; 
						}
					} 
					
					if(map[y][x]!=6){ 
						map[y][x] = 0;	
					}
					if(map[y][x]==6){
						map[y][x] = 4;
					}	
					if(map[dy][dx]==4||map[dy][dx]==5){
						map[dy][dx] = 6; 
					}else{
						map[dy][dx]	= 2;
					}
					x = dx;
			break;
		}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值