C 推箱子游戏

#include <stdio.h>
#include <string.h>
#define kRows 10
#define kCols 11

/*
	打印地图 
*/
void printMap(char map[kRows][kCols]){
	
	for (int i=0; i<kRows; i++){
		printf("%s\n",map[i]);
	} 
}
/*
	移动的函数
	 
*/
void move1 (char map[kRows][kCols], int oldX, int oldY, int newX, int newY){
	char temp;
	temp = map[oldX][oldY];
	map[oldX][oldY] = map [newX][newY];
	map[newX][newY] = temp;
} 
int main(int argc, const char * argv[]) {
	//******定义变量*******
	//1.定义地图 
	char map[kRows][kCols] = {
	"##########",
	"#0 ####  #",
	"# X####  #",
	"#        #",
	"######   #",
	"#  ###   #",
	"#        #",
	"#   ######",
	"#         ",
	"##########"};
	//定义变量保存位置信息
	//小人的当前位置信息
	int personX = 1;
	int personY = 1; 
	//将要移动的下一个位置信息
	int personNextX = personX;
	int personNextY = personY;
	//定义箱子的当前位置
	int boxX = 2;
	int boxY = 2;
	//定义变量接收用户输入的方向
	char direction;
	//定义路、箱子的字符
	char street = ' '; 
	char box = 'X';
	//2.*******打印地图********
	printMap(map);
	printf("请控制小人移动;w.上 s.下 a.左 d.右 q.退出\n"); 
	//****编写循环控制程序*** 
	
	while (1) {
		//3.接收用户输入的方向
		scanf("%c",&direction);
		getchar();//获取一个字符从键盘上
		//防止穿墙
		personNextX = personX;
		personNextY = personY;
		//4.判断方向
		switch (direction) {
			case'w':
			case'W':
				personNextX--; 
				break;
			case's':
			case'S':
				personNextX++;
				break;
			case'a':
			case'A':
				personNextY--;
				break;
			case'd':
			case'D':
				personNextY++;
				break;
			case'q':
			case'Q':
				printf("程序正在退出...\n");
				printf("程序已经退出!");
				return 0;
			default:
				break;
		} 
		//5.根据用户输入的方向判断如何移动
		if (map[personNextX][personNextY] == street) {
			//如果是路,让小人先移动
			//让小人和路进行交换 
			move1(map, personX, personY, personNextX, personNextY);
			//重新调整小人的位置
			personX = personNextX;
			personY = personNextY;
		} else if (map[personNextX][personNextY] == box) {
			//如果不是路 判断是否是箱子 是,计算箱子的下个位置
			int boxNextX = boxX +(boxX - personX);
			int boxNextY = boxY +(boxY - personY);	
			// 再次判断箱子的下个位置是否是路
			if (map[boxNextX][boxNextY] == street) {
				//如果箱子下个是路,移动小人和箱子
				//1)移动箱子到下个位置
				move1(map, boxX, boxY, boxNextX, boxNextY);
				//2)让小人移动到箱子原来的位置
				move1(map, personX, personY, boxX, boxY);
				//重新调整小人和箱子的位置
				personX = personNextX;
				personY = personNextY;
				boxX = boxNextX;
				boxY = boxNextY;
			}
			//如果是箱子 什么也不干
		}
		//*******重绘地图*******
		//6.重绘地图
		printMap(map);
		//******判断是否走出来****
		//7.判断箱子是否被推出来了
//		if (boxY = kCols-2) {
//			printf("恭喜通关!\n");
//			break;
//		}
	}  
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值