黑马程序员技术交流社区

标题: 推箱子 [打印本页]

作者: 和夏一样狂热    时间: 2015-7-30 23:53
标题: 推箱子
#include <stdio.h>
#define kRows 10
#define kCols 11
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();  //获取一个字符从键盘上
   
        //防止穿墙
        //0
        personNextX = personX;  //1
        personNextY = personY;  //1
        
    //4、判断方向
        switch (direction) {
            case 'w':
            case 'W':
                //下一个位置-1
                personNextX--;
                break;
            case 's':
            case 'S':
                personNextX++; // 2  3  4  5
                break;
            case 'a':
            case 'A':
                personNextY--;
                break;
            case 'd':
            case 'D':
                personNextY++;
                break;
            case 'q':
            case 'Q':
               
                printf("程序正在退出...\n");
                printf("程序已经退出!\n");
                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);
            /*
             ######
             #    #
             #0X  #
             #    #
             #    #
             ######
             */
    //                 再次判断箱子的下一个位置是否是路
            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;
}

作者: noway190    时间: 2015-7-30 23:56
不错呀                        
作者: wy911011    时间: 2015-7-31 14:29
纯手打的?
作者: 1312878967    时间: 2015-7-31 15:23
厉害 厉害 厉害




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2