案例展现:推箱子
#include <stdio.h>
#define cRows 10
#define cCols 11
void printMap(char map[cRows][cCols]){
for(int i=0; i< cRows; i++){
printf("%s\n",map[i]);//打印的方式给出了每一维的首地址
}
}
//让小人移动
void move1(char map[][cCols],int oldX,int oldY,int nextX,int nextY){
char temp;
temp = map[oldX][oldY];
map[oldX][oldY] = map[nextX][nextY];
map[nextX][nextY]=temp;
}
int main(){
//定义一个地图,且定义了一下箱子的位置为2,2 ,人的位置在1,1的位置
char map[cRows][cCols] = {
"##########",
"#O #### #",
"# X#### #",
"# #",
"###### #",
"# #### #",
"# #",
"# ######",
"# ",
"##########"
};
//打印一张地图
printMap(map);
//定义小人的位置
int personX = 1;
int personY = 1;
//定义一个变量来说明方向
int direction ;
int boxX = 2;
int boxY = 2;
int street =' ';//表水一个街道,小人可以走的一个空间
int nextX ;
int nextY ;
char box='X';
//提示用户输入
printf("请输入w,a,s,d来控制小人方向\n");
char ch;
while(1){
scanf("%c",&direction);
scanf("%c",&ch);
//防止小人穿墙
nextX = personX;
nextY = personY;
switch(direction){
case 'w':
case 'W':
nextX--;
break;
case 's':
case 'S':
nextX++;
break;
case 'a':
case 'A':
nextY--;
break;
case 'd':
case 'D':
nextY++;
break;
default:
break;
}
if(map[nextX][nextY]==street){
char temp = map[personX][personY];
map[personX][personY] = map[nextX][nextY];
map[nextX][nextY] = temp;
//重新调整小人的位置
personX = nextX;
personY = nextY;
//判断是否是箱子
}else if(map[nextX][nextY]==box){
//计算箱子下一个位置
int boxNextX=boxX+(boxX-personX);
int boxNextY=boxY+(boxY-personY);
//判断箱子的下一步是否是‘ ’如果是,表示可以移动。
if(map[boxNextX][boxNextY]==street){
int temp;
temp=map[boxX][boxY];
map[boxX][boxY] = map[boxNextX][boxNextY];
map[boxNextX][boxNextY]=temp;
temp = map[personX][personY];
map[personX][personY]=map[boxX][boxY];
map[boxX][boxY] = temp;
personX=nextX;
personY=nextY;
boxX = boxNextX;
boxY = boxNextY;
}
}
printMap(map);
if (boxY==9) {
printf("我擦,太牛了!~\n");
}
}
}
|
|