//渲染界面
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