很高兴你能光临小编寒舍
首先感谢百忙之中你能从万千文章中点小编得专属页面。这不是娱乐篇,这是学习道场。开始前,小编就做一个简单得自我介绍:(开启装逼模式)
我就是传说中写文章通俗而不庸俗,说话风流而不下流,智慧与美貌并重,英雄与侠义得化身得小编老师。人间人爱,花见花开已不足以形容我得帅气!
我又被打了,帮忙叫下120
好了好了,我再也不敢了,进入主题:
没错就是这么简单。
就这么简单
小编有话要说:
map[2][7][8]说:首先大家将会看到三维数组!!没听错就是三维得,不要怕,你要明白得是map[2][7][8]中 [2]是用来表达关数就没什么问题了哦。
剩下得你就和把他当作一个二维数组就可以了。
cas说: 我就是控制关数得,但是我要从0开始,为啥呢?因为地图是从0开始得呀
boxSum[2]说:我是用来控制胜负得,至于我里面得值是没一关卡箱子得数目啊。
小编有话要说:
绘制地图原理: 就是一个萝卜一个坑,在数组中用特殊得值表示不同得物品,这个就需要你去玩一遍推箱子了,要非常熟悉熟悉箱子得几个状态了。
不知道的可以去玩玩哦
0: 空地 " "
1: 墙 "▆"
3: 目的地 "☆"
4: 箱子 "★"
5:人 "※"
7:/目的(3)和箱子(4)在一起"⊙"
8:人(5)和目的(3)在一起:"※"
由于截图是ps拼接的,截图姐去不了那么多
基本上C语言中甚至是以后用到的按键处理基本都是这个框架
移动过程在同步数组下标变化
1.人前面是空地或者目的地
空地的值是0,目的地的是3
2.人前面是箱子,箱子前面是空地或者目的地
就是这么简单,其他方向开始你的拷贝把!
胜负判断:那就很简单的了箱子数目为零就可以了。
就是这么粗暴
完整源码:
//0:空的 1:▆ 3:☆ 4:★ 5:※ 7:⊙ 8:※
#include
#include
#include
int map[2][7][8] =
{
//0:空的 1:▆ :墙
//3:☆ 4:★ //目的地和箱子
//5:※ //人
//7:⊙ //目的(3)和箱子(4)在一起
//8:※ //人(5)和目的(3)在一起
//为让多种情况使用一种算法
//数学艺术
{
1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 3, 1, 0, 1, 1, 3, 1,
1, 4, 0, 0, 4, 0, 3, 1,
1, 0, 1, 0, 1, 1, 4, 1,
1, 0, 0, 5, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1
},
{
1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 3, 1, 0, 1, 1, 3, 1,
1, 3, 4, 5, 4, 0, 3, 1,
1, 4, 1, 0, 1, 1, 4, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1
}
};
int cas = 0; //为0表示第一关
//记录每一关的箱子数 或者是项目和目的在一起的总数
int boxSum[2] = {3,4};
//地图绘图
void drawMap()
{
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 8; j++)
{
if (j == 0)
printf("\t\t");
switch (map[cas][i][j])
{
// //0:空的 1:▆ :墙
case 0:
printf(" ");
break;
case 1:
printf("▆");
break;
//3:☆ 4:★ //目的地和箱子
case 3:
printf("☆");
break;
case 4:
printf("★");
break;
//5:※ //人
case 5:
case 8:
printf("※");
break;
case 7:
printf("⊙");
break;
//7:⊙ //目的(3)和箱子(4)在一起
//8:※ //人(5)和目的(3)在一起
}
}
printf("\n");
}
}
//按键处理
void keyDown()
{
//分析按键过程
//定位人在哪里
//人有两种情况:第一个是:人,第二个:人站在目的上
int i, j;
for (i = 0; i < 7; i++)
{
for (j = 0; j < 8; j++)
{
if (map[cas][i][j] == 5 || map[cas][i][j] == 8)
{
break;
}
}
if (map[cas][i][j] == 5 || map[cas][i][j] == 8)
{
break;
}
}
char ch = _getch(); //看不见的字符输入,+头文件 conio.h
switch (ch)
{
//72 80 75 77
case 'w':
case 'W':
case 72:
//下一个地方等于空地或者是目的 能走
if (map[cas][i - 1][j] == 0 || map[cas][i - 1][j] == 3)
{
//3+5=8 :表示目的和人在一起
//新地方(map[i-1][j])人(5)来了
map[cas][i - 1][j] += 5;
//老地方(map[i][j])人(5)走了
map[cas][i][j] -= 5;
}
//如果下一个是箱子,要进一步判断能走
//注意点:箱子两种状态:箱子,箱子和目的在一起
else if (map[cas][i - 1][j] == 4 || map[cas][i - 1][j] == 7)
{
//做箱子的下一个地方判断能不能走
if (map[cas][i - 2][j] == 0 || map[cas][i - 2][j] == 3)
{
//新的地方箱子来了
map[cas][i - 2][j] += 4;
//箱子的位置:箱子(-4)走了 人来(+5)
map[cas][i - 1][j] += 1;
//原来的地方人走了
map[cas][i][j] -= 5;
}
}
break;
case 's':
case 'S':
case 80:
//下一个地方等于空地或者是目的 能走
if (map[cas][i + 1][j] == 0 || map[cas][i + 1][j] == 3)
{
//3+5=8 :表示目的和人在一起
//新地方(map[i-1][j])人(5)来了
map[cas][i + 1][j] += 5;
//老地方(map[i][j])人(5)走了
map[cas][i][j] -= 5;
}
else if (map[cas][i + 1][j] == 4 || map[cas][i + 1][j] == 7)
{
//做箱子的下一个地方判断能不能走
if (map[cas][i + 2][j] == 0 || map[cas][i + 2][j] == 3)
{
//新的地方箱子来了
map[cas][i + 2][j] += 4;
//箱子的位置:箱子(-4)走了 人来(+5)
map[cas][i + 1][j] += 1;
//原来的地方人走了
map[cas][i][j] -= 5;
}
}
break;
case 'a':
case 'A':
case 75:
//下一个地方等于空地或者是目的 能走
if (map[cas][i][j - 1] == 0 || map[cas][i][j - 1] == 3)
{
//3+5=8 :表示目的和人在一起
//新地方(map[i-1][j])人(5)来了
map[cas][i][j - 1] = map[cas][i][j - 1] + 5;
//老地方(map[i][j])人(5)走了
map[cas][i][j] = map[cas][i][j] - 5;
//j+=5 j=j+5
}
else if (map[cas][i][j - 1] == 4 || map[cas][i][j - 1] == 7)
{
//做箱子的下一个地方判断能不能走
if (map[cas][i][j - 2] == 0 || map[cas][i][j - 2] == 3)
{
//新的地方箱子来了
map[cas][i][j - 2] += 4;
//箱子的位置:箱子(-4)走了 人来(+5)
map[cas][i][j - 1] += 1;
//原来的地方人走了
map[cas][i][j] -= 5;
}
}
break;
case 'D':
case 'd':
case 77:
//下一个地方等于空地或者是目的 能走
if (map[cas][i][j + 1] == 0 || map[cas][i][j + 1] == 3)
{
//3+5=8 :表示目的和人在一起
//新地方(map[i-1][j])人(5)来了
map[cas][i][j + 1] += 5;
//老地方(map[i][j])人(5)走了
map[cas][i][j] -= 5;
}
//下一个地方是箱子,判断箱子的下一个地方是不是目的和空地
else if (map[cas][i][j + 1] == 4 || map[cas][i][j + 1] == 7)
{
//做箱子的下一个地方判断能不能走
if (map[cas][i][j + 2] == 0 || map[cas][i][j + 2] == 3)
{
//新的地方箱子来了
map[cas][i][j + 2] += 4;
//箱子的位置:箱子(-4)走了 人来(+5)
map[cas][i][j + 1] += 1;
//原来的地方人走了
map[cas][i][j] -= 5;
}
}
break;
}
}
//胜负判断
//用什么判断胜负: 箱子到达目的的个数
int gameOver()
{
int count = 0;
//所有的地方找一遍
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 8; j++)
{
if (map[cas][i][j] == 7)
count++;
}
}
return count;
}
//箱子数是零的时候也是胜利
int gameOver2()
{
int count = 3;
//所有的地方找一遍
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 8; j++)
{
if (map[cas][i][j] == 3)
count--;
}
}
return count;
}
int main()
{
while (1)
{
printf("\n\n\t\t 第【%d】关\n",cas+1);
drawMap();
if (gameOver() == boxSum[cas])
{
cas++;
if (cas == 2)
break;
}
keyDown();
system("cls");
}
printf("GameOVer");
system("pause");
return 0;
}
更多精彩。学习问题,我Q:843412449
期待下一次与你回眸相遇