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

//渲染界面
for (int i = 0;i < height;i++)
{
	for (int j = 0;j < width;j++)
	{
		//判断是否为箱子
		int k = 0;
		for (;k < COUNT;k++) 
		{
			if (i == arrBox[k].nRow && j == arrBox[k].nCol)
			{
				break;
			}
		}
		//判断是否为坑
		int c = 0;
		for (;c < COUNT;c++)
		{
			if (i == arrHole[c].nRow && j == arrHole[c].nCol)
			{
				break;
			}
		}
		//渲染地图
		if (1 == arrMap[i][j])
		{
			cout << "■";
		}
		else if (i == player.nRow && j == player.nCol)
		{
			cout << player.strImg;
		}
		//渲染箱子
		else if (k < COUNT)
		{
			cout << "◆";
		}
		else if (c < COUNT)
		{
			cout << "□";
		}
		else
		{
			cout << "  ";
		}
	}
	cout << endl;
}

这一块主要是渲染一个游戏界面 ,设置好边界也就是墙,以及将玩家和箱子渲染出来

//记录玩家移动之前的位置
player.nColBk = player.nCol;
player.nRowBk = player.nRow;
//记录箱子移动之前的位置
for (int i = 0;i < COUNT;i++)
{
	arrBox[i].nColBk = arrBox[i].nCol;
	arrBox[i].nRowBk = arrBox[i].nRow;
}

 这块是保存箱子和玩家上一次移动的位置,在后面会很有用处

//移动玩家
if (Key_Listen(VK_UP))
{
	player.nRow--;
}
else if (Key_Listen(VK_DOWN))
{
	player.nRow++;
}
else if (Key_Listen(VK_LEFT))
{
	player.nCol--;
}
else if (Key_Listen(VK_RIGHT))
{
	player.nCol++;
}

通过监控来判断玩家往哪个方向走

//判断玩家是否撞墙
if (1 == arrMap[player.nRow][player.nCol])
{
	player.nRow = player.nRowBk;
	player.nCol = player.nColBk;
}

//判断玩家与箱子是否相撞
for (int i = 0;i < COUNT;i++)
{
	if (player.nCol == arrBox[i].nCol && player.nRow == arrBox[i].nRow)
	{
		int distanceCol = arrBox[i].nCol - player.nColBk;
		int distanceRow = arrBox[i].nRow - player.nRowBk;
		arrBox[i].nCol += distanceCol;
		arrBox[i].nRow += distanceRow;
	}
}
//判断箱子是否撞墙及与其他箱子是否重合
for (int i = 0;i < COUNT;i++)
{
	//判断箱子是否撞墙
	if (1 == arrMap[arrBox[i].nRow][arrBox[i].nCol])
	{
		arrBox[i].nRow = arrBox[i].nRowBk;
		arrBox[i].nCol = arrBox[i].nColBk;
		player.nCol = player.nColBk;
		player.nRow = player.nRowBk;
	}

	//判断箱子是否与其他箱子相撞
	for (int j = i + 1;j < COUNT;j++)
	{
		if (arrBox[i].nCol == arrBox[j].nCol && arrBox[i].nRow == arrBox[j].nRow)
		{
			arrBox[i].nRow = arrBox[i].nRowBk;
			arrBox[i].nCol = arrBox[i].nColBk;
			arrBox[j].nRow = arrBox[j].nRowBk;
			arrBox[j].nCol = arrBox[j].nColBk;
			player.nCol = player.nColBk;
			player.nRow = player.nRowBk;
		}
	}

}

这段代码逻辑都差不多,都是判断玩家是否与箱子或者墙相撞及箱子是否撞墙,如果两两相撞我们就要复位,就是回到移动之前的上一次位置

//判断箱子是否进坑
int count = 0;
for (int i = 0;i < COUNT;i++)
{
	for (int j = 0;j < COUNT;j++)
	{
		if (arrBox[i].nRow == arrHole[j].nRow && arrBox[i].nCol == arrHole[j].nCol)
		{
			count++;
		}
	}
}
if (count == COUNT)
{
	cout << "胜利" << endl;
}

这就是判断箱子是否进坑了,我定义的是一个int变量,判断有箱子进坑就进行加1操作,最后判断这个变量与箱子个是是否相等,相等则就是所有箱子全部进坑

 最后运行结果是这样子

 

 源码在这里

链接:https://pan.baidu.com/s/1VxbkiQIoIEMGJWjjHjiv1Q?pwd=9xjh 
提取码:9xjh

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小新不吃辣

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值