您的位置:首页 > 职场人生

黑马程序员——C基础---推箱子游戏的代码实现

2015-10-06 15:54 896 查看
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

#import <Foundation/Foundation.h>
#define mRow 10
#define mCol 11
//绘图
void printfMap(char map[mRow][mCol]);
//移动
void Move(int newLocX,int newLocY,int oldLocX,int oldLocY,char map[mRow][mCol]);

int main(int argc, const char * argv[]) {
@autoreleasepool {

int perX=1,perY=1;//小人坐标(起始坐标为(1,1))
int boxX=2,boxY=2;//箱子坐标(起始坐标为(2,2))
BOOL flag=YES;//开关标记
char direction;//玩家选择移动方向
//地图数组
char map[mRow][mCol]={

{'#','#','#','#','#','#','#','#','#','#','\0'},
{'#','O',' ','#','#','#','#',' ',' ','#','\0'},
{'#',' ','X','#','#','#',' ',' ',' ','#','\0'},
{'#',' ',' ',' ',' ',' ',' ',' ',' ','#','\0'},
{'#','#','#','#','#','#','#',' ',' ','#','\0'},
{'#',' ',' ','#','#','#','#',' ',' ','#','\0'},
{'#',' ',' ',' ',' ',' ',' ',' ',' ','#','\0'},
{'#',' ',' ',' ',' ','#','#','#','#','#','\0'},
{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ','\0'},
{'#','#','#','#','#','#','#','#','#','#','\0'}

};
//打印地图
printfMap(map);

while (flag) {

printf("W.⬆️  S.⬇️  A.⬅️  B.➡️  Q.退出\n");
scanf("%c",&direction);
getchar();//接收多余的回车键
switch (direction) {
case 'W':
case 'w':
//判断将要移动的方向上是否是“道路(字符“空”)”,是的话就移动
if (map[perX-1][perY]==' '){
Move(perX-1, perY, perX, perY, map);
perX--;
//前进方向不是“道路”,则判断前进的方向上是否是箱子
}else if((perX-1)==boxX){
//如果前进方向是箱子,再判断箱子以同一方向前进的地方是否是“道路”
if (map[boxX-1][boxY]==' ') {
Move(boxX-1, boxY, boxX, boxY, map);
Move(perX-1, perY, perX, perY, map);
perX--;
boxX--;
}
}

break;

case 'S':
case 's':
if (map[perX+1][perY]==' '){
Move(perX+1, perY, perX, perY, map);
perX++;
}else if((perX+1)==boxX){
if (map[boxX+1][boxY]==' ') {
Move(boxX+1, boxY, boxX, boxY, map);
Move(perX+1, perY, perX, perY, map);
perX++;
boxX++;
}
}

break;

case 'A':
case 'a':
if (map[perX][perY-1]==' '){
Move(perX, perY-1, perX, perY, map);
perY--;
}else if((perY-1)==boxY){
if (map[boxX][boxY-1]==' ') {
Move(boxX, boxY-1, boxX, boxY, map);
Move(perX, perY-1, perX, perY, map);
perY--;
boxY--;
}
}

break;

case 'D':
case 'd':
if (map[perX][perY+1]==' '){
Move(perX, perY+1, perX, perY, map);
perY++;
}else if((perY+1)==boxY){
if (map[boxX][boxY+1]==' ') {
Move(boxX, boxY+1, boxX, boxY, map);
Move(perX, perY+1, perX, perY, map);
perY++;
boxY++;
}
}

break;

case 'Q':
case 'q':
flag = NO;

default:
break;
}

printfMap(map);

//判断箱子是到达了出口
if (boxY == 9) {
printf("恭喜你成功的把箱子推了出来\n");
flag = NO;
}
}
}
return 0;
}

/**
*  绘图函数
*
*  @param map 地图大小
*/
void printfMap(char map[mRow][mCol]){

for (int i=0; i<mRow; i++) {
for (int j=0; j<mCol; j++) {
printf("%c",map[i][j]);
}
printf("\n");
}
}

/**
*  移动函数
*
*  @param newLocX 即将移动到的X点
*  @param newLocY 即将移动到的Y点
*  @param oldLocX 原来的X点
*  @param oldLocY 原来的Y点
*  @param map     地图信息
*/
void Move(int newLocX,int newLocY,int oldLocX,int oldLocY,char map[mRow][mCol]){

map[newLocX][newLocY] = map[newLocX][newLocY]^map[oldLocX][oldLocY];
map[oldLocX][oldLocY] = map[newLocX][newLocY]^map[oldLocX][oldLocY];
map[newLocX][newLocY] = map[newLocX][newLocY]^map[oldLocX][oldLocY];
}


当初学完二维数组后老师讲的例子就是推箱子,当初感觉好难,听老师讲完感觉云里雾里的,如今复习到二维数组,突然想自己试试,发觉竟然如此简单,不过回头再看老师的代码,发现还是不如老师写的好,包括变量的定义使用,功能模块的分离。本着比较学习才能进步的观点,把自己的代码发出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: