A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

//
//  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\n",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.退出\n");
    //*******  编写循环控制程序 *****
    while (1) {

    //3、接收用户输入的方向
        scanf("%c",&direction);
        getchar();  //获取一个字符从键盘上

        //防止穿墙
        personNextX = personX;
        personNextY = personY;

    //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("程序正在退出...\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);

    //                 再次判断箱子的下一个位置是否是路
            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;
}


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马