目录
思路:
1.游戏的开始和地图设定
2.地图场景设置和人物的四项移动
3 .分析人物的移动:
4 .判断结束条件:
思路:
l.分析
编写代码实现:
控制游戏角色,在地图上,避开障碍物,将箱子推到目标点
游戏元素:
角色(控制移动)
地图(游戏场所)(空地,墙壁,箱子,目标点)
2.代码分析
图形 ——>数据 图形数据化
*** 作数据
数据 ——>图形 数据图形化
3.写成函数
函数:干活
功能——>函数
4.控制移动
从键盘获取指令,执行相应的函数
指令:wsad WSAD
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
/*
l.分析
编写代码实现:
控制游戏角色,在地图上,避开障碍物,将箱子推到目标点
游戏元素:
角色(控制移动)
地图(游戏场所)(空地,墙壁,箱子,目标点)
2.代码分析
图形 ——>数据 图形数据化
*** 作数据
数据 ——>图形 数据图形化
3.写成函数
函数:干活
功能——>函数
4.控制移动
从键盘获取指令,执行相应的函数
指令:wsad WSAD
*/
#define MAP_ROW 8 //地图行数
#define MAP_CLO 8 //地图列数
void menu()
{
printf("********************************\n");
printf("**** 1.play 0.exit *****\n");
printf("********************************\n");
}
typedef enum
{
map_land=0, //空地
map_wall, //墙
map_hero, //人
map__box, //箱子
map__end, //目标点
map_null //黑的地方
}MapEle;
MapEle mapArr[MAP_ROW][MAP_CLO] = {
{map_null,map_null,map_wall,map_wall,map_wall,map_null,map_null,map_null},
{map_null,map_null,map_wall,map__end,map_wall,map_null,map_null,map_null},
{map_null,map_null,map_wall,map_land,map_wall,map_wall,map_wall,map_wall},
{map_wall,map_wall,map_wall,map__box,map_land,map__box,map__end,map_wall},
{map_wall,map__end,map_land,map__box,map_hero,map_wall,map_wall,map_wall},
{map_wall,map_wall,map_wall,map_wall,map__box,map_wall,map_null,map_null},
{map_null,map_null,map_null,map_wall,map__end,map_wall,map_null,map_null},
{map_null,map_null,map_null,map_wall,map_wall,map_wall,map_null,map_null}
};
//函数声明
void initGameData();
void drawMap();
void playGame();
void isEndGame();
void heroMove(int off_X,int off_Y);
void WanYX()
{
while (1)
{
playGame(); //进行游戏
isEndGame(); //结束条件
}
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do {
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
WanYX();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
} while (input);
}
int main()
{
here:
while (1)
{
test();
}
//游戏初始化数据
initGameData();
//游戏主循环
return 0;
}
2.地图场景设置和人物的四项移动
void drawMap()
{
system("cls");
for (int i = 0; i < MAP_ROW; i++)
{
for (int j = 0; j < MAP_CLO; j++)
{
switch (mapArr[i][j])
{
case map_land:
printf(" ");//空地
break;
case map_wall:
printf("■");//墙
break;
case map_hero:
printf("♂");//人物
break;
case map__box:
printf("●");//箱子
break;
case map__end:
printf("☆");//目标点
break;
case map__box+map__end:
printf("★"); //箱子推到目标点上
break;
case map_hero + map__end:
printf("♀"); //人物站在目标点上
break;
case map_null:
printf(" "); //黑色区域
break;
default:
break;
}
}
printf("\n");
}
printf("\n");
}
void playGame()
{
drawMap();
switch (getch())
{
break;
case'w':
case'W':
heroMove(-1,0);
break;
case's':
case'S':
heroMove(1, 0);
break;
case'A':
case'a':
heroMove(0, -1);
break;
case'D':
case'd':
heroMove( 0,1);
break;
default:
break;
}
}
3 .分析人物的移动:
void heroMove(int off_X, int off_Y)
{
int heroPos_X = 0;
int heroPos_Y = 0;
/*
****向上走****
一、找人
遍历当前关卡数组,记住下标
二、控制
判断不同的情况,决定移动逻辑(修改数组元素的值)
*/
for (int i = 0; i < MAP_ROW; i++)
{
for (int j = 0; j < MAP_CLO; j++)
{
if (map_hero == mapArr[i][j] ||
map_hero + map_land == mapArr[i][j] ||
map_hero + map__end == mapArr[i][j])
{
heroPos_X = i;
heroPos_Y = j;
}
}
}
// 人现在的坐标:mapArr[heroPos_X][heroPos_Y]
// 人上面的坐标:mapArr[heroPos_X-1][heroPos_Y]
// 人下面的坐标:mapArr[heroPos_X+1][heroPos_Y]
// 人左面的坐标:mapArr[heroPos_X][heroPos_Y-1]
// 人右面的坐标:mapArr[heroPos_X][heroPos_Y+1]
// 人接下来的坐标:mapArr[heroPos_X+off_X][heroPos_Y+off_Y]
//上面是空地或者目标点
if (map_land == mapArr[heroPos_X + off_X][heroPos_Y + off_Y] ||
map__end == mapArr[heroPos_X + off_X][heroPos_Y + off_Y])
{
//人走上去(当前位置,人离开 上面位置,人过来)
mapArr[heroPos_X][heroPos_Y] -= map_hero;
mapArr[heroPos_X + off_X][heroPos_Y + off_Y] += map_hero;
}
//上面是箱子或者箱子在点上
else if (map__box == mapArr[heroPos_X + off_X][heroPos_Y + off_Y] ||
map__end + map__box == mapArr[heroPos_X - 1][heroPos_Y])
{
//上面的上面:只有是空地或者目标点才能推动
if (map_land==mapArr[heroPos_X + off_X*2][heroPos_Y + off_Y*2] ||
map__end==mapArr[heroPos_X + off_X*2][heroPos_Y + off_Y*2])
{
//推动箱子
//当前位置,人离开
mapArr[heroPos_X][heroPos_Y] -= map_hero;
//上面位置,人过来
mapArr[heroPos_X + off_X][heroPos_Y + off_Y] += map_hero;
//上面位置,箱子离开
mapArr[heroPos_X + off_X][heroPos_Y + off_Y] -= map__box;
//上面的上面,箱子过来
mapArr[heroPos_X + off_X*2][heroPos_Y + off_Y*2] += map__box;
}
}
}
4 .判断结束条件:
void isEndGame()
{
int isEnd = 1;
for (int i = 0; i < MAP_ROW; i++)
{
for (int j = 0; j < MAP_CLO; j++)
{
if (map__box==mapArr[i][j]||
map__box + map_land == mapArr[i][j])
{
isEnd = 0;
}
}
}
if(isEnd)
{
drawMap();
exit(0);
}
}
我是Try_harder,正在磕磕绊绊中成长~
会结束之后重新开始游戏的小伙伴,留言一下咱们私聊一下。
看到最后不要忘记点赞哦!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)