上一篇我们完成了游戏的初始化工作,本篇我们开始进行游戏控制
首先我们先定义方向
//方向
enum Ch{ up = 72, down = 80, left = 75, right = 77 };
Ch ch; 接下来开始进行游戏控制。
本游戏为控制人物的移动,故需要首先获取人物的位置
//人的行与列
int r, c; for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 10; j++)
{
if (x[i][j] == 4 || x[i][j] == 6)
{
r = i;
c = j;
} }
} 如上,我们便可以寻找到人物的位置坐标了
人物可以有上下左右四个方向的移动,通过键盘控制。在这里,我们选用switch结构来进行操作
首先我们介绍向上走
switch (getch())
{//这里的三个case,分别表示我们可以用键盘方向键与wsad来进行控制
case 72:
case 'w':
case 'W':
//人的上方不能是墙
//人的上方是箱子且箱子的上方不能是墙或者箱子
if (((x[r][c - 1] == 3 || x[r][c - 1] == 5) && (x[r][c - 2] != 1 && x[r][c - 2] != 3 && x[r][c - 2] != 5))
|| x[r][c - 1] == 0 || x[r][c - 1] == 2)
{
if (x[r ][c- 1] == 3 || x[r ][c- 1] == 5)
{
x[r ][c- 2] += 3;
x[r][c - 1] += 1;
x[r][c] -= 4;
}
else
{
x[r ][c- 1] += 4;
x[r][c] -= 4;
}
}
break;以上便是向上走的编写,向下/向左/向右同理编写。
请思考,为什么switch结构中有时候需要加break,有时候不需要呢??
如何判断游戏结束呢,可以有多种方式,例如判断数组中是否还有3(箱子)或者2(位置)。在这里我们采用一个复杂的判断方式,采用本局中所得分分数与位置和箱子的数量相同进行判断
位置和箱子的数量
Next_game = 0;
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 10; j++)
{
if (x[i][j] == 2 ||x[i][j] == 5)
Next_game++;
}
}
//生成本局游戏分数
score = 0;
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 10; j++)
{
if (x[i][j] == 5)//得分
{
score += 1;
} }
}//判断一关是否结束(有几个位置)、即所得的分与位置和箱子的数量相同 if (Next_game == score)
{
cleardevice(); //此函数在easyx图形界面库中
TCHAR s1[] = _T("完成本关。开始进入下一关");
outtextxy(200, 200, s1);
Sleep(2000);
}-------------------------------------
以上即为推箱子的简要编写介绍,如需开发其他功能,请自行探索。
如想要获取源文件输入【推箱子】即可获取