黑马程序员——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]; }
当初学完二维数组后老师讲的例子就是推箱子,当初感觉好难,听老师讲完感觉云里雾里的,如今复习到二维数组,突然想自己试试,发觉竟然如此简单,不过回头再看老师的代码,发现还是不如老师写的好,包括变量的定义使用,功能模块的分离。本着比较学习才能进步的观点,把自己的代码发出来。
相关文章推荐
- ARM面试题
- Java程序员面试失败的5大原因 //转自:极客网
- 图像处理职位面试题汇总(7)
- block的常考面试题
- 面试题126-150
- 《程序员面试金典》--平衡二叉树的检测
- iOS-面试助攻(二)
- 黑马程序员_JAVA单例设计模式
- 关于程序员的笑话
- 黑马程序员——基础知识——数组
- Java程序员常犯的10个错误
- PHP面试体小总结
- 黑马程序员-java基础(三)-异常体系
- 黑马程序员——IO概述之字符流
- 只有程序员看的懂的面试圣经|如何拿下编程面试
- 下一次技术面试时要问的 3 个重要问题
- 黑马程序员—IO流(2)
- 作为程序员,要取得非凡成就需要记住的15件事。
- Android面试准备:自定义控件(二)
- 如何在面试中面试官的提示下,积极地思考?