c++推箱子(更新)

c++推箱子(更新)

本文继“c++实现推箱子”一文。

#include<bits/stdc++.h>
//#include <bios.h>
#include<conio.h>
#include<windows.h>
#include <mmsystem.h> 
#pragma comment(lib,"winmm.lib")

using namespace std;
int map1[2][10][12]={
{ //关卡1 
	{1,1,1,1,1,1,1,1,1,1,1,1}, 
	{1,0,0,0,0,0,0,1,0,0,0,1}, 
	{1,0,0,4,0,4,0,0,0,0,0,1}, 
	{1,1,1,1,1,1,1,1,1,6,1,1}, 
	{1,0,1,0,0,0,0,0,0,0,0,1}, 
	{1,0,0,0,0,0,0,0,0,0,0,1}, 
	{1,1,1,1,0,1,1,1,1,1,1,1}, 
	{1,0,0,0,0,0,0,1,0,0,0,1}, 
	{1,0,1,0,0,0,0,0,0,0,0,1}, 
	{1,1,1,1,1,1,1,1,7,3,3,1} 
},
{ //关卡2 
	{1,1,1,1,1,1,1,1,1,1,1,1}, 
	{1,0,0,0,0,0,0,1,0,0,0,1}, 
	{1,0,0,0,0,0,0,0,0,0,0,1}, 
	{1,1,1,1,1,1,1,1,1,0,1,1}, 
	{1,0,1,0,0,0,0,0,0,0,0,1}, 
	{1,0,0,0,0,0,0,0,0,0,0,1}, 
	{1,1,1,1,0,1,1,1,1,1,1,1}, 
	{1,0,0,0,0,0,0,1,0,0,6,1}, 
	{1,0,1,0,0,0,0,0,0,4,4,1}, 
	{1,1,1,1,1,1,1,1,7,3,3,1} 
}
}; 

int map2[2][10][12]={  //备份 
{ //关卡1 
	{1,1,1,1,1,1,1,1,1,1,1,1}, 
	{1,0,0,0,0,0,0,1,0,0,0,1}, 
	{1,0,0,4,0,4,0,0,0,0,0,1}, 
	{1,1,1,1,1,1,1,1,1,6,1,1}, 
	{1,0,1,0,0,0,0,0,0,0,0,1}, 
	{1,0,0,0,0,0,0,0,0,0,0,1}, 
	{1,1,1,1,0,1,1,1,1,1,1,1}, 
	{1,0,0,0,0,0,0,1,0,0,0,1}, 
	{1,0,1,0,0,0,0,0,0,0,0,1}, 
	{1,1,1,1,1,1,1,1,7,3,3,1} 
},
{ //关卡2 
	{1,1,1,1,1,1,1,1,1,1,1,1}, 
	{1,0,0,0,0,0,0,1,0,0,0,1}, 
	{1,0,0,0,0,0,0,0,0,0,0,1}, 
	{1,1,1,1,1,1,1,1,1,0,1,1}, 
	{1,0,1,0,0,0,0,0,0,0,0,1}, 
	{1,0,0,0,0,0,0,0,0,0,0,1}, 
	{1,1,1,1,0,1,1,1,1,1,1,1}, 
	{1,0,0,0,0,0,0,1,0,0,6,1}, 
	{1,0,1,0,0,0,0,0,0,4,4,1}, 
	{1,1,1,1,1,1,1,1,7,3,3,1} 
}
}; 

int tmp[1][10][12];

int level=0; 

//人坐标结构体 
struct Pos{
	int x; 
	int y; 
}; 

//获取玩家坐标
Pos GetGamerPosition(){
	Pos gamer={-1,-1}; 
	for(int i=0;i<10;i++)  //从50开始 
	{
		for(int j=0;j<12;j++){
			if( map1[level][i][j]==6||map1[level][i][j]==9 ){
				gamer.x=i;
				gamer.y=j; 
				return gamer;
			} 
		} 
    }
    return gamer;
    
    
	
}

void Up() 
{ 
	Pos gamer=GetGamerPosition();
//1 人的前面是空地
	if(map1[level][gamer.x-1][gamer.y]==0){
		//空地改成人 
		map1[level][gamer.x-1][gamer.y]=6;
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
	} 
	
	 //2 人的前面是目的地
	if(map1[level][gamer.x-1][gamer.y]==3){
		//目的地改成人站在上面 
		map1[level][gamer.x-1][gamer.y]=9;
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
	} 
	
	 //3 人的前面是箱子
	if(map1[level][gamer.x-1][gamer.y]==4){
		//3.1箱子的前面是空地
		if(map1[level][gamer.x-2][gamer.y]==0){
			//空地改成箱子 
			map1[level][gamer.x-2][gamer.y]=4;
			//箱子改成人 
			map1[level][gamer.x-1][gamer.y]=6;
		} 
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
		
		//3.2箱子的前面是目的地
		if(map1[level][gamer.x-2][gamer.y]==3){
		//目的地改成箱子与目的地重合
			map1[level][gamer.x-2][gamer.y]=7;
			//箱子改成人 
			map1[level][gamer.x-1][gamer.y]=6;
		} 
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
	} 
	
	 //4 人的前面是箱子和目的地重合
	if(map1[level][gamer.x-1][gamer.y]==7){
	
		//4.1箱子的前面是空地
		if(map1[level][gamer.x-2][gamer.y]==0){
			//空地改成箱子 
			map1[level][gamer.x-2][gamer.y]=4;
			//箱子改成人 
			map1[level][gamer.x-1][gamer.y]=9;
		} 
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
		
		//4.2箱子的前面是目的地
		if(map1[level][gamer.x-2][gamer.y]==3){
		//目的地改成箱子与目的地的重合
			map1[level][gamer.x-2][gamer.y]=7;
			//箱子和目的地的重合改成人与目的地的重合
			map1[level][gamer.x-1][gamer.y]=9;
		} 
		
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
			
	} 
} 



void Down()
{ 
	Pos gamer=GetGamerPosition();
//1 人的前面是空地
	if(map1[level][gamer.x+1][gamer.y]==0){
		//空地改成人 
		map1[level][gamer.x+1][gamer.y]=6;
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
	} 
	
	 //2 人的前面是目的地
	if(map1[level][gamer.x+1][gamer.y]==3){
		//目的地改成人站在上面 
		map1[level][gamer.x+1][gamer.y]=9;
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
	} 
	
	 //3 人的前面是箱子
	if(map1[level][gamer.x+1][gamer.y]==4){
		//3.1箱子的前面是空地
		if(map1[level][gamer.x+2][gamer.y]==0){
			//空地改成箱子 
			map1[level][gamer.x+2][gamer.y]=4;
			//箱子改成人 
			map1[level][gamer.x+1][gamer.y]=6;
		} 
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
		
		//3.2箱子的前面是目的地
		if(map1[level][gamer.x+2][gamer.y]==3){
		//目的地改成箱子与目的地重合
			map1[level][gamer.x+2][gamer.y]=7;
			//箱子改成人 
			map1[level][gamer.x+1][gamer.y]=6;
		} 
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
	} 
	
	 //4 人的前面是箱子和目的地重合
	if(map1[level][gamer.x+1][gamer.y]==7){
	
		//4.1箱子的前面是空地
		if(map1[level][gamer.x+2][gamer.y]==0){
			//空地改成箱子 
			map1[level][gamer.x+2][gamer.y]=4;
			//箱子改成人 
			map1[level][gamer.x+1][gamer.y]=9;
		} 
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
		
		//4.2箱子的前面是目的地
		if(map1[level][gamer.x+2][gamer.y]==3){
		//目的地改成箱子与目的地的重合
			map1[level][gamer.x+2][gamer.y]=7;
			//箱子和目的地的重合改成人与目的地的重合
			map1[level][gamer.x+1][gamer.y]=9;
		} 
		
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
			
	} 
} 

void Right()//Left()
{ 
	Pos gamer=GetGamerPosition();
//1 人的前面是空地
	if(map1[level][gamer.x][gamer.y+1]==0){
		//空地改成人 
		map1[level][gamer.x][gamer.y+1]=6;
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
	} 
	
	 //2 人的前面是目的地
	if(map1[level][gamer.x][gamer.y+1]==3){
		//目的地改成人站在上面 
		map1[level][gamer.x][gamer.y+1]=9;
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
	} 
	
	 //3 人的前面是箱子
	if(map1[level][gamer.x][gamer.y+1]==4){
		//3.1箱子的前面是空地
		if(map1[level][gamer.x][gamer.y+2]==0){
			//空地改成箱子 
			map1[level][gamer.x][gamer.y+2]=4;
			//箱子改成人 
			map1[level][gamer.x][gamer.y+1]=6;
		} 
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
		
		//3.2箱子的前面是目的地
		if(map1[level][gamer.x][gamer.y+2]==3){
		//目的地改成箱子与目的地重合
			map1[level][gamer.x][gamer.y+2]=7;
			//箱子改成人 
			map1[level][gamer.x][gamer.y+1]=6;
		} 
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
	} 
	
	 //4 人的前面是箱子和目的地重合
	if(map1[level][gamer.x][gamer.y+1]==7){
	
		//4.1箱子的前面是空地
		if(map1[level][gamer.x][gamer.y+2]==0){
			//空地改成箱子 
			map1[level][gamer.x][gamer.y+2]=4;
			//箱子改成人 
			map1[level][gamer.x][gamer.y+1]=9;
		} 
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
		
		//4.2箱子的前面是目的地
		if(map1[level][gamer.x][gamer.y+2]==3){
		//目的地改成箱子与目的地的重合
			map1[level][gamer.x][gamer.y+2]=7;
			//箱子和目的地的重合改成人与目的地的重合
			map1[level][gamer.x][gamer.y+1]=9;
		} 
		
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
			
	} 
} 

void Left()
{ 
	Pos gamer=GetGamerPosition();
//1 人的前面是空地
	if(map1[level][gamer.x][gamer.y-1]==0){
		//空地改成人 
		map1[level][gamer.x][gamer.y-1]=6;
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
	} 
	
	 //2 人的前面是目的地
	if(map1[level][gamer.x][gamer.y-1]==3){
		//目的地改成人站在上面 
		map1[level][gamer.x][gamer.y-1]=9;
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
	} 
	
	 //3 人的前面是箱子
	if(map1[level][gamer.x][gamer.y-1]==4){
		//3.1箱子的前面是空地
		if(map1[level][gamer.x][gamer.y-2]==0){
			//空地改成箱子 
			map1[level][gamer.x][gamer.y-2]=4;
			//箱子改成人 
			map1[level][gamer.x][gamer.y-1]=6;
		} 
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
		
		//3.2箱子的前面是目的地
		if(map1[level][gamer.x][gamer.y-2]==3){
		//目的地改成箱子与目的地重合
			map1[level][gamer.x][gamer.y-2]=7;
			//箱子改成人 
			map1[level][gamer.x][gamer.y-1]=6;
		} 
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
	} 
	
	 //4 人的前面是箱子和目的地重合
	if(map1[level][gamer.x][gamer.y-1]==7){
	
		//4.1箱子的前面是空地
		if(map1[level][gamer.x][gamer.y-2]==0){
			//空地改成箱子 
			map1[level][gamer.x][gamer.y-2]=4;
			//箱子改成人 
			map1[level][gamer.x][gamer.y-1]=9;
		} 
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
		
		//4.2箱子的前面是目的地
		if(map1[level][gamer.x][gamer.y-2]==3){
		//目的地改成箱子与目的地的重合
			map1[level][gamer.x][gamer.y-2]=7;
			//箱子和目的地的重合改成人与目的地的重合
			map1[level][gamer.x][gamer.y-1]=9;
		} 
		
		//原来的位置还原 
		if(map1[level][gamer.x][gamer.y]==9) map1[level][gamer.x][gamer.y]=3;
		else map1[level][gamer.x][gamer.y]=0; 
			
	} 
} 

void Recovery(){
	for(int i=0;i<10;i++){
		for(int j=0;j<12;j++){
			
			map1[level][i][j]=map2[level][i][j]; 
			
		}
	} 
} 

void WriteTemp(){
	for(int i=0;i<10;i++){
		for(int j=0;j<12;j++){
			tmp[0][i][j]=map1[level][i][j]; 
		} 
	} 
}

void BakeOneStep() {
	for(int i=0;i<10;i++){
		for(int j=0;j<12;j++){
			map1[level][i][j]=tmp[0][i][j]; 
		} 
	} 
}


int GetSpaceBox( ){
	int count=0; 
	for(int i=0;i<10;i++){
		for(int j=0;j<12;j++){
			if( map1[level][i][j]==4 ){
				count++; 
			} 
		} 
    }
    return count; 
} 

void Menu(){
	

	system("mode con cols=19 lines=20") ;
	cout<<"┏               ┓\n";
	cout<<"      推箱子     \n";
	cout<<"    先按shift    \n";
	cout<<"     按下空格    \n";
	cout<<"     即将开始    \n";
	cout<<"┗               ┛\n";
 	while(true){
 		//getch()可以检测按键 
		if(getch()==' '){
			for(int i=3;i>=1;i--){ 
	 			cout<<"   "<<i<<"S "<<i<<"S "<<i<<"S "<<i<<"S \n"; 
				Sleep(1000);//暂停1000毫秒 
 			} 
 			cout<<"      Go it! \n";
			break; 
		} 
	}
} 

void Write_map(){

	cout<<"  ********第"<< level+1 <<"关********\n"; 

	for(int a=0;a<10;a++)  //从50开始 
	{
		for(int b=0;b<12;b++)
        {
        	switch(map1[level][a][b]){
        		case 0:cout<<"  "; break; 
				case 1:cout<<"■"; break;//墙 
				case 3:cout<<"☆"; break;//目的地 
				case 4:cout<<"◎"; break;//箱子 
				case 6:cout<<"♂"; break;//人 
				case 7:cout<<"★"; break;//箱子与目的地重合
				case 9:cout<<"♂"; break;//人与目的地重合 
			} 
        }
		cout<<endl; 
    }
} 
int main() {
    //map 
	system("color 74"); 
	Menu();
	system("mode con cols=25 lines=20") ;
	while(1){ 
		if(GetSpaceBox()==0) { 
			system("cls"); 
			system("mode con cols=24 lines=22") ;
			cout<<"┏                    ┓\n";
			cout<<"    !!!成功过关!!!\n";
			cout<<"┗                    ┛\n\n";
			cout<<"┏                    ┓\n";
			cout<<"    !!!成功过关!!!\n";
			cout<<"┗                    ┛\n\n";
			cout<<"┏                    ┓\n";
			cout<<"    !!!成功过关!!!\n";
			cout<<"┗                    ┛\n\n";
			cout<<"┏                     ┓\n";
			cout<<"  祝你有一个开挂的人生 \n";
			cout<<"┗                     ┛\n";
			Sleep(11000);
			if(level+1==2){ 
				cout<<"通关!!!" ; 
				return 0;
				} 
			else { 
				cout<<"即将进入第二关!"; 
				Sleep(1500);	
				level++;//进入下一关 
			} 
		} 
		system("cls"); 
		Write_map();
		cout<<"\n w:↑s:↓a:←d:→ r:重来  b:撤回"; 
		char ch=getch();
		switch(ch){
        	case 'w':WriteTemp(); Up(); break;     //往上 
			case 's':WriteTemp(); Down(); break;   //往下 
			case 'a':WriteTemp(); Left(); break;   //往左 
			case 'd':Right(); break;               //往右 
			case 'r':Recovery(); break;            //恢复
			case 'b':BakeOneStep(); break;         //撤回 
			
		} 
	} 
	return 0;
}


更新日志:

  1. 添加恢复功能
  2. 添加了2个地图
  3. 添加撤回功能

猜你喜欢

转载自blog.csdn.net/taiji_ijiat/article/details/107008888
今日推荐