/*
1. 游戏的实现步骤
1)游戏开始就显示游戏地图
while(1)
{
2)输入小人前进方向
3)根据小人的前进方向移动小人
}
*/
#include<stdio.h>
#include<stdlib.h>
#define ROWS 10
#define COLS 11
/*二维数组map
这个二维数组有10行,每1行有11列 (最后一列存储\0)
作用:存储地图上每一个格子的类型
每一个元素值和地图上每一个格子的类型是相互对应的
*/
char map[ROWS][COLS] = {
"##########",
"# #### #",
"# X#### #",
"# 0 #",
"###### #",
"# #### #",
"# #",
"# ######",
"# ",
"##########"
};
//保存小人当前的行、列坐标
int currentPersonRow = 3;
int currentPersonCol = 2;
//显示游戏地图
void showMap();
//让用户输入小人前进方向,返回输入的方向字符
char enterDirection();
//将小人向上移动
void moveToUp();
//将小人向左移动
void moveToLeft();
//将小人向下移动
void moveToDown();
//将小人向右移动
void moveToRight();
int main(int argc, const char * argv[])
{
/*
1.显示游戏地图,独立的功能,将其封装成函数
通过判断下一步移动的格子的类型进行不同操作
如果下一步移动的位置是空格,移动
若是一个X,判断箱子是否可以移动
如果是一个#,小人不可移动
所以,使用一个二维数组存储地图上的每一个格子的类型
*/
int flag = 1;
while (flag)
{
//调用一个函数,清空控制台上所有的内容,请注意,该函数必须要在终端下进行清屏操作,Xcode环境下不可行
system("cls");
showMap();
//重新生成地图时,判断游戏是否胜利
if (map[8][9] == 'X')
{
printf("恭喜你!你取得游戏胜利\n");
break; //结束循环,防止接下来的输出
}
//2.让用户输入小人的前进方向
char dir = enterDirection();
printf("你输入的方向是:%c\n", dir);
//3.判断用户输入的前进方向,把小人向不同的方向移动
switch (dir)
{
case 'a':
case 'A':
//将小人向左移动
moveToLeft();
break;
case 'w':
case 'W':
//将小人向上移动
moveToUp();
break;
case 'd':
case 'D':
//将小人向右移动
moveToRight();
break;
case 's':
case 'S':
//将小人向下移动
moveToDown();
break;
case 'q':
case 'Q':
//结束游戏
printf("哎,你的智商真低!\n");
flag = 0;
break;
}
//移动完毕,重新显示地图,若设置循环,则无需执行此步骤
//showMap();
}
return 0;
}
//显示游戏地图
void showMap()
{
//显示游戏地图的原理:打印map数组中的元素
for (int i = 0;i < ROWS;i++)
{
printf("%s\n",map[i]);
}
}
//让用户输入小人前进方向,返回输入的方向字符
char enterDirection()
{
//1.输入小人的前进方向
// 提示用户输入小人的前进方向
printf("请输入小人的前进方向 w.上 s.下 a.左 d.右 q.退出游戏\n");
// 接受输入小人的方向
char dir = 'a';
// 将scanf缓冲区中的数据清空,避免输入的时候会有一些问题
rewind(stdin);
// 输入
scanf("%c",&dir);
//2.将用户输入的前进方向返回
return dir;
}
//将小人向上移动
void moveToUp()
{
/*先判断小人是否可以向上移动
获取小人现在的坐标,计算下一个位置的坐标,判断这个坐标的格子是什么类型
'#',则不能移动
' ',可以移动
'X’,判断箱子是否可以移动,如果可以推,就推,若不可以,则不做出反应
*/
//得到下一个位置的坐标
int nextPersonRow = currentPersonRow - 1;
int nextPersonCol = currentPersonCol;
//判断下一个位置的坐标对应的格子的类型
if (map[nextPersonRow][nextPersonCol] == ' ')
{
//说明是路,移动小人
map[nextPersonRow][nextPersonCol] = '0';
map[currentPersonRow][currentPersonCol] = ' ';
//移动后小人位置改变,重新记录小人当前的位置
currentPersonRow = nextPersonRow;
currentPersonCol = nextPersonCol;
}
else if(map[nextPersonRow][nextPersonCol] == 'X')
{
//说明下一个位置是一个箱子,判断是否可以推箱子
//箱子的当前坐标就是小人下一个坐标
//依据小人下一个坐标计算求出箱子的下一个坐标
int nextBoxRow = nextPersonRow - 1;
int nextBoxCol = nextPersonCol;
//判断箱子的下一个坐标的类型
if (map[nextBoxRow][nextBoxCol] == ' ')
{
//说明箱子可以推
//推箱子的步骤:将箱子的下个位置的坐标设置为箱子,将祥子的当前位置的坐标设置为人,将当前人的位置设置为空格
map[nextBoxRow][nextBoxCol] = 'X';
map[nextPersonRow][nextPersonCol] = '0';
map[currentPersonRow][currentPersonCol] = ' ';
//改变小人的当前位置
currentPersonRow = nextPersonRow;
currentPersonCol = nextPersonCol;
}
}
}
//将小人向左移动
void moveToLeft()
{
//得到下一个位置的坐标
int nextPersonRow = currentPersonRow;
int nextPersonCol = currentPersonCol - 1;
//判断下一个位置的坐标对应的格子的类型
if (map[nextPersonRow][nextPersonCol] == ' ')
{
//说明是路,移动小人
map[nextPersonRow][nextPersonCol] = '0';
map[currentPersonRow][currentPersonCol] = ' ';
//移动后小人位置改变,重新记录小人当前的位置
currentPersonRow = nextPersonRow;
currentPersonCol = nextPersonCol;
}
else if (map[nextPersonRow][nextPersonCol] == 'X')
{
//说明下一个位置是一个箱子,判断是否可以推箱子
//箱子的当前坐标就是小人下一个坐标
//依据小人下一个坐标计算求出箱子的下一个坐标
int nextBoxRow = nextPersonRow;
int nextBoxCol = nextPersonCol-1;
//判断箱子的下一个坐标的类型
if (map[nextBoxRow][nextBoxCol] == ' ')
{
//说明箱子可以推
//推箱子的步骤:将箱子的下个位置的坐标设置为箱子,将祥子的当前位置的坐标设置为人,将当前人的位置设置为空格
map[nextBoxRow][nextBoxCol] = 'X';
map[nextPersonRow][nextPersonCol] = '0';
map[currentPersonRow][currentPersonCol] = ' ';
//改变小人的当前位置
currentPersonRow = nextPersonRow;
currentPersonCol = nextPersonCol;
}
}
}
//将小人向下移动
void moveToDown()
{
//得到下一个位置的坐标
int nextPersonRow = currentPersonRow + 1;
int nextPersonCol = currentPersonCol;
//判断下一个位置的坐标对应的格子的类型
if (map[nextPersonRow][nextPersonCol] == ' ')
{
//说明是路,移动小人
map[nextPersonRow][nextPersonCol] = '0';
map[currentPersonRow][currentPersonCol] = ' ';
//移动后小人位置改变,重新记录小人当前的位置
currentPersonRow = nextPersonRow;
currentPersonCol = nextPersonCol;
}
else if (map[nextPersonRow][nextPersonCol] == 'X')
{
//说明下一个位置是一个箱子,判断是否可以推箱子
//箱子的当前坐标就是小人下一个坐标
//依据小人下一个坐标计算求出箱子的下一个坐标
int nextBoxRow = nextPersonRow + 1;
int nextBoxCol = nextPersonCol;
//判断箱子的下一个坐标的类型
if (map[nextBoxRow][nextBoxCol] == ' ')
{
//说明箱子可以推
//推箱子的步骤:将箱子的下个位置的坐标设置为箱子,将祥子的当前位置的坐标设置为人,将当前人的位置设置为空格
map[nextBoxRow][nextBoxCol] = 'X';
map[nextPersonRow][nextPersonCol] = '0';
map[currentPersonRow][currentPersonCol] = ' ';
//改变小人的当前位置
currentPersonRow = nextPersonRow;
currentPersonCol = nextPersonCol;
}
}
}
//将小人向右移动
void moveToRight()
{
//得到下一个位置的坐标
int nextPersonRow = currentPersonRow;
int nextPersonCol = currentPersonCol + 1;
//判断下一个位置的坐标对应的格子的类型
if (map[nextPersonRow][nextPersonCol] == ' ')
{
//说明是路,移动小人
map[nextPersonRow][nextPersonCol] = '0';
map[currentPersonRow][currentPersonCol] = ' ';
//移动后小人位置改变,重新记录小人当前的位置
currentPersonRow = nextPersonRow;
currentPersonCol = nextPersonCol;
}
else if (map[nextPersonRow][nextPersonCol] == 'X')
{
//说明下一个位置是一个箱子,判断是否可以推箱子
//箱子的当前坐标就是小人下一个坐标
//依据小人下一个坐标计算求出箱子的下一个坐标
int nextBoxRow = nextPersonRow;
int nextBoxCol = nextPersonCol +1 ;
//判断箱子的下一个坐标的类型
if (map[nextBoxRow][nextBoxCol] == ' ')
{
//说明箱子可以推
//推箱子的步骤:将箱子的下个位置的坐标设置为箱子,将祥子的当前位置的坐标设置为人,将当前人的位置设置为空格
map[nextBoxRow][nextBoxCol] = 'X';
map[nextPersonRow][nextPersonCol] = '0';
map[currentPersonRow][currentPersonCol] = ' ';
//改变小人的当前位置
currentPersonRow = nextPersonRow;
currentPersonCol = nextPersonCol;
}
}
}
基于C语言的推箱子游戏
猜你喜欢
转载自blog.csdn.net/futurech/article/details/88598076
今日推荐
周排行