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;
}
原文地址:https://www.cnblogs.com/aiti/p/4650401.html