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

目录
  • 1.前言
  • 2.地图代码修改成函数
  • 3.角色移动修改成函数
    • 3.1寻找角色函数
    • 3.2角色移动函数
  • 4.判断胜利修改成函数
  • 5.主体函数的实现
  • 6.推箱子能实现基本功能的源码
  • 总结

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

总结

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

(0)

相关推荐

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

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

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

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

  • C语言 完整游戏项目推箱子详细代码

    话不多说 我们今天就来创造出属于我们自己的<推箱子>,GOGOGO!!! 直接开始吧 首先是我们用二维数组特定的数字描绘出这个地图 int cas = 0; int map[3][8][8] = { 1,1,1,1,1,1,1,1, 1,3,4,0,0,4,3,1, 1,0,1,3,0,1,0,1, 1,0,1,4,0,1,0,1, 1,0,0,5,0,0,0,1, 1,0,1,0,0,1,0,1, 1,3,4,0,0,4,3,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1

  • 详解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语言系列之推箱子游戏

    本文实例为大家分享了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语言实现推箱子的基本功能(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) ・ 英文

随机推荐