指针小应用:推箱子游戏

来源:互联网 发布:外贸数据网 编辑:程序博客网 时间:2024/09/21 06:33

推箱子和迷宫有点类似,不过多了箱子位置的判断,需要利用指针比较方便.

程序调试过程中出现过几个bug:

第一次:小人推着箱子能穿墙! 

检查发现第二个判定条件里没加箱子的下一步是路> < 

第二次:把箱子推到目的地以后,箱子到了目标'!'的位置,人移到箱子位置,'!'移到原来人所在的位置.到达目的条件永远不会满足,程序在死循环中无法退出

错误原因:能否推动箱子判定的是箱子的下一步不是'#',显然'!'也不是'#',导致交换了三者的位置.进而找到游戏成功的判定条件出现了基础错误.本来是判定箱子地址所指向的内容是否是'!',仔细一想箱子地址指向的内容永远是'm',后来换成箱子当前地址是否等于最初'!'的地置,即map[2][10]的地址.后来在朋友的提醒下,可以设置一个标记值(初始flag=0)想到当箱子推到目的地时直接记录(flag=1).更加简单明了.

最后:就是细节上的再优化,其实还有许多能做的.

通过这个小游戏的编写,有以下几点体会:

1.宏定义的好处:利用宏定义了地图的行和列以后,如果地图有更改,比如增加难度,可以让地图从12*12扩大到15*20,那么只要直接更改宏定义的行和列数值,然后再初始化一下map就好,不需要再去更改程序中的数值了.游戏更新的时候方便许多.

2.要培养简单思考问题的习惯,将任务划分为一个一个单一的问题,逐一完成

3.指针的灵活性:利用指针明显要比迷宫游戏中利用数组下标记录位置方便太多了

//

//  打印地图.m

//  应用:推箱子游戏

//

//  Created by lanou3g on 15/6/24.

//  Copyright (c) 2015 ZhangJia. All rights reserved.

#import "打印地图.h"

@implementation ____

void printMap(char map[COL][ROW]){

   for (int i =0; i <COL; i++) {

       for (int j =0; j <ROW; j++) {

           printf("%c",map[i][j]);

        }

       printf("\n");

    }

}

@end


//  main.m

//  应用:推箱子游戏

//

//  Created by lanou3g on 15/6/22.

//  Copyright (c) 2015 ZhangJia. All rights reserved.

//

#import <Foundation/Foundation.h>

#import "打印地图.h"

#define COL 12

#define ROW 12

int main(int argc,constchar * argv[])

{

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

    //1.定义地图数组map

   char map[COL][ROW]={

        '#','#','#','#','#','#','#','#','#','#','#','#',

        '#','R','#',' ',' ',' ','#',' ',' ','#','#','#',

        '#',' ','m',' ',' ',' ',' ',' ','#','#','!','#',

        '#',' ','#',' ','#',' ','#','#',' ',' ',' ','#',

        '#',' ',' ',' ',' ',' ',' ','#',' ',' ',' ','#',

        '#',' ','#','#','#',' ',' ','#','#',' ','#','#',

        '#',' ','#','#','#',' ',' ',' ','#',' ','#','#',

        '#',' ','#',' ',' ',' ',' ',' ',' ',' ','#','#',

        '#',' ','#',' ','#','#',' ',' ','#',' ','#','#',

        '#',' ',' ',' ','#','#',' ','#','#',' ','#','#',

        '#',' ',' ',' ','#','#',' ',' ',' ',' ',' ','#',

        '#','#','#','#','#','#','#','#','#','#','#','#',

    };

    //2.定义变量接受小人和箱子的位置

   char *r = &map[1][1];

   char derection =0;

   char ch =0;

   int flag =0;

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

    //打印地图

   printMap(map);

    //提示用户玩法w- s- a- d- 其他任意键-退出

    printf("Game Start!\nw- s- a- d- 其他任意键-退出游戏\n");

//******** 循环控制 **********

    //1.接受输入的方向

    //2.判断

    //   1.if如果小人的下一步是路

    //       满足,移动小人

    //         else-->

    //             2.if判断小人的下一个位置是否是箱子,且箱子的下一步有路可走

    //                 满足,箱子移到路的位置,小人移到箱子位置,路移到原来小人的位置

    //                    else-->

    //                      3.下一步是箱子且箱子下一步是目标

    //                          满足:箱子移到目标的位置,小人移到箱子位置,小人原来的位置变成路(:空格),标记符记1

   while (1) {

       scanf("%c",&derection);

       scanf("%c",&ch);//吸收\n


       switch (derection) {

           case'W':

           case'w':

               if (*(r-ROW)==' ') {

                   int temp = *(r-ROW);

                    *(r-ROW) = *r;

                    *r = temp;

                     r -=12;//小人的下一步是路则移动小人

                }elseif (*(r-ROW)=='m' &&  *(r-ROW-ROW) ==' '){

                   int temp = *(r-ROW-ROW);

                    *(r-ROW-ROW)=*(r-ROW);

                    *(r-ROW) = *r;

                    *r = temp;//小人的下一步是箱子且箱子的下一步是路则移动箱子和小人

                     r -=12;//刷新小人位置

                }elseif (*(r-ROW)=='m' &&  *(r-ROW-ROW) =='!'){

                    *(r-ROW-ROW) = *(r-ROW);

                    *(r-ROW) = *r;

                    *r =' ';

                    flag =1;//标记是否到达目的地

                }

               break;


           case'S':

           case's':

               if (*(r+ROW)==' ') {

                   int temp = *(r+ROW);

                    *(r+ROW) = *r;

                    *r = temp;

                    r +=12;

                }elseif (*(r+ROW)=='m' &&  *(r+ROW+ROW)==' '){

                   int temp = *(r+ROW+ROW);

                    *(r+ROW+ROW)=*(r+ROW);

                    *(r+ROW) = *r;

                    *r = temp;

                    r +=12;

                }elseif (*(r+ROW)=='m' &&  *(r+ROW+ROW) =='!'){

                    *(r+ROW+ROW) = *(r+ROW);

                    *(r+ROW) = *r;

                    *r =' ';

                    flag =1;//标记是否到达目的地

                }

               break;


           case'A':

           case'a':

               if (*(r-1)==' ') {

                   int temp = *(r-1);

                    *(r-1) = *r;

                    *r = temp;

                    r -=1;

                }elseif (*(r-1)=='m' && *(r-1-1)==' '){

                   int temp = *(r-1-1);

                    *(r-1-1)=*(r-1);

                    *(r-1) = *r;

                    *r = temp;

                    r -=1;

                }elseif (*(r+1)=='m' &&  *(r+1+1) =='!'){

                    *(r+1+1) = *(r+1);

                    *(r+1) = *r;

                    *r =' ';

                    flag =1;//标记是否到达目的地

                }

               break;


           case'D':

           case'd':

               if (*(r+1)==' ') {

                   int temp = *(r+1);

                    *(r+1) = *r;

                    *r = temp;

                    r +=1;

                }elseif (*(r+1)=='m' && *(r+1+1)==' '){

                   int temp = *(r+1+1);

                    *(r+1+1)=*(r+1);

                    *(r+1) = *r;

                    *r = temp;

                    r +=1;

                }elseif (*(r-1)=='m' &&  *(r-1-1) =='!'){

                    *(r-1-1) = *(r-1);

                    *(r-1) = *r;

                    *r =' ';

                    flag =1;//标记是否到达目的地

                }

               break;


           default:

                printf("您已成功退出游戏!O(∩_∩)O谢谢!\n");

               break;

        }

//******** 刷新地图 **********

       printMap(map);

//******** 是否成功 **********

       if (flag ==1) {

            printf("O(∩_∩)O YOU WIN!!!\n");

           break;

        }

    }

   return 0;

}

运行结果部分截图(R是小人,m是箱子,!是目标位置):





0 0