这篇文章主要介绍“怎么用C语言实现推箱子”,在日常操作中,相信很多人在怎么用C语言实现推箱子问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C语言实现推箱子”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
注意:每次打印地图的时候要在前面加入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两个条件即可,具体代码如最后源码所示。
对角色移动的函数我们需要分为2个函数,一个是来控制角色移动的函数,另一个则是来寻找角色所在位置的坐标。
在该函数中,我们需要对寻找角色,以及判断箱子能否推动做两个功能封装为一个函数,在该函数中,我们要先找到角色的位置,然后对移动的位置进行判断。
// 移动逻辑 参数: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;
}
}
}
该函数对键盘输入进行处理,并且通过传入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;
}
}
这里用到了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;
}
这里的思想是,先绘制地图,然后对移动进行判断,直到判断所有的箱子没有后,判定玩家胜利。
int main()
{
while (!isWin()) // 游戏主循环
{
drawMap();
heroMove();
}
drawMap();
return 0;
}
#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;
}
到此,关于“怎么用C语言实现推箱子”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。