详解C语言实现推箱子的基本功能(2)

 更新时间:2022年2月18日 15:43  点击:275 作者:D_eretay

1.前言

本文章将承接着上面的文章(上篇文章的地址),继续对推箱子的代码进行修改和完善,对上面杂乱的代码进行修改成函数。

2.地图代码修改成函数

注意:每次打印地图的时候要在前面加入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两个条件即可,具体代码如最后源码所示。

3.角色移动修改成函数

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

3.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; 
        } 
    } 
}

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; 
    } 
}

4.判断胜利修改成函数

这里用到了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;
}

5.主体函数的实现

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

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

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

#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;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注猪先飞的更多内容!   

原文出处:https://blog.csdn.net/qq_62743629/article/details/122980690

[!--infotagslink--]

相关文章