c++推箱子

c++推箱子

#include<iostream>
#include<conio.h>
#include<string.h>
#include<Windows.h>
using namespace std;
const int  mapsize = 20;//地图大小


int xx = 0, yy = 0;//  人物当前位置


int win = 0;//胜利条件,箱子的剩余数

int curIndex = 0;

bool isMove = false;

int backId = 0;

int backCh;

int thereBack[3] = { 0 };

char thereBackCh[3];

int Steps = 0;

enum {
	ROAD = 0,
	WALL = 1,
	HUMAN = 2,
	BOX = 3,
	TARGET = 4,
	VRI = 7
};

int map[5][mapsize][mapsize] = {
	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 1,
	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,




	0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 
	0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
	0, 0, 0, 0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 1,
	1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1,
	1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3, 0, 0, 1,
	1, 0, 0, 1, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 4, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 1, 1, 3, 1, 1, 1, 0, 3, 0, 1, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 1, 0, 4, 4, 1, 0, 3, 0, 1, 1, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 1, 1, 4, 4, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 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, 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, 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, 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, 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, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 1, 2, 3, 3, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 1, 0, 3, 0, 1, 0, 1, 4, 1, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 4, 1, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 1, 1, 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, 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, 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, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 1, 3, 0, 3, 0, 3, 1, 3, 0, 1, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 1, 3, 0, 1, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 1, 4, 4, 4, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 1, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 1, 1, 1, 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,
	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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,




};

int copyMap[mapsize][mapsize];






//打印地图
void printMap(){
	win = 0;
	for (int i = 0; i < mapsize; i++){
		for (int j = 0; j < mapsize; j++){
			switch (map[curIndex][i][j]){
			case ROAD:
				cout << "  ";//特殊符号是宽字符,一个宽字符等于2个字符,所以要两个空格
				break;
			case WALL:
				cout << "■";
				break;
			case HUMAN:
				case 6:
				cout << "♂";
				xx = i;
				yy = j;
				break;
			case BOX:
				cout << "○";
				win++;//如果还有箱子就加1
				break;
			case TARGET:
				cout << "☆";
				break;
			case VRI:
				cout << "★";
				break;
			}

		}
		cout << endl;
	}

}





//人物的移动控制
void Hmove(int x, int y){
	int nextX = xx + x;
	int nextY = yy + y;
	int nextnextX = xx + x * 2;
	int nextnextY = yy + y * 2;


	if (ROAD == map[curIndex][nextX][nextY] || TARGET == map[curIndex][nextX][nextY]){//人物可以在空地或目标点进出

		map[curIndex][xx][yy] -= HUMAN;
		map[curIndex][nextX][nextY] += HUMAN;
		backId = 1;
		

	}
	else if (BOX == map[curIndex][nextX][nextY] || VRI == map[curIndex][nextX][nextY]){//人物前方是箱子或箱子+目的地
		if (ROAD == map[curIndex][nextnextX][nextnextY] || TARGET == map[curIndex][nextnextX][nextnextY]){

			map[curIndex][xx][yy] -= HUMAN;
			map[curIndex][nextX][nextY] -= WALL;
			map[curIndex][nextnextX][nextnextY] += BOX;
			backId = 2;
			
			
		}

	}
	thereBack[Steps++ % (sizeof(thereBack) / sizeof(int))] = backId;//记录人物走动
	isMove = true;
}


void rBack(char ch,int bcak_id){

	int x = 0;
	int y = 0;

	switch (ch){
	case 'w':
		x = 1;
		

		break;
	case 'a':
		
		y = 1;

		break;
	case 's':
		x = -1;
		

		break;
	case 'd':
		
		y = -1;
		break;
	}
	int nextX = xx + x;
	int nextY = yy + y;
	int beforeX = xx - x;
	int beforeY = yy - y;
	if (1 == bcak_id){//人物没有推动过箱子
		map[curIndex][xx][yy] -= HUMAN;
		map[curIndex][nextX][nextY] += HUMAN;
	}
	else if (2 == bcak_id){//人物推动过箱子

			map[curIndex][xx][yy] += WALL;
			map[curIndex][nextX][nextY] += HUMAN;
			map[curIndex][beforeX][beforeY] -= BOX;
	

	}
}

void rBackThereSteps(int index){
	rBack(thereBackCh[index], thereBack[index]);
	system("cls");
	printMap();
}


//获取键盘信息
void keyboard(){
	char ch = getch();
	if (ch >= 'A' && ch <= 'Z'){
		ch += 32;
	}
	switch (ch){
	case 'w':
		Hmove(-1, 0);
		backCh = ch;
		break;
	case 'a':
		Hmove(0, -1);
		backCh = ch;
		break;
	case 's':
		Hmove(1, 0);
		backCh = ch;
		break;
	case 'd':
		Hmove(0, 1);
		backCh = ch;
		break;
	case 'r':
		isMove = false;
		system("cls");
		memcpy(map[curIndex],copyMap, sizeof(copyMap));
		printMap();
		break;
	case 'b':
		if (0 != memcmp(map[curIndex], copyMap, sizeof(copyMap))&&isMove){//判断是否能回退
			rBack(backCh,backId);
		}
		isMove = false;
		break;
	case'p':
		if (0 != memcmp(map[curIndex], copyMap, sizeof(copyMap)) && 0 != thereBack[2]&&isMove){//判断是否能回退
			if (0 == (Steps - 1) % (sizeof(thereBack) / sizeof(int))){

				rBackThereSteps(0);
				rBackThereSteps(2);
				rBackThereSteps(1);

			}
			else if (1 == (Steps - 1) % (sizeof(thereBack) / sizeof(int))){
				rBackThereSteps(1);
				rBackThereSteps(0);
				rBackThereSteps(2);

			}
			else if (2 == (Steps - 1) % (sizeof(thereBack) / sizeof(int))){
				rBackThereSteps(2);
				rBackThereSteps(1);
				rBackThereSteps(0);

			}
		}
		isMove = false;
		break;
	}
	
	thereBackCh[(Steps - 1) % (sizeof(thereBack) / sizeof(int))] = backCh;

}




int main(void) {





	memcpy(copyMap, map[curIndex], sizeof(map[curIndex]));
	while (true){
		system("cls");
		cout << "            按R键重置本关           "<< endl;
		printMap();


		cout << "关卡" << curIndex + 1 << "     共" << sizeof(map) / sizeof(map[0] )<<"关"<< "          剩余箱子数:" << win << endl;


		cout << "移动:         wasd键 " << endl;
		cout << "回退一步:        b键 " << endl;
		cout << "回退三步:         p键 " << endl;
		cout << "人物:             ♂" << endl;
		cout << "箱子:             ○" << endl;
		cout << "目标点:           ☆" << endl;

		if (0 == win){//胜利条件
			cout << endl;
			cout << "            victory!!!!!           \n" << endl;
			//下一关
			curIndex++;

			
			memcpy(copyMap, map[curIndex], sizeof(map[curIndex]));//复制关卡

			if (curIndex >= sizeof(map)/sizeof(map[0])){
				system("cls");
				cout << "恭喜你通过所有关卡!!" << endl;
				break;
			}

			cout << "按任意键进入下一关" <<  endl;
			getch();
			continue;
		}
		keyboard();
		
	}  




	return 0;
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值