C语言_推箱子小游戏

用C语言写了个简单的推箱子小游戏,用了三维数组,主要是为了有连续的关卡,如果只有一关的话,用二维数组就好。
现在只有两关,之后还可能会继续更新,增加更多的关卡,更多的功能,诸如选关,还有界面的美化等。
这个程序在我的电脑上跑的时候,每次清空屏幕时很慢,导致移动时看起来不连贯,不知道有没有什么解决办法。
其他的经典小游戏也会尝试一下。

//推箱子
//2019.9.30

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

#define LEVEL 2
#define WIDTH 9
#define HEIGHT 9

//记录关卡数目
int game_case;
 
//记录人的位置
int x,y;   

//记录未推入的箱子的个数
int boxes = 0;   

//初始地图,0为空,1为墙,2为人,3为箱子,4为目标,5为箱子已推入,6为人在目标上 
int map[LEVEL][WIDTH][HEIGHT] = {
              {
                  {0,0,1,1,1,0,0,0,0},
				  {0,0,1,4,1,0,0,0,0},
				  {0,0,1,0,1,1,1,1,0},
				  {1,1,1,3,0,3,4,1,0},
				  {1,4,0,3,2,1,1,1,0},
				  {1,1,1,1,3,1,0,0,0},
				  {0,0,0,1,4,1,0,0,0},
				  {0,0,0,1,1,1,0,0,0},
				  {0,0,0,0,0,0,0,0,0},
			  },
			  {
			  	  {1,1,1,1,1,0,0,0,0},
				  {1,0,0,0,1,0,0,0,0},
				  {1,0,3,3,1,0,1,1,1},
				  {1,2,3,0,1,0,1,4,1},
				  {1,1,1,0,1,1,1,4,1},
				  {0,1,1,0,0,0,0,4,1},
				  {0,1,0,0,0,1,0,0,1},
				  {0,1,0,0,0,1,1,1,1},
				  {0,1,1,1,1,1,0,0,0},
			  }
		};

void draw_map(){
	//绘制地图,同时更新人的坐标和未推入的箱子的数目 
	int i,j;
	
	boxes = 0;
	
	for(i = 0 ; i < WIDTH ; i++){
		printf("\t\t\t\t\t\t");
		for(j = 0 ; j < HEIGHT ; j++){
			//map上不可能同时存在2和6 
			if(map[game_case][i][j] == 0)
			    printf("  ");
			if(map[game_case][i][j] == 1)
			    printf("■");
			if(map[game_case][i][j] == 2){
			    x = i;
				y = j; 
			    printf("♀");
			}
			if(map[game_case][i][j] == 3){
			    printf("□");
			    boxes++;
			}
			if(map[game_case][i][j] == 4)
			    printf("○"); 
			if(map[game_case][i][j] == 5)
			    printf("▲");
			if(map[game_case][i][j] == 6){
				x = i;
				y = j;
			    printf("◆");
			}
			if(j == HEIGHT - 1)
			    printf("\n");
		}
	} 
	
	return ;
}

void move_to_up(){
	//人可以向上移动的条件
	//若人移动前位置为空
	if(map[game_case][x][y] == 2){
	    //如果人上为空
	    if(map[game_case][x-1][y] == 0){
		    map[game_case][x-1][y] = 2;
	    	map[game_case][x][y] = 0;
    	} 
	    //如果人上为目标
	    if(map[game_case][x-1][y] == 4){
	    	map[game_case][x-1][y] = 6;
	    	map[game_case][x][y] = 0;
	    } 
	    //如果人上为箱子(所在地为空),且箱子上为空
	    else if(map[game_case][x-1][y] == 3 && map[game_case][x-2][y] == 0){
	    	map[game_case][x-2][y] = 3;
	    	map[game_case][x-1][y] = 2;
	    	map[game_case][x][y] = 0; 
	    } 
    	//如果人上为箱子(所在地为空), 且箱子上为目标
	    else if(map[game_case][x-1][y] == 3 && map[game_case][x-2][y] == 4){
	    	map[game_case][x-2][y] = 5;
    		map[game_case][x-1][y] = 2;
	    	map[game_case][x][y] = 0;
	    } 
	    //如果人上为箱子(所在地为目标),且箱子上为空
	    else if(map[game_case][x-1][y] == 5 && map[game_case][x-2][y] == 0){
	    	map[game_case][x-2][y] = 3;
	    	map[game_case][x-1][y] = 6;
	    	map[game_case][x][y] = 0;
		}
		//如果人上为箱子(所在地为目标),且箱子上为目标 
		else if(map[game_case][x-1][y] == 5 && map[game_case][x-2][y] == 4){
	    	map[game_case][x-2][y] = 5;
	    	map[game_case][x-1][y] = 6;
	    	map[game_case][x][y] = 0;
		}
	}
	//若人移动前位置为目标 
	else if(map[game_case][x][y] == 6){
	    //如果人上为空
	    if(map[game_case][x-1][y] == 0){
		    map[game_case][x-1][y] = 2;
	    	map[game_case][x][y] = 4;
    	} 
	    //如果人上为目标
	    if(map[game_case][x-1][y] == 4){
	    	map[game_case][x-1][y] = 6;
	    	map[game_case][x][y] = 4;
	    } 
	    //如果人上为箱子(所在地为空),且箱子上为空
	    else if(map[game_case][x-1][y] == 3 && map[game_case][x-2][y] == 0){
	    	map[game_case][x-2][y] = 3;
	    	map[game_case][x-1][y] = 2;
	    	map[game_case][x][y] = 4; 
	    } 
    	//如果人上为箱子(所在地为空), 且箱子上为目标
	    else if(map[game_case][x-1][y] == 3 && map[game_case][x-2][y] == 4){
	    	map[game_case][x-2][y] = 5;
    		map[game_case][x-1][y] = 2;
	    	map[game_case][x][y] = 4;
	    } 
	    //如果人上为箱子(所在地为目标),且箱子上为空
	    else if(map[game_case][x-1][y] == 5 && map[game_case][x-2][y] == 0){
	    	map[game_case][x-2][y] = 3;
	    	map[game_case][x-1][y] = 6;
	    	map[game_case][x][y] = 4;
		}
		//如果人上为箱子(所在地为目标),且箱子上为目标 
		else if(map[game_case][x-1][y] == 5 && map[game_case][x-2][y] == 4){
	    	map[game_case][x-2][y] = 5;
	    	map[game_case][x-1][y] = 6;
	    	map[game_case][x][y] = 4;
		}
	}
	//人不可以移动的条件
	//人上为墙;
	//人上为箱子,箱子上为箱子;
	//人上为箱子,箱子上为放好的箱子;
	//人上为箱子,箱子上为墙  
	//这些情况无需进行任何操作
	 
	return ;
}

void move_to_down(){
	//人可以向下移动的条件
	//如果人移动前位置为空
	if(map[game_case][x][y] == 2){
	    //如果人下为空
	    if(map[game_case][x+1][y] == 0){
			map[game_case][x+1][y] = 2;
			map[game_case][x][y] = 0;
		} 
		//如果人下为目标
		 if(map[game_case][x+1][y] == 4){
			map[game_case][x+1][y] = 6;
			map[game_case][x][y] = 0;
		} 
		//如果人下为箱子(所在地为空),且箱子下为空 
		else if(map[game_case][x+1][y] == 3 && map[game_case][x+2][y] == 0){
			map[game_case][x+2][y] = 3;
			map[game_case][x+1][y] = 2;
			map[game_case][x][y] = 0;
		}
		//如果人下为箱子(所在地为空),且箱子下为目标 
		else if(map[game_case][x+1][y] == 3 && map[game_case][x+2][y] == 4){
			map[game_case][x+2][y] = 5;
			map[game_case][x+1][y] = 2;
			map[game_case][x][y] = 0;
		}
		//如果人下为箱子(所在地为目标),且箱子下为空
	    else if(map[game_case][x+1][y] == 5 && map[game_case][x+2][y] == 0){
	    	map[game_case][x+2][y] = 3;
	    	map[game_case][x+1][y] = 6;
	    	map[game_case][x][y] = 0;
		}
		//如果人下为箱子(所在地为目标),且箱子下为目标 
		else if(map[game_case][x+1][y] == 5 && map[game_case][x+2][y] == 4){
	    	map[game_case][x+2][y] = 5;
	    	map[game_case][x+1][y] = 6;
	    	map[game_case][x][y] = 0;
		}
	}
	//如果人移动前位置为目标 
	else if(map[game_case][x][y] == 6){
	    //如果人下为空
	    if(map[game_case][x+1][y] == 0){
			map[game_case][x+1][y] = 2;
			map[game_case][x][y] = 4;
		} 
		//如果人下为目标
		 if(map[game_case][x+1][y] == 4){
			map[game_case][x+1][y] = 6;
			map[game_case][x][y] = 4;
		} 
		//如果人下为箱子(所在地为空),且箱子下为空 
		else if(map[game_case][x+1][y] == 3 && map[game_case][x+2][y] == 0){
			map[game_case][x+2][y] = 3;
			map[game_case][x+1][y] = 2;
			map[game_case][x][y] = 4;
		}
		//如果人下为箱子(所在地为空),且箱子下为目标 
		else if(map[game_case][x+1][y] == 3 && map[game_case][x+2][y] == 4){
			map[game_case][x+2][y] = 5;
			map[game_case][x+1][y] = 2;
			map[game_case][x][y] = 4;
		}
		//如果人下为箱子(所在地为目标),且箱子下为空
	    else if(map[game_case][x+1][y] == 5 && map[game_case][x+2][y] == 0){
	    	map[game_case][x+2][y] = 3;
	    	map[game_case][x+1][y] = 6;
	    	map[game_case][x][y] = 4;
		}
		//如果人下为箱子(所在地为目标),且箱子下为目标 
		else if(map[game_case][x+1][y] == 5 && map[game_case][x+2][y] == 4){
	    	map[game_case][x+2][y] = 5;
	    	map[game_case][x+1][y] = 6;
	    	map[game_case][x][y] = 4;
		}
	}
	//人不可移动的条件
	//人下为墙;
	//人下为箱子,箱子下为箱子;
	//人下为箱子,箱子下为放好的箱子; 
	//人下为箱子,箱子下为墙 
	//这些情况无需进行任何操作
	
	return ; 
} 

void move_to_left(){
	//人可以向左移动的条件
	//如果人移动前位置为空
	if(map[game_case][x][y] == 2){
		//如果人左为空
		if(map[game_case][x][y-1] == 0){
			map[game_case][x][y-1] = 2;
			map[game_case][x][y] = 0;
		}
		//如果人左为目标 
		if(map[game_case][x][y-1] == 4){
			map[game_case][x][y-1] = 6;
			map[game_case][x][y] = 0;
		}
		//如果人左为箱子(所在地为空),箱子左为空 
		else if(map[game_case][x][y-1] == 3 && map[game_case][x][y-2] == 0){
			map[game_case][x][y-2] = 3;
			map[game_case][x][y-1] = 2;
			map[game_case][x][y] = 0;
		}
		//如果人左为箱子(所在地为空),箱子左为目标
		else if(map[game_case][x-1][y] == 3 && map[game_case][x][y-2] == 4){
			map[game_case][x][y-2] = 5;
			map[game_case][x][y-1] = 2;
			map[game_case][x][y] = 0;
		} 
		//如果人左为箱子(所在地为目标),且箱子左为空
	    else if(map[game_case][x][y-1] == 5 && map[game_case][x][y-2] == 0){
	    	map[game_case][x][y-2] = 3;
	    	map[game_case][x][y-1] = 6;
	    	map[game_case][x][y] = 0;
		}
		//如果人左为箱子(所在地为目标),且箱子左为目标 
	    else if(map[game_case][x][y-1] == 5 && map[game_case][x][y-2] == 4){
	    	map[game_case][x][y-2] = 5;
	    	map[game_case][x][y-1] = 6;
	    	map[game_case][x][y] = 0;
		}
    }
    //如果人移动前位置为目标 
	else if(map[game_case][x][y] == 6){
		//如果人左为空
		if(map[game_case][x][y-1] == 0){
			map[game_case][x][y-1] = 2;
			map[game_case][x][y] = 4;
		}
		//如果人左为目标 
		if(map[game_case][x][y-1] == 4){
			map[game_case][x][y-1] = 6;
			map[game_case][x][y] = 4;
		}
		//如果人左为箱子(所在地为空),箱子左为空 
		else if(map[game_case][x][y-1] == 3 && map[game_case][x][y-2] == 0){
			map[game_case][x][y-2] = 3;
			map[game_case][x][y-1] = 2;
			map[game_case][x][y] = 4;
		}
		//如果人左为箱子(所在地为空),箱子左为目标
		else if(map[game_case][x-1][y] == 3 && map[game_case][x][y-2] == 4){
			map[game_case][x][y-2] = 5;
			map[game_case][x][y-1] = 2;
			map[game_case][x][y] = 4;
		} 
		//如果人左为箱子(所在地为目标),且箱子左为空
	    else if(map[game_case][x][y-1] == 5 && map[game_case][x][y-2] == 0){
	    	map[game_case][x][y-2] = 3;
	    	map[game_case][x][y-1] = 6;
	    	map[game_case][x][y] = 4;
		}
		//如果人左为箱子(所在地为目标),且箱子左为目标 
	    else if(map[game_case][x][y-1] == 5 && map[game_case][x][y-2] == 4){
	    	map[game_case][x][y-2] = 5;
	    	map[game_case][x][y-1] = 6;
	    	map[game_case][x][y] = 4;
		}
    }
	//人不可移动的条件
	//人左为墙;
	//人左为箱子,箱子左为箱子;
	//人左为箱子,箱子左为墙;
	//人左为箱子,箱子左为放好的箱子
	//这些情况无需任何操作
	
	return ; 
}

void move_to_right(){
	//人可以向右移动的条件
	//如果人移动前位置为空
	if(map[game_case][x][y] == 2){
		//如果人右为空
		if(map[game_case][x][y+1] == 0){
			map[game_case][x][y+1] = 2;
			map[game_case][x][y] = 0;
		}
		//如果人右为目标 
		if(map[game_case][x][y+1] == 4){
			map[game_case][x][y+1] = 6;
			map[game_case][x][y] = 0;
		}
		//如果人右为箱子(所在地为空),箱子右为空 
		else if(map[game_case][x][y+1] == 3 && map[game_case][x][y+2] == 0){
			map[game_case][x][y+2] = 3;
			map[game_case][x][y+1] = 2;
			map[game_case][x][y] = 0;
		}
		//如果人右为箱子(所在地为空),箱子右为目标
		else if(map[game_case][x][y+1] == 3 && map[game_case][x][y+2] == 4){
			map[game_case][x][y+2] = 5;
			map[game_case][x][y+1] = 2;
			map[game_case][x][y] = 0;
		}
		 //如果人右为箱子(所在地为目标),且箱子右为空
	    else if(map[game_case][x][y+1] == 5 && map[game_case][x][y+2] == 0){
	    	map[game_case][x][y+2] = 3;
	    	map[game_case][x][y+1] = 6;
	    	map[game_case][x][y] = 0;
		}
		//如果人右为箱子(所在地为目标),且箱子右为目标 
	    else if(map[game_case][x][y+1] == 5 && map[game_case][x][y+2] == 4){
	    	map[game_case][x][y+2] = 5;
	    	map[game_case][x][y+1] = 6;
	    	map[game_case][x][y] = 0;
		}
	}
	//如果人移动前位置为目标 
	else if(map[game_case][x][y] == 6){
		//如果人右为空
		if(map[game_case][x][y+1] == 0){
			map[game_case][x][y+1] = 2;
			map[game_case][x][y] = 4;
		}
		//如果人右为目标 
		if(map[game_case][x][y+1] == 4){
			map[game_case][x][y+1] = 6;
			map[game_case][x][y] = 4;
		}
		//如果人右为箱子(所在地为空),箱子右为空 
		else if(map[game_case][x][y+1] == 3 && map[game_case][x][y+2] == 0){
			map[game_case][x][y+2] = 3;
			map[game_case][x][y+1] = 2;
			map[game_case][x][y] = 4;
		}
		//如果人右为箱子(所在地为空),箱子右为目标
		else if(map[game_case][x][y+1] == 3 && map[game_case][x][y+2] == 4){
			map[game_case][x][y+2] = 5;
			map[game_case][x][y+1] = 2;
			map[game_case][x][y] = 4;
		} 
		//如果人左为箱子(所在地为目标),且箱子左为空
	    else if(map[game_case][x][y+1] == 5 && map[game_case][x][y+2] == 0){
	    	map[game_case][x][y+2] = 3;
	    	map[game_case][x][y+1] = 6;
	    	map[game_case][x][y] = 4;
		}
		//如果人左为箱子(所在地为目标),且箱子左为目标 
	    else if(map[game_case][x][y+1] == 5 && map[game_case][x][y+2] == 4){
	    	map[game_case][x][y+2] = 5;
	    	map[game_case][x][y+1] = 6;
	    	map[game_case][x][y] = 4;
		}
	}
	//人不可移动的条件
	//人右为墙;
	//人右为箱子,箱子右为箱子;
	//人右为箱子,箱子右为墙;
	//人右为箱子,箱子右为放好的箱子
	//这些情况无需任何操作
	
	return ; 	
}

int main(){
	
	char direction;
	
	game_case = 0;
	
	while(1){
		//每次循环开始时,清空屏幕 
		system("cls");
		
		printf("\n\n\n\n\n");
		printf("\t\t\t\t\t---------这是第 %d 关---------\n",game_case+1);
		//重新绘制地图
		draw_map();
		
		//判断是否通关 
		if(boxes == 0){
			game_case++;
			//判断游戏是否结束
			if(game_case >= LEVEL){
				system("cls");
				printf("\n\n\n\n\n\n\n\n\n");
				printf("\t\t\t\t\t\tYou Are Winner!\n");
				printf("\n\n\n\n\n\n\n\n\n");
				getch();
				break;
			} 
		    else{
				printf("\t\t\t\t-----------请按任意键继续下一关-----------\n");
				getch();
				continue;
			}
			
		} 
		
		//用switch判断人的移动
		direction = getch();
		switch(direction){
			case 72:
			case 'w':
			case 'W':
			    move_to_up();
			    break;
			    
			case 80:
			case 's':
			case 'S':
				move_to_down();
				break;
			
			case 75:	
			case 'a':
			case 'A':
				move_to_left();
				break;
			
			case 77:	
			case 'd':
			case 'D':
			    move_to_right();
				break;

		} 
		
	}
}   

版权声明:本文为qq_43610272原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。