C基础-推箱子(入门级)笔记总结

                                                                                 推箱子(入门级)                                             

 

一、思考-----实现此游戏的几个重点:

1)小人在移动的时候,如何判断下一步是一个箱子

2)小人推着箱子移动,箱子要移动的下一个位置也是路

3)要记录小人的位置、箱子的位置、箱子要移动的下一个位置

4)计算箱子的下一个位置

5)10*10地图,10*11存储

   虽然这个游戏看着很弱,不过也很开脑洞,对于新手入门,还是挺不错的。

二、伪代码的实现:

思路:

//1、定义变量,保存地图、位置信息

//2、打印地图

//3、提示玩法

//4、编写控制程序

//5、接受玩家输入的方向数据

//6、判断小人移动的方向

//7、判断小人将要移动的位置是否是路

      伪代码开始我也觉得很没必要,可是当自己写程序时,丢三拉四,明白了伪代码对于我们新手来说,还是相当重要,可以理清我们的思路。等自己熟悉后自然可以省去。

实现:

#include <stdio.h>

int main(int argc, const char * argv[]) {

//******** 定义变量 **********

    //1、定义地图

          //定义变量保存位置信息

          //定义变量接收用户输入的方向

//*******  打印地图 **********

     //2、打印一遍地图

//*******  编写循环控制程序 *****

     //3、接收用户输入的方向

    //4、判断方向

    //5、根据用户输入的方向 判断如何移动

        //        先判断小人的下一个位置是否 是路

        //        如果是路,先让小人移动

        //        如果不是路,

//*******  判断模块 ***********

    //              再次判断是否是箱子

    //              如果是箱子,计算箱子的下一个位置

    //                 再次判断箱子的下一个位置是否是路

    //                 如果箱子的下一个位置是路,要移动小人和箱子

    //                        如何移动小人和箱子呢?

    //                        1)移动箱子到箱子的下一个位置

    //                        2)让小人移动到箱子的原来的位置

    

    //              如果不是箱子,什么也不干

//******   重绘地图 ***********

    // 6、重绘地图

//*******  判断是否走出来 ******

    // 7、判断箱子是否被推出来了

    return 0;

}

三、推箱子代码实现

#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();  //获取一个字符从键盘上
    
        //防止穿墙
        //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("程序正在退出...\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;
}

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值