欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-29 13:34:48
目录1.前言2.游戏效果展示3.项目分析4.地图实现4.1存储地图4.2打印地图5.控制角色移动5.1找到控制的角色5.2实现移动6.判断胜利总结1.前言首先推箱子是c语言的一个经典的项目,本篇文字将...

1.前言

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

2.游戏效果展示

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

3.项目分析

游戏元素:

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

游戏目的:

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

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

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

总结

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