温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么用C语言实现推箱子

发布时间:2022-02-18 13:41:57 来源:亿速云 阅读:100 作者:iii 栏目:开发技术

这篇文章主要介绍“怎么用C语言实现推箱子”,在日常操作中,相信很多人在怎么用C语言实现推箱子问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C语言实现推箱子”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    地图代码修改成函数

    注意:每次打印地图的时候要在前面加入system("cls")语句来清除刷新地图,该方法需要用到#include <Windows.h>的头文件。

    对上篇文章的推箱子的地图代码进行函数封装,成果如下:

    void drawMap() 
    { 
        system("CLS"); 
        // 使用循环,遍历数组(将游戏数据图形化) 
        for (size_t i = 0; i < 10; i++) 
        { 
            for (size_t j = 0; j < 10; j++) 
            { 
                /*printf("%2d", map[i][j]);*/ 
                switch (map[i][j]) 
                {
                    case 0: 
                        printf(" "); // 两个空格 
                        break; 
                    case 1: 
                        printf("█"); 
                        break; 
                    case 2: 
                        printf("♀"); 
                        break; 
                    case 3: 
                        printf("●"); 
                        break; 
                    case 4: 
                        printf("☆"); 
                        break; 
                    default: 
                        break; 
                    } 
            }
            printf("\n"); 
        } 
    }

    而存储地图的地方可以放在主函数体外面来进行声明。

    在这之后如果推到成功点和人走到成功点上仅需要加上case 2+4和case 3+4两个条件即可,具体代码如最后源码所示。

    角色移动修改成函数

    对角色移动的函数我们需要分为2个函数,一个是来控制角色移动的函数,另一个则是来寻找角色所在位置的坐标。

    1寻找角色函数

    在该函数中,我们需要对寻找角色,以及判断箱子能否推动做两个功能封装为一个函数,在该函数中,我们要先找到角色的位置,然后对移动的位置进行判断。

    // 移动逻辑 参数:int X,int Y X和Y方向的偏移量 
    void move(int X,int Y) 
    { 
        // 1 找人 
        int posX = 0, posY = 0; 
        for (size_t i = 0; i < 10; i++) 
        { 
            for (size_t j = 0; j < 10; j++) 
            { 
                if (2 == map[i][j] || 2 + 4 == map[i][j]) 
                { 
                    posX = i; 
                    posY = j; 
                    break; 
                }
            } 
        }
        // 空地或成功点 map[posX][posY]:主角所在的位置 
        if (0 == map[posX + X][posY + Y] || 4 == map[posX + X][posY + Y]) 
        { 
        map[posX][posY] -= 2; 
        map[posX + X][posY + Y] += 2; 
        }
        // 箱子(将箱子从点上推走) 
        else if (3 == map[posX + X][posY + Y] || 3 + 4 == map[posX + X][posY + Y]) 
        { 
            // 箱子上面是空地或成功点 map[posX - 1][posY]: 箱子位置 
            if (0 == map[posX + (X * 2)][posY + (Y * 2)] || 4 == map[posX + (X * 2)] [posY + (Y * 2)]) 
            { 
                // 当前位置人离开 
                map[posX][posY] -= 2; 
                map[posX + X][posY + Y] += 2; 
                map[posX + X][posY + Y] -= 3; 
                map[posX + (X * 2)][posY + (Y * 2)] += 3; 
            } 
        } 
    }

    2角色移动函数

    该函数对键盘输入进行处理,并且通过传入2个参数来一次性对移动进行操作,不需要四个方向都需要在写一遍函数,以下写法可以防止用户开大写而移动不了角色。

    void heroMove() 
    { 
        // 控制人物移动 
        // 2 控制(键盘:WSAD(上下左右)) 
        // 需要从键盘获取按键(字符) 
        switch (getch())
        {
            case 'w': 
            case 'W': 
                move(-1, 0); 
                break; 
            case 's': 
            case 'S': 
                move(1, 0); 
                break; 
            case 'a': 
            case 'A': 
                move(0, -1); 
                break; 
            case 'd': 
            case 'D': 
                move(0, 1); 
                break; 
            default: 
                break; 
        } 
    }

    判断胜利修改成函数

    这里用到了C++的bool类型,c语言也是可以使用,如果不想用这种函数,改成int也是可以使用的。

    bool isWin() 
    { 
        for (size_t i = 0; i < 10; i++) 
        { 
            for (size_t j = 0; j < 10; j++) 
            { 
                if (map[i][j] == 3) 
                { 
                    return false; 
                } 
            } 
        }
        return true;
    }

    主体函数的实现

    这里的思想是,先绘制地图,然后对移动进行判断,直到判断所有的箱子没有后,判定玩家胜利。

    int main() 
    { 
        while (!isWin()) // 游戏主循环 
        { 
            drawMap(); 
            heroMove(); 
        }
        drawMap(); 
        return 0; 
    }

    推箱子能实现基本功能的源码

    #include <stdio.h> 
    #include <conio.h> 
    #include <Windows.h> 
    char map[10][10] = 
    { 
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 
        { 1, 0, 0, 0, 0, 1, 0, 0, 0, 1 }, 
        { 1, 0, 0, 0, 0, 1, 4, 0, 0, 1 }, 
        { 1, 0, 0, 4, 0, 1, 1, 0, 0, 1 }, 
        { 1, 0, 0, 3, 0, 1, 0, 0, 0, 1 }, 
        { 1, 0, 0, 2, 0, 0, 0, 0, 0, 1 },
        { 1, 1, 1, 1, 0, 0, 3, 0, 0, 1 }, 
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, 
        { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, 
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } 
    };
    /* 函数声明 */ 
    void drawMap(); 
    void heroMove(); 
    void move(int X, int Y); 
    bool isWin();
    int main() 
    { 
        while (!isWin()) // 游戏主循环 
        { 
            drawMap(); 
            heroMove(); 
        }
        drawMap(); 
        return 0; 
    }
    /* 函数定义 */ 
    // 绘制地图 
    void drawMap() 
    { 
        system("CLS"); 
        // 使用循环,遍历数组(将游戏数据图形化) 
        for (size_t i = 0; i < 10; i++) 
        { 
            for (size_t j = 0; j < 10; j++) 
            { 
                /*printf("%2d", map[i][j]);*/ 
                switch (map[i][j]) 
                {
                    case 0: 
                        printf(" "); // 两个空格 
                        break; 
                    case 1: 
                        printf("█"); 
                        break; 
                    case 2: 
                        printf("♀"); 
                        break; 
                    case 3: 
                        printf("●"); 
                        break; 
                    case 4: 
                        printf("☆"); 
                        break; 
                    case 2 + 4: 
                        printf("♀");
                        break; 
                    case 3 + 4: 
                        printf("★"); 
                        break; 
                    default: 
                        break; 
                    } 
            }
            printf("\n"); 
        } 
    }
    void heroMove() 
    { 
        // 控制人物移动 
        // 2 控制(键盘:WSAD(上下左右)) 
        // 需要从键盘获取按键(字符) 
        switch (getch())
        {
            case 'w': 
            case 'W': 
                move(-1, 0); 
                break; 
            case 's': 
            case 'S': 
                move(1, 0); 
                break; 
            case 'a': 
            case 'A': 
                move(0, -1); 
                break; 
            case 'd': 
            case 'D': 
                move(0, 1); 
                break; 
            default: 
                break; 
        } 
    }
    // 移动逻辑 参数:int X,int Y X和Y方向的偏移量 
    void move(int X,int Y) 
    { 
        // 1 找人 
        int posX = 0, posY = 0; 
        for (size_t i = 0; i < 10; i++) 
        { 
            for (size_t j = 0; j < 10; j++) 
            { 
                if (2 == map[i][j] || 2 + 4 == map[i][j]) 
                { 
                    posX = i; 
                    posY = j; 
                    break; 
                }
            } 
        }
        // 空地或成功点 map[posX][posY]:主角所在的位置 
        if (0 == map[posX + X][posY + Y] || 4 == map[posX + X][posY + Y]) 
        { 
        map[posX][posY] -= 2; 
        map[posX + X][posY + Y] += 2; 
        }
        // 箱子(将箱子从点上推走) 
        else if (3 == map[posX + X][posY + Y] || 3 + 4 == map[posX + X][posY + Y]) 
        { 
            // 箱子上面是空地或成功点 map[posX - 1][posY]: 箱子位置 
            if (0 == map[posX + (X * 2)][posY + (Y * 2)] || 4 == map[posX + (X * 2)] [posY + (Y * 2)]) 
            { 
                // 当前位置人离开 
                map[posX][posY] -= 2; 
                map[posX + X][posY + Y] += 2; 
                map[posX + X][posY + Y] -= 3; 
                map[posX + (X * 2)][posY + (Y * 2)] += 3; 
            } 
        } 
    }
    //判断胜利
    bool isWin() 
    { 
        for (size_t i = 0; i < 10; i++) 
        { 
            for (size_t j = 0; j < 10; j++) 
            { 
                if (map[i][j] == 3) 
                { 
                    return false; 
                } 
            } 
        }
        return true;
    }

    到此,关于“怎么用C语言实现推箱子”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI