基于C语言的推箱子游戏

/*
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;
		}
	}
}
发布了33 篇原创文章 · 获赞 1 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/futurech/article/details/88598076