C++推箱子源码

8 篇文章 0 订阅

转发自老廖&&Games的博客

功能:

实现人物的移动控制,关卡的选择,撤销,

 #include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
	int victory=0;
	int Map[3][10][10] = { 
	{ //2是人,4是胜利点,3是箱子,1是墙,0是空地
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 0, 2, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 3, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 4, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 4, 3, 4, 0, 0, 1 },
		{ 1, 0, 3, 0, 0, 1, 0, 0, 0, 1 },
		{ 1, 0, 1, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
		{ 1, 0, 1, 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 },
		{ 1, 0, 2, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 3, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 4, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 0, 3, 0, 4, 0, 1 },
		{ 1, 0, 1, 0, 4, 0, 0, 0, 0, 1 },
		{ 1, 0, 3, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 1, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 1, 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 },
		{ 1, 0, 2, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 3, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 4, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 1, 3, 1, 4, 0, 1 },
		{ 1, 0, 0, 1, 4, 0, 0, 0, 0, 1 },
		{ 1, 0, 3, 0, 0, 1, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	}
	};
	int changeMap[10][10];
	char getchar;
	int offsetx = 0, offsety = 0;
	int manX= 1, manY= 2;
	int index=0, indey=0;
	bool flag=true;
	for (int k = 0; k <= 2; k++)
	{
		memcpy(changeMap, Map[k], sizeof(Map[k]));
		while (true)
		{
			for (int j = 0; j <= 9; j++)
			{

				for (int h = 0; h <= 9; h++)
				{
					switch (Map[k][j][h])
					{
					case 0:
						cout << "  ";//注意空格是一个字符,其它的图形是占两个字符
						break;
					case 1:
						cout << "■";
						break;
					case 2:
						cout << "♀";
						break;
					case 3:
						cout << "☆";
						break;
					case 4:
						cout << "◎";
						break;
						break;
					case 6:
						cout << "♂";
						break;
					case 7:
						cout << "★";
						break;
					}
				}
				cout << endl;
			}
			getchar = _getch();//写入一个字符,进行移动操作
			switch (getchar)
			{
			case 's':
			case  'S':
				offsetx += 1, offsety = 0;
				break;
			case 'w':
			case 'W':
				offsetx -= 1, offsety = 0;
				break;
			case 'a':
			case 'A':
				offsetx=0, offsety-=1;
				break;
			case  'd':
			case 'D':
				offsetx = 0, offsety+=1;
				break;
			case 'r':
			case 'R':
				memcpy(Map[k], changeMap, sizeof(changeMap));
				manX = 1, manY = 2;
				break;
			case 'b':
			case 'B':
				
				if (flag)
				{  
					//撤销人物的位置
					Map[k][manX - index][manY - indey] += 2;
					Map[k][manX][manY] -= 2;
				}
				else{
				//箱子和人一起撤销
					Map[k][manX + index][manY + indey] -= 3;//manX现在是以前箱子在的地方
					Map[k][manX - index][manY - indey] += 2;
					Map[k][manX][manY] -= -3 + 2;//现在的位置要变成箱子 a=a-2+3;
				}
					
					manX -= index, manY -= indey;
					index = 0, indey = 0;
					flag = 0;
					//flag的true以及false,默认撤销人,防止人在箱子旁边,箱子没动却将箱子给撤销了
				break;

			}
			//当人物进行移动时,空地,以及胜利点
			if (Map[k][manX + offsetx][manY + offsety] == 0 || Map[k][manX + offsetx][manY + offsety]==4)
			{
				flag = true;
				Map[k][manX][manY] -=2;
				Map[k][manX + offsetx][manY + offsety] += 2;
				manX += offsetx, manY += offsety;
			}
			//当前面有箱子时,或者箱子在胜利点上面
			else if ((Map[k][manX + offsetx][manY + offsety] == 3) || (Map[k][manX + offsetx][manY + offsety] == 7))
			{
				//判断箱子能推动的情况
				if (Map[k][manX + offsetx * 2][manY + offsety * 2] == 0 || Map[k][manX + offsetx * 2][manY + offsety * 2] == 4)
				{
					flag = false;
					Map[k][manX + offsetx * 2][manY + offsety * 2] += 3;//箱子移动时在的地方
					Map[k][manX + offsetx][manY + offsety] += -3 + 2;//人前往箱子以前所在的地方,a=a-3+2
					Map[k][manX][manY] -= 2;
					manX += offsetx, manY += offsety;
				}//防止撤销步数时,箱子靠墙,按键移动时,位置未发生改变,撤销却能将箱子拉回来
				else{
					offsetx = 0, offsety = 0;
				}
			}
			index = offsetx, indey = offsety;//为撤销方向进行赋值
			offsetx = 0,offsety = 0;//移动步数清0
			system("CLS");//实现清屏操作,需导入Windows.h包
			//判断是否将所有箱子推到胜利点上去
			for (int j = 0; j <= 9; j++)
			{

				for (int h = 0; h <= 9; h++)
				{
					if (Map[k][j][h] == 7)
					{
						victory++;
					}
				}
			}
			if (victory == 3)
			{
				manX = 1, manY = 2;//更新下一关的人物坐标
				index = 0, indey = 0;//通关了,则将本关中的撤销步数变为0
				victory = 0;
				break;
			}
			victory = 0;//将本次统计已经到胜利点的箱子个数进行清空
			
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GAME LIAO

感谢您的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值