(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)

之前做了很多与easyx相关的游戏,这次我们之间用控制台做游戏试试看吧

就以推箱子游戏为例

首先就是引用头文件

#include<stdio.h>
#include<conio.h>//按键控制 
#include<stdlib.h>

然后就是要定义相关变量,在推箱子游戏中,涉及到的元素有

//空地 0 墙 1 目的地 2 箱子 3 玩家 4
#define SPACE 0
#define WALL 1
#define DEST 2
#define BOX 3
#define PLAYER 4

因为控制台程序没有easyx图形库的坐标那样方便, 我们要想绘制图形,只能用二维数组来实现

//制作基本框架

int map[10][10] =
{
    0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,1,1,1,0,0,0,
    0,0,0,0,1,2,1,0,0,0,
    0,0,0,1,1,0,1,0,0,0,
    0,1,1,1,0,3,1,1,1,0,
    0,1,2,0,3,4,3,2,1,0,
    0,1,1,1,1,3,1,1,1,0,
    0,0,0,0,1,2,1,0,0,0,
    0,0,0,0,1,1,1,0,0,0,
    0,0,0,0,0,0,0,0,0,0,
};

为了便于变量的运算,我们这里将变量i,k作为全局变量

int i = 0;
int k = 0;

接下来就是图像的绘制了,如果只是用1234来表示图形未免太抽象了吧O(∩_∩)O哈哈~

void draw()//画基本框架
{
    for (int i = 0; i < 10; i++)
    {
        for (int k = 0; k < 10; k++)
        {
            switch (map[i][k])
            {
            case SPACE:
                printf("  ");
                break;
            case WALL:
                printf("l ");
                break;
            case DEST:
                printf("* ");
                break;
            case BOX:
                printf("& ");
                break;
            case PLAYER:
                printf("@ ");
                break;
            case BOX + DEST://箱子与目的地相碰后变成另一个字符
                printf("# ");
            }
        }
        printf("\n");
    }
}

画完基本框架,接下来就是对玩家进行移动

首先要先找到玩家的位置,才能对玩家进行移动,找到以后,用goto函数跳出循环

这里以向上为例:当玩家向上移动时,首先要判断玩家是否能移动,如果玩家的上面是墙,就不能移动,如果玩家的上面是箱子或者是空地,就可以移动,当玩家上面是箱子时,在玩家向上移动的同时,箱子也要跟着向上移动,当箱子上面也是墙时,箱子和玩家都不能再向上移动

getch使计算机可以直接读取键盘,这个在我之前的游戏中都有讲到。

void move()//移动
{
    
    //先找到玩家
    for (i = 0; i < 10; i++)
    {
        for (k = 0; k < 10; k++)
        {
            if (map[i][k] == PLAYER)
            {
                goto end;
            }
        }
    }
end:;
    char key = _getch();
    switch (key)
    {
    case'W':
    case'w':
    case 72://上
        //先判断玩家能不能动,玩家的前面是空地或者箱子才能动
        if (map[i - 1][k] == SPACE || map[i - 1][k] == DEST)
        {
            //先把人物移动到前面,再把原来的消除
            map[i - 1][k] += PLAYER;
            map[i][k] -= PLAYER;
        }
        //玩家前面是箱子
        else if (map[i - 1][k] == BOX || map[i - 1][k] == BOX + DEST)
        {
            //箱子是否可以动
            if (map[i - 2][k] == SPACE || map[i - 2][k] == DEST)
            {
                map[i - 2][k] += BOX;//移动箱子到前面
                map[i - 1][k] -= BOX;//取消原来的箱子
                map[i - 1][k] += PLAYER;
                map[i][k] -= PLAYER;
            }
        }
        break;
    case'S':
    case's':
    case 80://下
        //先判断玩家能不能动,玩家的前面是空地或者箱子才能动
        if (map[i+1][k] == SPACE || map[i+1][k] == DEST)
        {
            //先把人物移动到前面,再把原来的消除
            map[i+1][k] += PLAYER;
            map[i][k] -= PLAYER;
        }
        //玩家前面是箱子
        else if (map[i+1][k] == BOX || map[i+1][k] == BOX + DEST)
        {
            //箱子是否可以动
            if (map[i+2][k] == SPACE || map[i+2][k] == DEST)
            {
                map[i+2][k] += BOX;//移动箱子到前面
                map[i+1][k] -= BOX;//取消原来的箱子
                map[i+1][k] += PLAYER;
                map[i][k] -= PLAYER;
            }
        }
        break;
    case'A':
    case'a':
    case 75://左
        if (map[i][k - 1] == SPACE || map[i][k - 1] == DEST)
        {
            //先把人物移动到前面,再把原来的消除
            map[i][k - 1] += PLAYER;
            map[i][k] -= PLAYER;
        }
        else if (map[i][k - 1] == BOX || map[i][k - 1] == BOX + DEST)
        {
            if (map[i][k - 2] == SPACE || map[i][k - 2] == DEST)
            {
                map[i][k - 2] += BOX;//移动箱子到前面
                map[i][k - 1] -= BOX;//取消原来的箱子
                map[i][k - 1] += PLAYER;
                map[i][k] -= PLAYER;
            }
        }
        break;
    case'D':
    case'd':
    case 77://右
        if (map[i][k + 1] == SPACE || map[i][k + 1] == DEST)
        {
            map[i][k + 1] += PLAYER;
            map[i][k] -= PLAYER;
        }
        else if (map[i][k + 1] == BOX|| map[i][k + 1]==BOX+DEST)
        {
            if (map[i][k + 2] == SPACE || map[i][k + 2] == DEST)
            {
                map[i][k + 2] += BOX;
                map[i][k + 1] -= BOX;
                map[i][k + 1] += PLAYER;
                map[i][k] -= PLAYER;
            }
        }
        break;
    }
}

接下来就是要判断是否通关

//判断是否通关
int jude()
{
    for (int i = 0; i < 10; i++)
    {
        for (int k = 0; k < 10; k++)
        {
            if (map[i][k] == BOX)
            {
                return 0;
            }
        }
    }
    return 1;
}

最后将其全部输入主函数中

int main()
{
    while (1)
    {
        system("cls");
        draw();
        if (jude())
        {
            printf("通关");
            return 0;
        }
        move();
    }
    return 0;
}

具体代码如下,如果大家发现bug或者有更好的方法 ,欢迎大家一起来讨论,一起加油吧

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<conio.h>//按键控制
#include<stdlib.h>
//空地 0 墙 1 目的地 2 箱子 3 玩家 4
#define SPACE 0
#define WALL 1
#define DEST 2
#define BOX 3
#define PLAYER 4
//推箱子需要通过二维数组实现
//初始化变量,制作基本框架
int map[10][10] =
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0,1,1,1,0,3,1,1,1,0,0,1,2,0,3,4,3,2,1,0,0,1,1,1,1,3,1,1,1,0,0,0,0,0,1,2,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
};
int i = 0;
int k = 0;
void draw()//画基本框架
{for (int i = 0; i < 10; i++){for (int k = 0; k < 10; k++){switch (map[i][k]){case SPACE:printf("  ");break;case WALL:printf("l ");break;case DEST:printf("* ");break;case BOX:printf("& ");break;case PLAYER:printf("@ ");break;case BOX + DEST:printf("# ");}}printf("\n");}
}
void move()//移动
{//先找到玩家for (i = 0; i < 10; i++){for (k = 0; k < 10; k++){if (map[i][k] == PLAYER){goto end;}}}
end:;char key = _getch();switch (key){case'W':case'w':case 72://上//先判断玩家能不能动,玩家的前面是空地或者箱子才能动if (map[i - 1][k] == SPACE || map[i - 1][k] == DEST){//先把人物移动到前面,再把原来的消除map[i - 1][k] += PLAYER;map[i][k] -= PLAYER;}//玩家前面是箱子else if (map[i - 1][k] == BOX || map[i - 1][k] == BOX + DEST){//箱子是否可以动if (map[i - 2][k] == SPACE || map[i - 2][k] == DEST){map[i - 2][k] += BOX;//移动箱子到前面map[i - 1][k] -= BOX;//取消原来的箱子map[i - 1][k] += PLAYER;map[i][k] -= PLAYER;}}break;case'S':case's':case 80://下//先判断玩家能不能动,玩家的前面是空地或者箱子才能动if (map[i+1][k] == SPACE || map[i+1][k] == DEST){//先把人物移动到前面,再把原来的消除map[i+1][k] += PLAYER;map[i][k] -= PLAYER;}//玩家前面是箱子else if (map[i+1][k] == BOX || map[i+1][k] == BOX + DEST){//箱子是否可以动if (map[i+2][k] == SPACE || map[i+2][k] == DEST){map[i+2][k] += BOX;//移动箱子到前面map[i+1][k] -= BOX;//取消原来的箱子map[i+1][k] += PLAYER;map[i][k] -= PLAYER;}}break;case'A':case'a':case 75://左if (map[i][k - 1] == SPACE || map[i][k - 1] == DEST){//先把人物移动到前面,再把原来的消除map[i][k - 1] += PLAYER;map[i][k] -= PLAYER;}else if (map[i][k - 1] == BOX || map[i][k - 1] == BOX + DEST){if (map[i][k - 2] == SPACE || map[i][k - 2] == DEST){map[i][k - 2] += BOX;//移动箱子到前面map[i][k - 1] -= BOX;//取消原来的箱子map[i][k - 1] += PLAYER;map[i][k] -= PLAYER;}}break;case'D':case'd':case 77://右if (map[i][k + 1] == SPACE || map[i][k + 1] == DEST){map[i][k + 1] += PLAYER;map[i][k] -= PLAYER;}else if (map[i][k + 1] == BOX|| map[i][k + 1]==BOX+DEST){if (map[i][k + 2] == SPACE || map[i][k + 2] == DEST){map[i][k + 2] += BOX;map[i][k + 1] -= BOX;map[i][k + 1] += PLAYER;map[i][k] -= PLAYER;}}break;}
}
//判断是否通关
int jude()
{for (int i = 0; i < 10; i++){for (int k = 0; k < 10; k++){if (map[i][k] == BOX){return 0;}}}return 1;
}
int main()
{while (1){system("cls");draw();if (jude()){printf("通关");return 0;}move();}return 0;
}

c语言小游戏-推箱子相关推荐

  1. C语言小游戏 ——推箱子

    文章目录 (1)内容描述 (2)功能 (3)设计目的 (4)总体设计 (5)明显缺点 (6)个人总结 7. 实例 实例一 实例二 实例三 实例四 实例五: (1)内容描述 描述:用户进入页面后可以进行 ...

  2. 用JAVA制作小游戏——推箱子(三)

    本篇博客主要是对推箱子地图编辑器功能的代码讲解. 首先给出这段代码的部分运行截图: 重难点: 地图编辑器主要有三个重难点: 需要有一个绘制地图的界面 能够实现地图绘制的功能 地图绘制完成后需要将地图内 ...

  3. 用JAVA制作小游戏——推箱子(二)

    本篇博客主要是推箱子游戏界面功能的代码讲解. 首先先给出这段代码的部分运行截图: 重难点: 游戏界面主要有五个重难点: 固定好地图的位置 地图的显示 构建菜单栏 读取地图数据 玩家操作功能实现 地图的 ...

  4. 用JAVA制作小游戏——推箱子(一)

    本篇博客是对推箱子游戏首页代码的展示 效果图: 难点: 在背景图上添加按钮. 由于直接使用add方法,会变成图片一块区域,按钮一块区域,彼此互不重叠,形成的界面效果不太好,因此用了JLayeredPa ...

  5. c语言写一个简单的小游戏-推箱子

    在学习C语言之后,写了一个简单的小游戏来锻炼自己的代码以及C语言知识的掌握能力. 推箱子作为手机上最常见的简单游戏,其代码也相对简单,想法也比较简单,下面为其代码和运行图. /************ ...

  6. 一个简单的c 游戏编程语言,编程达人 c语言写一个简单的小游戏-推箱子

    在学习C语言之后,写了一个简单的小游戏来锻炼自己的代码以及C语言知识的掌握能力. 推箱子作为手机上最常见的简单游戏,其代码也相对简单,想法也比较简单,下面为其代码和运行图. /************ ...

  7. 用C语言写一个可以选择关卡添加关卡的小游戏,推箱子

    目录 关于用C语言写一个可以选择关卡的小游戏 代码部分 所有代码 Tui_Xiang_Zi.h Tui_Xiang_Zi.cpp 关卡数据 关卡数据规则 思路和建议 建议 警告 关于用C语言写一个可以 ...

  8. Java小游戏-推箱子

    摘要 推箱子是来自于日本的一个古老游戏,目的是在于训练逻辑思维能力,在一个狭小的空间里,要把木箱推到指定的位置,稍不小心箱子就会无法移动或者被通道堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安 ...

  9. Python游戏开发,Python实现童年小游戏推箱子 附带源码

    开发工具 Python版本: 3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 上效果图 原理简 ...

最新文章

  1. AJAX跨域访问解决方案
  2. 30个精美的模板,贺卡,图形圣诞素材
  3. 局域网上传文件到服务器很慢,win10局域网内传文件很慢怎么办_win10局域网内文件传输很慢如何处理-win7之家...
  4. [BZOJ 1124][POI 2008] 枪战 Maf
  5. ITK:在傅立叶域中过滤图像
  6. hubbledotnet 查询提示:已添加了具有相同键的项
  7. 天国近了(一) -- 揭穿OOP神话
  8. java netty 面试_Java 200+ 面试题补充② Netty 模块
  9. vs2013 使用vs调试器,发现调试器显示的数据错误。查看内存,发现内存是正确的。...
  10. [编写高质量代码:改善java程序的151个建议]建议66 asList方法产生的List对象不可更改...
  11. stm32_跑马灯程序
  12. KVM虚拟化技术原理简介
  13. GRPC入门使用及测试用例源码
  14. linux命令行 teamview,linux下安装team viewer的方法
  15. 3、那智机器人手柄各操作键的功能
  16. DDR中的一些知识点说明(ODT,ZQ校准,OCT,TDQS)
  17. fnl+wrf 报错记录
  18. 用CSS画小猪佩奇,你就是下一个社会人! js将“I am a coder”反转成 “coder a am I”,不许用split,join,subString,reverse;求解方法三...
  19. vue+openlayers添加点击事件进行图片标记
  20. SpringCloud的五大神兽的详细配置

热门文章

  1. CSS - 浮动布局(float)
  2. python二级练习软件(90%原题)题库、三天速成。
  3. 粉丝裂变这么简单,99%的人都不知道
  4. php综合复习题大全(上)——基础篇
  5. 基于FPGA数字示波器显示部分
  6. 帮一个锻造企业写的“关于该公司的网络推广相关”的问题
  7. Oracle 多表查询与集合运算
  8. 如何分析处理32亿条实时日志的?
  9. 诺基亚x6老是自动关机怎么办
  10. 收藏提高Web性能的14条法则(详细版)