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

 更新时间:2022年2月17日 19:19  点击:309 作者:D_eretay

1.前言

首先推箱子是c语言的一个经典的项目,本篇文字将会介绍如何从零开始实现c语言如何实现推箱子

2.游戏效果展示

3.项目分析

游戏元素:

  • 空地 0
  • 墙壁 1
  • 角色 2
  • 箱子 3
  • 胜利点 4

游戏目的:

玩家控制角色在地图的空地上进行移动,通过推动箱子躲避障碍,将所有的箱子推至胜利点即可成功。

4.地图实现

4.1存储地图

首先存储地图我们使用数组来进行存储,为什么我们会用到char而不是int?是因为int普遍为4字节,char为1字节,我们就可以大大减少存储地图所需要的内存。如果要写多张地图的话,仅仅将数组扩充至三维即可,作者将会在之后的文章进行说明。

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, 0, 0, 1, 1, 0, 0, 1 }, 
    { 1, 0, 0, 0, 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 } 
};

4.2打印地图

对应地图的打印我们则需要对地图进行遍历,利用switch语句将地图打印在控制台上面。

for (size_t i = 0; i < 10; i++) 
{ 
    for (size_t j = 0; j < 10; 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"); 
}

5.控制角色移动

5.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; 
            //找到角色,记录其所在的x轴和y轴的坐标
        } 
    } 
} 

5.2实现移动

// 控制(键盘:WSAD(上下左右)) 
// 需要从键盘获取按键(字符) 
switch (getch()) // getch()该方法需要在开头导入#include <conio.h>
{
    case 'w': 
    case 'W': 
        printf("向上\n"); 
        /*
        向上逻辑: 
        改变数组元素的值 
        以人为参考 
        上面可能是: 
        空地 移动 
        墙壁 不动 
        成功点 移动 
        箱子 判断箱子上面是个啥 
        空地 移动 
        成功点 移动 
        墙壁 不动 
        另一个箱子 不动 
        */
        // 上面是空地或成功点 map[posX][posY]:主角所在的位置 
        if (0 == map[posX - 1][posY] || 4 == map[posX - 1][posY]) 
        { 
            // 当前位置人离开 
            map[posX][posY] -= 2; 
            // 上面位置人过来 
            map[posX - 1][posY] += 2; 
        }
        // 上面是箱子(将箱子从点上推走) 
        else if (3 == map[posX - 1][posY] || 3 + 4 == map[posX - 1][posY]) 
        { 
            // 箱子上面是空地或成功点 map[posX - 1][posY]: 箱子位置 
            if (0 == map[posX - 2][posY] || 4 == map[posX - 2][posY]) 
            { 
                // 当前位置人离开 
                map[posX][posY] -= 2; 
                // 上面位置人过来 
                map[posX - 1][posY] += 2; 
                // 上面位置箱子离开 
                map[posX - 1][posY] -= 3; 
                // 上面的上面箱子过来 
                map[posX - 2][posY] += 3; 
            } 
        }
        break; 
    case 's': 
    case 'S': 
        printf("向下\n"); 
        break; 
    case 'a': 
    case 'A': 
        printf("向左\n"); 
        break; 
    case 'd': 
    case 'D': 
        printf("向右\n"); 
        break; 
    default: 
        break; 
}

6.判断胜利

对地图遍历搜索,如果发现没有箱子的话,就可以判断为胜利。(size_t是C++里面的东西,size_t相当于unsigned int,这里仅做理解即可,可以用int来代替size_t)

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/122971880

[!--infotagslink--]

相关文章