C++ 推箱子小游戏(VS2017)

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<Windows.h>
#include<amp_graphics.h>
int row, col;
int k = 0;
int dest[8][9] = { 0 };
int map[2][8][9] = { {
	{ 0, 0, 0, 1, 1, 1, 0, 0, 0 },
{ 0, 0, 0, 1, 4, 1, 0, 0, 0 },
{ 1, 1, 1, 1, 2, 1, 0, 0, 0 },
{ 1, 4, 0, 2, 3, 1, 1, 1, 0 },
{ 1, 1, 1, 2, 0, 2, 4, 1, 0 },
{ 0, 0, 1, 0, 1, 1, 1, 1, 0 },
{ 0, 0, 1, 4, 1, 1, 1, 1, 0 },
{ 0, 0, 1, 1, 1, 0, 0, 0, 0 }
	},
{
	{ 0, 1, 1, 1, 1, 1, 1, 1, 0 },
{ 0, 1, 0, 0, 4, 4, 4, 1, 0 },
{ 0, 1, 0, 3, 0, 1, 1, 1, 1 },
{ 1, 1, 1, 2, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 1, 2, 1, 0, 1 },
{ 1, 0, 2, 0, 1, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 0, 0, 0, 0 }
} };

void init()
{
	printf("*************************\n");
	printf("推箱子小游戏\n");
	printf("基础操作wsad\n");
	printf("*************************\n");
}
void showMap()
{
	init();//操作介绍
		   //遍历数组,打印形状
	for (int i = 0; i < 8; ++i)
	{
		for (int j = 0; j < 9; ++j)
			switch (map[k][i][j])
			{
			case 0:
				printf("  ");//空地0
				break;
			case 1:
				printf("■");//墙1
				break;
			case 2:
				printf("○");//箱子2
				break;
			case 3:
				printf("♀");//人3
				break;
			case 4:
				printf("□");//目的地4
				break;
				//case 5:
				//	printf("●");//
				//	break;
			case 6:
				printf("●");//箱子+目的地 2+4=6
				break;
			case 7:
				printf("♀"); //人+目的地7 3+4=7
				break;
			default:
				break;
			}
		printf("\n");
	}
}
//游戏规则
//向上
void playGameUp()
{
	//如果向上是墙1,不可以走
	if (map[k][row - 1][col] == 1)
		return;
	//如果向上是箱子,并且箱子上面是墙或者是箱子,不可以走
	if (map[k][row - 1][col] == 2 && (map[k][row - 2][col] == 1 || map[k][row - 2][col] == 2))
		return;
	//下面是可以走的情形
	//(1)如果向上走是空地0,可以走
	if (map[k][row - 1][col] == 0 || map[k][row - 1][col] == 4)
	{
		map[k][row][col] -= 3;
		map[k][row - 1][col] += 3;
	}
	//(2)如果上走是目的地
	/*if (map[row - 1][col] == 4)
	{
	map[row][col] -= 3;
	map[row - 1][col] = 7;
	}*/
	//发现上面俩段代码可以合到一起
	//下面俩段代码也可以合到一起
	//(3)如果向上是箱子(箱子包含(空地+箱子)或者(目的地+箱子)),并且箱子上面是(3)空地或者(4)目的地,人和箱子同时走
	if ((map[k][row - 1][col] == 2 || map[k][row - 1][col] == 6) && (map[k][row - 2][col] == 0 || map[k][row - 2][col] == 4))
	{
		map[k][row][col] -= 3;
		map[k][row - 1][col] += 1;
		map[k][row - 2][col] += 2;
	}
	row--;

}
//接下来,向下走,左走,右走,代码基本差不多
//向下走
void playGameDown()
{
	//如果向下是墙,不可以走
	if (map[k][row + 1][col] == 1)
		return;
	//如果向下是箱子,并且箱子下面是墙或者是箱子,不可以走
	if (map[k][row + 1][col] == 2 && (map[k][row + 2][col] == 1 || map[k][row + 2][col] == 2))
		return;
	//(1)如果向下走是空地0,可以走 (2)如果向下走是目的地
	if (map[k][row + 1][col] == 0 || map[k][row + 1][col] == 4)
	{
		map[k][row][col] -= 3;
		map[k][row + 1][col] += 3;
	}

	//(3)如果向下是箱子(箱子包含(空地+箱子)或者(目的地+箱子)),并且箱子下面是(3)空地或者(4)目的地,人和箱子同时走
	if ((map[k][row + 1][col] == 2 || map[k][row + 1][col] == 6) && (map[k][row + 2][col] == 0 || map[k][row + 2][col] == 4))
	{
		map[k][row][col] -= 3;
		map[k][row + 1][col] += 1;
		map[k][row + 2][col] += 2;
	}
	row++;
}
//向左走
void playGameLeft()
{
	//如果向左是墙,不可以走
	if (map[k][row][col - 1] == 1)
		return;
	//如果向左是箱子,并且箱子左面是墙或者是箱子,不可以走
	if (map[k][row][col - 1] == 2 && (map[k][row][col - 2] == 1 || map[k][row][col - 2] == 2))
		return;
	//(1)如果向左走是空地0,可以走(2)如果向左走是目的地
	if (map[k][row][col - 1] == 0 || map[k][row][col - 1] == 4)
	{
		map[k][row][col] -= 3;
		map[k][row][col - 1] += 3;
	}

	//(3)如果向左是箱子(箱子包含(空地+箱子)或者(目的地+箱子)),并且箱子左面是(3)空地或者(4)目的地,人和箱子同时走
	if ((map[k][row][col - 1] == 2 || map[k][row][col - 1] == 6) && (map[k][row][col - 2] == 0 || map[k][row][col - 2] == 4))
	{
		map[k][row][col] -= 3;
		map[k][row][col - 1] += 1;
		map[k][row][col - 2] += 2;
	}
	col--;
}
void playGameRight()
{
	//如果向右是墙1,不可以走
	if (map[k][row][col + 1] == 1)
		return;
	//如果向右是箱子,但是箱子右面是墙或者是箱子,不可以走
	if (map[k][row][col + 1] == 2 && (map[k][row][col + 2] == 1 || map[k][row][col + 2] == 2))
		return;
	//(1)如果向右走是空地0,可以走(2)如果右走是目的地
	if (map[k][row][col + 1] == 0 || map[k][row][col + 1] == 4)
	{
		map[k][row][col] -= 3;
		map[k][row][col + 1] += 3;
	}

	//(3)如果向右是箱子(箱子包含(空地+箱子)或者(目的地+箱子)),并且箱子右面是(3)空地或者(4)目的地,人和箱子同时走
	if ((map[k][row][col + 1] == 2 || map[k][row][col + 1] == 6) && (map[k][row][col + 2] == 0 || map[k][row][col + 2] == 4))
	{
		map[k][row][col] -= 3;
		map[k][row][col + 1] += 1;
		map[k][row][col + 2] += 2;
	}
	col++;
}
void getOpCh()
{
	char op;
	op = _getche();

	switch (op)
	{
	case 'w':
		playGameUp();
		break;
	case 's':
		playGameDown();
		break;
	case 'a':
		playGameLeft();
		break;
	case 'd':
		playGameRight();
		break;

	default:
		break;
	}
}

int main()
{


	while (1)
	{
		//是否全堵通关的标志
		//	bool all = false; //假设没有全部通关
		system("cls");
		showMap();
		//获取人的位置
		for (int i = 0; i < 8; ++i)
			for (int j = 0; j < 9; ++j)
			{
				if (map[k][i][j] == 3)
				{
					row = i;
					col = j;
					break;
				}
			}
		//获取目的的坐标点
		for (int i = 0; i < 8; ++i)
			for (int j = 0; j < 9; ++j)
				if (map[k][i][j] == 4)
					dest[i][j] = 4;
		while (1)
		{
			//进入手动推箱子
			getOpCh();
			system("cls");
			showMap();
			//判断一下是否过关
			bool next = true;
			for (int i = 0; i < 8; ++i)
				for (int j = 0; j < 9; ++j)
				{
					if (dest[i][j])
					{
						if (map[k][i][j] != 6)
							next = false;
					}
				}

			//判断一下,是否过关
			if (next)
			{
				k++;
				memset(dest, 0, sizeof(dest));
				//关卡只有2个,当k==2,表示全部通关
				if (k == 2)
				{
					MessageBox(NULL, TEXT("您已全部通关,非常厉害"), TEXT("hehe"), MB_OK);
					exit(0); //全部通关
				}
				else
				{
					MessageBox(NULL, TEXT("您已通关"), TEXT("hehe"), MB_OK);
					break;

				}
			}
		}
	}

	return 0;
}

效果图:

猜你喜欢

转载自blog.csdn.net/qq_35294564/article/details/82720451