//
// main.c
// 05推箱子
//
// Created by liuan on 2019/7/9.
// Copyright © 2019 liuan. All rights reserved.
//
#include <stdio.h>
#define ROWS 10
#define COLS 11
/**
地图数组,用来把村地图上每一个格子的类型
*/
char map[ROWS][COLS]={
"##########",
"# #### #",
"# X#### #",
"# O #",
"###### #",
"# ### #",
"# #",
"# ######",
"# ",
"##########",
};
//小人 当前所在的行坐标 默认在第三行 二列
int personCurrentRow=3;
int personCurrentCol=2;
/**
游戏流程
1 打印地图
2 接受输入小人的前进方向
3 根据小人的前进方向来进行推箱子
*/
void showMap();
/**
*/
char enterDirection();
/**
将小人移动到指定的方向
*/
void movePerson(char dir);
/*
根据小人坐标 得到下一个坐标
*/
void getPersonNextPosition(char dir,int currentRow,int currentCol,int *pPersonNextRow,int *pPersonNextCol);
int main() {
while(1){
// 1打印地图
showMap();
//2 接受小人的前进方向
char dir=enterDirection();
// 根据小人的前进方向。来移动小人或者推箱子
movePerson(dir);
}}
void showMap(){
for (int i=0;i<ROWS;i++){
printf("%s\n",map[i]);
}
}
char enterDirection(){
printf("请输入小人的前进方向,a.左边 s.下边 d.右边 w.上边 q.s结束\n");
char dir='a';
rewind(stdin);
scanf("%c",&dir);
return dir;
}
void getPersonNextPosition(char dir,int currentRow,int currentCol,int *pPersonNextRow,int *pPersonNextCol){
/*1 向上移动 就要知道小人的上一个格子的类型
如果上面是1个墙 不能动
如果上面是个路 移动
如果上面是箱子,判断箱子上面是什么
路:推
墙:不动
2 首先要拿到小人的上一个坐标
要拿到小人的一上一个坐标 必须知道当前的坐标
根据小人现在的坐标 计算小人的上1个坐标
*/
int personNextRow=currentRow-1;
int personNextCol=currentCol;
switch (dir) {
case 'a':
case 'A':
personNextRow=currentRow;
personNextCol=currentCol-1;
break;
case 'w':
case 'W':
personNextRow=currentRow-1;
personNextCol=currentCol;
break;
case 'd':
case 'D':
personNextRow=currentRow;
personNextCol=currentCol+1;
break;
case 's':
case 'S':
personNextRow=currentRow+1;
personNextCol=currentCol;
break;
default:
break;
}
*pPersonNextRow=personNextRow;
*pPersonNextCol=personNextCol;
}
void movePerson(char dir){
int personNextRow=0;
int personNextCol=0;
getPersonNextPosition(dir,personCurrentRow,personCurrentCol,&personNextRow,&personNextCol);
printf("%d\n",personNextRow);
printf("%d\n",personNextCol);
//3 判断小人的上1个是什么格子。
if(map[personNextRow][personNextCol]==' '){
//说明是个路 小人移动
//将上1个格子赋值为"O" 小人现在的位置复制为“ ”
map[personNextRow][personNextCol]='O';
map[personCurrentRow][personCurrentCol]=' ';
//更新位置
personCurrentCol=personNextCol;
personCurrentRow=personNextRow;
}else if (map[personNextRow][personNextCol]=='X'){
//上一个格子是箱子
// 判断能不能推
// 1 找到箱子上面的格子的坐标
// 计算出 箱子上面的坐标
int boxNxtRow=0;
int boxNextCol=0;
getPersonNextPosition(dir, personNextRow,personNextCol, &boxNxtRow,&boxNextCol);
if(map[boxNxtRow][boxNextCol]==' '){
//推位置
// a 把当前上一个格子设置为箱子
// 当前箱子的格子设置为小人
// 把小人的位置设置为空格
map[boxNxtRow][boxNextCol]='X';
map[personNextRow][personNextCol]='O';
map[personCurrentRow][personCurrentCol]=' ';
//更新位置
personCurrentRow=personNextRow;
personCurrentCol=personNextCol;
}
}
}