您的位置:首页 > 编程语言 > C语言/C++

c实现 推箱子游戏

2015-07-09 13:55 701 查看
#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]); 
// 由于map[i]代表每一行的首地址,遇到\0结束
    }

}

/*
    移动的函数
 
 */
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 demo8(){
    
    // ******** 定义变量,保存地图,位置信息 ********
    
    //1、定义地图
    char map[kRows][kCols]={
        "##########",
        "#0 ####  #",
        "# X####  #",
        "#        #",
        "######   #",
        "#  ####  #",
        "#        #",
        "#   ######",
        "#         ",
        "##########",
        
    };
    
    //定义变量保存位置信息
    
    //定义小人当前位置信息
    int personX =
1;
    int personY =
1;
    //小人将要移动的下一个位置信息
    int personNestX = personX;
    int personNestY = personY;
    
    //定义箱子的当前位置
    int boxX =
2;
    int boxY =
2;
    
    //定义变量接收用户输入方向
    char direction;
    
    //定义路的字符
    char street =
' ';
    
    //定箱子的字符
    char box ='X';
    
    // ******** 打印地图 ********
    //2、打印一边地图
    printMap(map);
    
    printf("请控制小人移动:w=上 s=下
s=左 d=右 q=退出\
4000
n");
    
    // ******** 编写循环控制程序 ********
    while (1) {
        
    //3,接收用户输入的方向
        scanf("%c",&direction);
        getchar(); 
//获取一个字符
吸收回车符
        
        //防止穿墙
        personNestX = personX;
        personNestY = personY;
        
    //4、判断方向
        switch (direction) {
            case
'w':
            case
'W':
                //下一个位置 -1
                personNestX--;
                
                break;
            case
's':
            case
'S':
                personNestX++;
                
                break;
            case
'a':
            case
'A':
                personNestY--;
                
                break;
            case
'd':
            case
'D':
                personNestY++;
                
                break;
            case
'q':
            case
'Q':
                return
0;
                break;
            default:
                break;

        }
    
    
    //5、根据用户输入的方向
判断如何移动
        
        //      先判断小人的下个位置
是否是路
        
        //         
是路:先让小人移动
        
        if(map[personNestX][personNestY]==street){
            //移动,让小人和路进行交换
            move1(map,personX,personY,personNestX,personNestY);
            
            //重新调整小人的位置
            personX = personNestX;
            personY = personNestY;
            
        }else
if(map[personNestX][personNestY]==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 = personNestX;
                personY = personNestY;
                
                boxX = boxNextX;
                boxY = boxNextY;
            }
    //                     
如果不是箱子,什么也不干
        }
    
    
    
    // ******** 刷新地图 ********
        printMap(map);
    // ******** 判断是否走出来 ********
        if(boxY ==
kCols-2){
            printf("哈哈!你成功完成任务!\n");
            break;
        }
    }
    
    return
0;
    
    
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  推箱子游戏 c语言