• 0031 二维数组指针 推箱子代码实现


    #include <stdio.h>
    /*
     
     数组指针:
     
        定义一个指针变量,让这个指针变量指向一维数组的元素
     
     
     二维数组指针
     
         行指针,用来指向二维数组的每一行,存放的是行的首地址
        
         定义格式:  数据类型  (*行指针变量名)[数组第二维的长度];
        
     二维数组指针的初始化
     
       int a[2][3];
       int b[2][2];
       float f1[4][4];
     
       //假设我要定义一个指向数组a的一个行指针
       // a  = &a[0]  = &a[0][0]  = a[0]
       int (*p)[3] = a;
     
      二维数组指针的使用
     
        *(*(p+i)+j)  //就是获取二维数组的每个元素
     
     */
    
    int main(int argc, const char * argv[]) {
        int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
        
        //二维数组指针
        //二维数组指针可以替代数组名去使用
        int (*p)[4] = a;
        
        for (int i=0; i<3; i++) {
            for (int j=0; j<4; j++) {
                //遍历数组
                printf("%d	",*(*(p+i)+j));
            }
            printf("
    ");
        }
        
        return 0;
    }
    
    //
    //  main.c
    //  14-《推箱子》游戏代码实现(一)
    //
    //  Created by apple on 15/1/8.
    //  Copyright (c) 2015年 itcast. All rights reserved.
    //
    
    #include <stdio.h>
    #define kRows 10
    #define kCols 11
    /**
     *  打印地图
     *
     *  @param map 地图的数组
     */
    void printMap(char map[kRows][kCols]){
        
        for (int i=0; i<kRows; i++) {
            printf("%s
    ",map[i]);
        }
        
    }
    
    
    /**
     *  移动的函数
     *
     *  @param map  <#map description#>
     *  @param oldX <#oldX description#>
     *  @param oldY
     *  @param newX <#newX description#><#oldY description#>
     *  @param newY <#newY description#>
     */
    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]={
            "##########",
            "#O ####  #",
            "# 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.退出
    ");
        //*******  编写循环控制程序 *****
        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++;
                    break;
                case 'a':
                case 'A':
                    personNextY--;
                    break;
                case 'd':
                case 'D':
                    personNextY++;
                    break;
                case 'q':
                case 'Q':
                    
                    printf("程序正在退出...
    ");
                    printf("程序已经退出!
    ");
                    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);
                
                //                 再次判断箱子的下一个位置是否是路
                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("哇哦!你推出来了!
    ");
                break;
            }
            //
        }
        
        return 0;
    }
    
  • 相关阅读:
    Ubuntu下 实现Linux与Windows的互相复制与粘贴
    bzoj2426
    bzoj1835
    bzoj1197
    bzoj1049
    bzoj2893
    bzoj1820
    bzoj1819
    bzoj1455
    bzoj3689
  • 原文地址:https://www.cnblogs.com/aiti/p/4650401.html
Copyright © 2020-2023  润新知