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

目录
  • 1.前言
  • 2.游戏效果展示
  • 3.项目分析
  • 4.地图实现
    • 4.1存储地图
    • 4.2打印地图
  • 5.控制角色移动
    • 5.1找到控制的角色
    • 5.2实现移动
  • 6.判断胜利
  • 总结

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

总结

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

(0)

相关推荐

  • 用C语言实现推箱子游戏实例

    目录 前言 游戏效果图 游戏开发思路 游戏逻辑的分析 源代码实现 头文件 PushBackGame.c文件 test.c文件 总结 前言 本游戏需要用到的核心技术,如下: 二维数组分支语句 技术难点: 二维数组的应用和游戏的判断逻辑 只要会以上的技术的萌新都能做出很棒的游戏,博主本身也是一枚小白,如果源代码的某些地方有不足,请大佬在评论区指出. 游戏效果图 实际游玩效果图​​​​​ 游戏开发思路 分析游戏逻辑,再根据游戏分析游戏代码逻辑写出伪代码,再分析可能存在的问题,最后一步才是开发游戏. 游

  • C语言代码实现推箱子小游戏

    本文实例为大家分享了C语言实现推箱子小游戏的具体代码,供大家参考,具体内容如下 本次游戏是个推箱子第一关最简单的小游戏 有详细注释,下面是做出来的游戏界面 游戏操作说明和功能说明: 1.按wasd控制小人的上下左右移动. 2.按 r 重新开始游戏 3.游戏开始有操作介绍 4.游戏结束有胜利提示 游戏原理分析 1.游戏开始时的星星个数 = 箱子在星星上的个数时 , 游戏胜利. 2.按 r 键重新开始游戏, 我们需要定义一个量 map_1[8][8] 来保存游戏初始时的界面, 操作时我们将其赋值给

  • C语言系列之推箱子游戏

    本文实例为大家分享了C语言系列之推箱子游戏的具体代码,供大家参考,具体内容如下 输入WSAD控制行走,只需要把一个方向的代码写好了,剩下的是三个方向就是复制粘贴和简单的修改就可以了. #include <stdio.h> #include <conio.h> //键盘输入函数库 //0:空地 1:墙 2:箱子要放的位置 5:人与星号重叠5:箱子与星号重叠 3:人+-3 4:箱子:+-4 int map[10][10] = {1,1,1,1,1,1,1,1,1,1, 1,0,0,0,

  • C语言实现简单的推箱子游戏

    本文实例为大家分享了C语言实现简单的推箱子游戏的具体代码,供大家参考,具体内容如下 项目实现的具体方案: 先安装VS2019,后安装画图工具Easyx,安装以后就可以将推箱子中的(人物,墙壁,箱子目的地,箱子)的图片加载到程序中显示出来.游戏的实现是通过程序读取键盘中输入的字母,后控制加载到程序中的人物图片的移动实现小人的移动,通过人物图片和地板图片交换位置实现人物的行走,如果人物前面是箱子图片,箱子图片前面是地板图片,则人物图片和箱子图片一起移动,直到箱子图片前面是箱子目的地图片则箱子图片将箱

  • C语言实现推箱子功能汇总

    本文实例为大家分享了C语言实现推箱子功能的具体代码,供大家参考,具体内容如下 前言: 先说说我写推箱子小游戏的过程. 第一版:没有图形化界面,不能选关.只有推箱子的最基础功能. 第二版:增加图形化界面,但是不能选择关卡. 最终版:增加选择关卡功能.播放/关闭音乐功能.退出游戏功能,捕获鼠标功能. 首先看一下最终版效果图 功能点分析: 打开/关闭音乐和退出游戏比较简单. 打开音乐所需调用的头文件 #include <graphics.h> //调用easyx图形库时所需增加的头文件 #inclu

  • Linux下用C语言实现推箱子游戏

    前面有Linux的常用命令和vim文本编辑器还没有介绍,之后我会补上的. 今天来介绍如何用C语言写一个简单的小游戏,叫做"小老鼠推箱子".虽然游戏的编写过程不复杂,但是我觉得能够从中找到自己对于编程的不足和完善自己的编程思维是最重要的.游戏代码不多,所以直接写在一个c文件中.本人小白,有不足之处还望指教 游戏介绍 下图是游戏开始界面,$是小老鼠,#是墙,O是终点,当小老鼠把所有箱子推进终点就代表游戏通过. 游戏思维 游戏地图用一个二维数组去存储.数组中不同的值代表不同的对象(老鼠.墙.

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

    目录 1.前言 2.游戏效果展示 3.项目分析 4.地图实现 4.1存储地图 4.2打印地图 5.控制角色移动 5.1找到控制的角色 5.2实现移动 6.判断胜利 总结 1.前言 首先推箱子是c语言的一个经典的项目,本篇文字将会介绍如何从零开始实现c语言如何实现推箱子 2.游戏效果展示 3.项目分析 游戏元素: 空地 0 墙壁 1 角色 2 箱子 3 胜利点 4 游戏目的: 玩家控制角色在地图的空地上进行移动,通过推动箱子躲避障碍,将所有的箱子推至胜利点即可成功. 4.地图实现 4.1存储地图

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

    目录 1.前言 2.地图代码修改成函数 3.角色移动修改成函数 3.1寻找角色函数 3.2角色移动函数 4.判断胜利修改成函数 5.主体函数的实现 6.推箱子能实现基本功能的源码 总结 1.前言 本文章将承接着上面的文章(上篇文章的地址),继续对推箱子的代码进行修改和完善,对上面杂乱的代码进行修改成函数. 2.地图代码修改成函数 注意:每次打印地图的时候要在前面加入system("cls")语句来清除刷新地图,该方法需要用到#include <Windows.h>的头文件.

  • 详解C语言函数返回值解析

    详解C语言函数返回值解析 程序一: int main() { int *p; int i; int*fun(void); p=fun(); for(i=0;i<3;i++) { printf("%d\n",*p); p++; } return 0; }; int* fun(void) { static int str[]={1,2,3,4,5}; int*q=str; return q; } //不能正确返回 虽然str是在动态变量区,而该动态变量是局部的,函数结束时不保留的.

  • 详解C语言 三大循环 四大跳转 和判断语句

    三大循环for while 和 do{ }while; 四大跳转 : 无条件跳转语句 go to; 跳出循环语句 break; 继续跳出循环语句 continue; 返回值语句 return 判断语句 if,if else,if else if else if...else ifelse 组合 if(0 == x) if(0 == y) error(): else{ //program code } else到底与那个if配对 C语言有这样的规定: else 始终与同一括号内最近的未匹配的if语

  • 详解C语言gets()函数与它的替代者fgets()函数

    在c语言中读取字符串有多种方法,比如scanf() 配合%s使用,但是这种方法只能获取一个单词,即遇到空格等空字符就会返回.如果要读取一行字符串,比如: I love BIT 这种情况,scanf()就无能为力了.这时我们最先想到的是用gets()读取. gets()函数从标准输入(键盘)读入一行数据,所谓读取一行,就是遇到换行符就返回.gets()函数并不读取换行符'\n',它会吧换行符替换成空字符'\0',作为c语言字符串结束的标志. gets()函数经常和puts()函数配对使用,puts

  • 详解C 语言项目中.h文件和.c文件的关系

    详解C 语言项目中.h文件和.c文件的关系 在编译器只认识.c(.cpp))文件,而不知道.h是何物的年代,那时的人们写了很多的.c(.cpp)文件,渐渐地,人们发现在很多.c(.cpp)文件中的声明语句就是相同的,但他们却不得不一个字一个字地重复地将这些内容敲入每个.c(.cpp)文件.但更为恐怖的是,当其中一个声明有变更时,就需要检查所有的.c(.cpp)文件. 于是人们将重复的部分提取出来,放在一个新文件里,然后在需要的.c(.cpp)文件中敲入#include XXXX这样的语句.这样即

  • 详解C语言用malloc函数申请二维动态数组的实例

    详解C语言用malloc函数申请二维动态数组的实例 C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单. Sample one #include <stdio.h> int main() { char * p=(char *)malloc(sizeof(char)*5);//申请包含5个字符型的数组 free(p); return 0; } 是否申请二维动态内存也如此简单呢?答案是否定的.申请二维数组有一下几种方法 Sample two /* 申请一个5行3列的字符型

  • C语言实现推箱子小游戏

    本文实例为大家分享了C语言实现推箱子游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<string.h> #include<stdlib.h> #define N 1000 /* r目的地 o箱子 i人 x墙 路(空格) w上 a左 d右 s下 */ void menu(); int level1(); int level2(); void swap(char*,char*); int opera(char *p,int *

  • 基于C语言实现推箱子游戏

    本文实例为大家分享了C语言实现推箱子游戏的具体代码,供大家参考,具体内容如下 代码在vs2013上测试运行. 思想: 1):地图用二维数组实现,箱子.墙壁.人等事物用不同的数字表示,遍历二维数组,遇到不同的数字打印相应的图案即可. 2):按键移动原理:判断要移动的方向是怎样的障碍物,如果理论上可以移动的话,只需把对应位置的数字作相应更改即可. #include<stdio.h> #include<stdlib.h> #include<windows.h> #includ

  • 详解易语言的程序的输入方法概念

    为了便于输入程序,易语言内置四种名称输入法:首拼.全拼.双拼.英文.三种拼音输入法均支持南方音及多音字.首拼输入法及全拼输入法在系统中被合并为"首拼及全拼输入法",系统自动判别所输入的拼音是首拼方式还是全拼方式.双拼输入法的编码规则与 Windows 系统所提供的双拼输入法一致.例如:欲输入"取整 (1.23)"语句,各种输入法的输入文本为: ・ 首拼及全拼输入法: qz(1.23) 或者 quzheng(1.23) ・ 双拼输入法: quvg(1.23) ・ 英文

随机推荐