千家信息网

怎么用C语言实现推箱子

发表于:2025-02-22 作者:千家信息网编辑
千家信息网最后更新 2025年02月22日,这篇文章主要介绍"怎么用C语言实现推箱子",在日常操作中,相信很多人在怎么用C语言实现推箱子问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"怎么用C语言实现推箱子"的疑惑
千家信息网最后更新 2025年02月22日怎么用C语言实现推箱子

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

    地图代码修改成函数

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

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

    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  #include  #include  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语言实现推箱子"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

    0