
1.前言
2.地图代码修改成函数
3.角色移动修改成函数
3.1寻找角色函数
3.2角色移动函数
4.判断胜利修改成函数
5.主体函数的实现
6.推箱子能实现基本功能的源码
总结
1.前言本文章将承接着上面的文章(上篇文章的地址),继续对推箱子的代码进行修改和完善,对上面杂乱的代码进行修改成函数。
2.地图代码修改成函数注意:每次打印地图的时候要在前面加入system("cls")语句来清除刷新地图,该方法需要用到#include <Windows.h>的头文件。
对上篇文章的推箱子的地图代码进行函数封装,成果如下:
void drawMap()
{
system("CLS");
// 使用循环,遍历数组(将游戏数据图形化)
for (size_t i = 0; i < 10; i++)
{
for (size_t j = 0; j < 10; j++)
{
/*printf("%2d", map[i][j]);*/
switch (map[i][j])
{
case 0:
printf(" "); // 两个空格
break;
case 1:
printf("█");
break;
case 2:
printf("♀");
break;
case 3:
printf("●");
break;
case 4:
printf("☆");
break;
default:
break;
}
}
printf("\n");
}
}
而存储地图的地方可以放在主函数体外面来进行声明。
在这之后如果推到成功点和人走到成功点上仅需要加上case 2+4和case 3+4两个条件即可,具体代码如最后源码所示。
3.角色移动修改成函数对角色移动的函数我们需要分为2个函数,一个是来控制角色移动的函数,另一个则是来寻找角色所在位置的坐标。
3.1寻找角色函数在该函数中,我们需要对寻找角色,以及判断箱子能否推动做两个功能封装为一个函数,在该函数中,我们要先找到角色的位置,然后对移动的位置进行判断。
// 移动逻辑 参数:int X,int Y X和Y方向的偏移量
void move(int X,int Y)
{
// 1 找人
int posX = 0, posY = 0;
for (size_t i = 0; i < 10; i++)
{
for (size_t j = 0; j < 10; j++)
{
if (2 == map[i][j] || 2 + 4 == map[i][j])
{
posX = i;
posY = j;
break;
}
}
}
// 空地或成功点 map[posX][posY]:主角所在的位置
if (0 == map[posX + X][posY + Y] || 4 == map[posX + X][posY + Y])
{
map[posX][posY] -= 2;
map[posX + X][posY + Y] += 2;
}
// 箱子(将箱子从点上推走)
else if (3 == map[posX + X][posY + Y] || 3 + 4 == map[posX + X][posY + Y])
{
// 箱子上面是空地或成功点 map[posX - 1][posY]: 箱子位置
if (0 == map[posX + (X * 2)][posY + (Y * 2)] || 4 == map[posX + (X * 2)] [posY + (Y * 2)])
{
// 当前位置人离开
map[posX][posY] -= 2;
map[posX + X][posY + Y] += 2;
map[posX + X][posY + Y] -= 3;
map[posX + (X * 2)][posY + (Y * 2)] += 3;
}
}
}
3.2角色移动函数
该函数对键盘输入进行处理,并且通过传入2个参数来一次性对移动进行操作,不需要四个方向都需要在写一遍函数,以下写法可以防止用户开大写而移动不了角色。
void heroMove()
{
// 控制人物移动
// 2 控制(键盘:WSAD(上下左右))
// 需要从键盘获取按键(字符)
switch (getch())
{
case 'w':
case 'W':
move(-1, 0);
break;
case 's':
case 'S':
move(1, 0);
break;
case 'a':
case 'A':
move(0, -1);
break;
case 'd':
case 'D':
move(0, 1);
break;
default:
break;
}
}
4.判断胜利修改成函数
这里用到了C++的bool类型,c语言也是可以使用,如果不想用这种函数,改成int也是可以使用的。
bool isWin()
{
for (size_t i = 0; i < 10; i++)
{
for (size_t j = 0; j < 10; j++)
{
if (map[i][j] == 3)
{
return false;
}
}
}
return true;
}
5.主体函数的实现
这里的思想是,先绘制地图,然后对移动进行判断,直到判断所有的箱子没有后,判定玩家胜利。
int main()
{
while (!isWin()) // 游戏主循环
{
drawMap();
heroMove();
}
drawMap();
return 0;
}
6.推箱子能实现基本功能的源码
#include <stdio.h>
#include <conio.h>
#include <Windows.h>
char map[10][10] =
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 1, 4, 0, 0, 1 },
{ 1, 0, 0, 4, 0, 1, 1, 0, 0, 1 },
{ 1, 0, 0, 3, 0, 1, 0, 0, 0, 1 },
{ 1, 0, 0, 2, 0, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 0, 0, 3, 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 }
};
/* 函数声明 */
void drawMap();
void heroMove();
void move(int X, int Y);
bool isWin();
int main()
{
while (!isWin()) // 游戏主循环
{
drawMap();
heroMove();
}
drawMap();
return 0;
}
/* 函数定义 */
// 绘制地图
void drawMap()
{
system("CLS");
// 使用循环,遍历数组(将游戏数据图形化)
for (size_t i = 0; i < 10; i++)
{
for (size_t j = 0; j < 10; j++)
{
/*printf("%2d", map[i][j]);*/
switch (map[i][j])
{
case 0:
printf(" "); // 两个空格
break;
case 1:
printf("█");
break;
case 2:
printf("♀");
break;
case 3:
printf("●");
break;
case 4:
printf("☆");
break;
case 2 + 4:
printf("♀");
break;
case 3 + 4:
printf("★");
break;
default:
break;
}
}
printf("\n");
}
}
void heroMove()
{
// 控制人物移动
// 2 控制(键盘:WSAD(上下左右))
// 需要从键盘获取按键(字符)
switch (getch())
{
case 'w':
case 'W':
move(-1, 0);
break;
case 's':
case 'S':
move(1, 0);
break;
case 'a':
case 'A':
move(0, -1);
break;
case 'd':
case 'D':
move(0, 1);
break;
default:
break;
}
}
// 移动逻辑 参数:int X,int Y X和Y方向的偏移量
void move(int X,int Y)
{
// 1 找人
int posX = 0, posY = 0;
for (size_t i = 0; i < 10; i++)
{
for (size_t j = 0; j < 10; j++)
{
if (2 == map[i][j] || 2 + 4 == map[i][j])
{
posX = i;
posY = j;
break;
}
}
}
// 空地或成功点 map[posX][posY]:主角所在的位置
if (0 == map[posX + X][posY + Y] || 4 == map[posX + X][posY + Y])
{
map[posX][posY] -= 2;
map[posX + X][posY + Y] += 2;
}
// 箱子(将箱子从点上推走)
else if (3 == map[posX + X][posY + Y] || 3 + 4 == map[posX + X][posY + Y])
{
// 箱子上面是空地或成功点 map[posX - 1][posY]: 箱子位置
if (0 == map[posX + (X * 2)][posY + (Y * 2)] || 4 == map[posX + (X * 2)] [posY + (Y * 2)])
{
// 当前位置人离开
map[posX][posY] -= 2;
map[posX + X][posY + Y] += 2;
map[posX + X][posY + Y] -= 3;
map[posX + (X * 2)][posY + (Y * 2)] += 3;
}
}
}
//判断胜利
bool isWin()
{
for (size_t i = 0; i < 10; i++)
{
for (size_t j = 0; j < 10; j++)
{
if (map[i][j] == 3)
{
return false;
}
}
}
return true;
}
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注易知道(ezd.cc)的更多内容!