C语言实现推箱子小游戏

2023-11-19

一、设计目的

  1. 用简单的C语言知识制作的推箱子游戏,通过上下左右键将所有箱子移动到目标位置。

2.让我们更好地了解和巩固C语言知识,并实际运用,同时运用一些不太常见的知识点。

二、功能描述

1.模块功能

本程序可分为初始界面、进行游戏、判定通关三个模块。

  1. 初始界面模块:欢迎来到推箱子游戏,按方向键上下左右,可以实现方向,按->键进行游戏。

  1. 进行游戏:通过上下左右键控制人的上下左右来移动箱子,箱子只能向前推,不能向后面拉,游戏分为两关,完成第一关,按->建可进入下一关。

  1. 判定输赢模块:当所有箱子都推到目的地时,则游戏过关。当两关都通过时,会提示”恭喜你过关了”。

  1. 流程图

三.总体设计

(一)使用到的头文件

#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>

以上为本程序中所用到的头文件,#include<stdio.h>是c语言进行输入输出的头文件,#include<string.h>调用memcpy(map,temp,sizeof(temp))将临时数组赋值给map,

#include<conio.h>,调用_getch()获取按键操作,#include<stdlib.h>头文件调用system(“cls”)进行清屏操作。

(二)宏定义

//宏定义数据
#define SPACE 0 //空地
#define WALL  1 //墙
#define DEST  2 //目的地
#define BOX   3 //箱子
#define PLAYER 4 //玩家
#define ROW   10 //行数
#define COL   10 //列数

#define 是宏定义,在程序预处理阶段将define定义的内容进行了替换,可以增加代码可读性

(三)初始界面

void menu()
{
    printf("*********欢迎来到推箱子小游戏**********\n");
    printf("***按方向键上下左右,可以实现移动方向***\n");
    system("pause");
}

Menu()函数里写好初始界面,并用system(“pause”)暂停程序,点任意键继续,进入游戏。

功能模块设计

创建并绘制地图:用 代表空地,■代表墙,☆代表目的地,★代表箱子,人字代表人,进代表到达目的地的箱子。在此基础上用数组储存数据,三维数组来创建两个不同的地图,并通过图标代替数字实现地图绘制。

(四)初始化地图

//数组储存数据
//定义地图
int map[2][ROW][COL];
int level = 0;//当前所在关
//初始化地图
void initMap()
{
    //临时数组
    int temp[2][ROW][COL] =
    {
        {
        {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,0,1,0,1,1,1,1,0},
        {0,1,1,1,3,3,0,2,1,0},
        {0,1,2,3,4,0,1,1,1,0},
        {0,1,1,1,1,3,1,0,0,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}
        },
        {
            {0,0,0,0,0,0,0,0,0,0},
            {0,0,1,1,0,0,1,1,0,0},
            {0,1,0,0,1,1,0,0,1,0},
            {1,0,2,0,0,0,0,2,0,1},
            {1,0,0,3,4,0,3,0,0,1},
            {0,1,0,3,0,0,3,0,1,0},
            {0,0,1,0,2,2,0,1,0,0},
            {0,0,0,1,0,0,1,0,0,0},
            {0,0,0,0,1,1,0,0,0,0},
            {0,0,0,0,0,0,0,0,0,0}
}
    };
    //把临时的数组赋值给map
    memcpy(map, temp, sizeof(temp));
}

1.map[2][ROW][COL](ROW==10,COL==10)三维数组可有效实现多关卡设置,游戏设置了两个关卡。

2.void initMap()

此函数用来初始化地图,并定义了一个临时数组来绘制地图结构,并调用memcpy()函数赋值给map数组。

3.memcpy函数实现赋值操作(在程序中要引用#include<string.h>头文件)

(五)输出地图

void show()
{
    system("cls");//清屏
    for (int i = 0; i < ROW; i++)
    {
        for (int j = 0; j < COL; j++)
        {
            //把数据转为图形输出
            switch (map[level][i][j])
            {
            case SPACE:
                printf("  ");
                break;
            case WALL:
                printf("■");
                break;
            case DEST:
                printf("☆");
                break;
            case BOX:
                printf("★");
                break;
            case PLAYER:
                printf("人");
                break;
            case BOX + DEST://箱子在目的地上
                printf("进");
                break;
            }
        }
        printf("\n");
    }
}

void show()此函数内运用for循环和switch分支结构来绘制地图,将数据用指定图标代替,使地图更具有可观性。

(六)移动操作:通过人或人和箱子的移动来进行,系统接受用户输入的一个字符(按键)来控制人的走向 ,在允许的条件下推动箱子。

void move()
{
    int r = -1, c = -1;
    //查找玩家的位置并复制给r c
    for (int i = 0; i < ROW; i++)
    {
        for (int j = 0; j < COL; j++)
        {
            if (map[level][i][j] == PLAYER || map[level][i][j] == PLAYER + DEST)
            {
                r = i;
                c = j;
                goto end;
            }
        }
    }
end:;
    //获取按键操作
    int key = _getch();
    switch (key)
    {
    case 'W':
    case 'w':
    case 72://上
        //只有人前面是空地或者目的地的时候才可以移动
        //  r c 是玩家当前所在的下标
        if (map[level][r - 1][c] == SPACE || map[level][r - 1][c] == DEST)
        {
            map[level][r - 1][c] += PLAYER;
            map[level][r][c] -= PLAYER;
        }
        else if (map[level][r - 1][c] == BOX)
        {//箱子前面是空地或者是目的地
            if (map[level][r - 2][c] == SPACE || map[level][r - 2][c] == DEST)
            {
                //先把箱子移动到指定位置
                map[level][r - 2][c] += BOX;
                //把箱子从原来的位置删除
                map[level][r - 1][c] -= BOX;
                //把玩家移动到箱子的位置
                map[level][r - 1][c] += PLAYER;
                //把玩家从原来的位置删除
                map[level][r - 1][c] -= PLAYER;
            }
        }
        break;
    case 80://下
        if (map[level][r + 1][c] == SPACE || map[level][r + 1][c] == DEST)
        {
            map[level][r + 1][c] += PLAYER;
            map[level][r][c] -= PLAYER;
        }
        else if (map[level][r + 1][c] == BOX || map[level][r + 1][c] == DEST)
        {//箱子前面是空地或者是目的地
            if (map[level][r + 2][c] == SPACE || map[level][r + 2][c] == DEST)
            {
                //先把箱子移动到指定位置
                map[level][r + 2][c] += BOX;
                //把箱子从原来的位置删除
                map[level][r + 1][c] -= BOX;
                //把玩家移动到箱子的位置
                map[level][r + 1][c] += PLAYER;
                //把玩家从原来的位置删除
                map[level][r][c] -= PLAYER;
            }
        }
        break;
    case 75://左
        if (map[level][r][c - 1] == SPACE || map[level][r][c - 1] == DEST)
        {
            map[level][r][c - 1] += PLAYER;
            map[level][r][c] -= PLAYER;
        }
        else if (map[level][r][c - 1] == BOX)
        {//箱子前面是空地或者是目的地
            if (map[level][r][c - 2] == SPACE || map[level][r][c - 2] == DEST)
            {
                //先把箱子移动到指定位置
                map[level][r][c - 2] += BOX;
                //把箱子从原来的位置删除
                map[level][r][c - 1] -= BOX;
                //把玩家移动到箱子的位置
                map[level][r][c - 1] += PLAYER;
                //把玩家从原来的位置删除
                map[level][r][c] -= PLAYER;
            }
        }
        break;
    case 77:
        if (map[level][r][c + 1] == SPACE || map[level][r][c + 1] == DEST)
        {
            map[level][r][c + 1] += PLAYER;
            map[level][r][c] -= PLAYER;
        }
        else if (map[level][r][c + 1] == BOX)
        {//箱子前面是空地或者是目的地
            if (map[level][r][c + 2] == SPACE || map[level][r][c + 2] == DEST)
            {
                //先把箱子移动到指定位置
                map[level][r][c + 2] += BOX;
                //把箱子从原来的位置删除
                map[level][r][c + 1] -= BOX;
                //把玩家移动到箱子的位置
                map[level][r][c + 1] += PLAYER;
                //把玩家从原来的位置删除
                map[level][r][c] -= PLAYER;
            }
        }
        break;
    }
}

void move():先运用for循环遍历数组来定位人物的位置,定位好之后,我们可以将玩家的值赋值给r,c,找到玩家的位置。在人物移动时我们运用到了switch循环和if循环。先用switch循环判定得到key的值,此值可以确定按键操作方向,我们可以在此基础上对人物进行移动再运用if结构对人物移动或人物移动带动箱子的移动进行判定,将人(箱子)移动到指定位置,再进行删除人(箱子)原来的位置,运用goto语句到指定语句,以此,我们能实现箱子的连贯性移动。

(七)判定通关:当箱子全部达到目的地,最后提示恭喜你过关了,判定通关。

//判断什么情况下过关
int judge()
{
    for (int i = 0; i < ROW; i++)
    {
        for (int j = 0; j < COL; j++)
        {
            if (map[level][i][j] == BOX)
            {
                return 0;
            }
        }
    }
    return 1;
}

1.int judge():函数内通过for循环和if结构判断途中是否还有箱子,并通过return返回0或1,1表示过关。

2.system("cls"):清屏操作。

四、游戏测试

//(完整代码)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdbool.h>
#include<stdlib.h>
//宏定义数据
#define SPACE 0 //空地
#define WALL  1 //墙
#define DEST  2 //目的地
#define BOX   3 //箱子
#define PLAYER 4 //玩家
#define ROW   10 //行数
#define COL   10 //列数
void menu()
{
    printf("*********欢迎来到推箱子小游戏**********\n");
    printf("***按方向键上下左右,可以实现移动方向***\n");
    system("pause");
}
//数组储存数据
//定义地图
int map[2][ROW][COL];
//初始化地图
int level = 0;//当前所在关
void initMap()
{
    //临时数组
    int temp[2][ROW][COL] =
    {
        {
        {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,0,1,0,1,1,1,1,0},
        {0,1,1,1,3,3,0,2,1,0},
        {0,1,2,3,4,0,1,1,1,0},
        {0,1,1,1,1,3,1,0,0,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}
        },
        {
            {0,0,0,0,0,0,0,0,0,0},
            {0,0,1,1,0,0,1,1,0,0},
            {0,1,0,0,1,1,0,0,1,0},
            {1,0,2,0,0,0,0,2,0,1},
            {1,0,0,3,4,0,3,0,0,1},
            {0,1,0,3,0,0,3,0,1,0},
            {0,0,1,0,2,2,0,1,0,0},
            {0,0,0,1,0,0,1,0,0,0},
            {0,0,0,0,1,1,0,0,0,0},
            {0,0,0,0,0,0,0,0,0,0}
}
    };
    //把临时的数组赋值给map
    memcpy(map, temp, sizeof(temp));
}
//输出地图
void show()
{
    system("cls");//清屏
    for (int i = 0; i < ROW; i++)
    {
        for (int j = 0; j < COL; j++)
        {
            //printf("%d", map[level][i][j]);
            //把数据转为图形输出  墙,人
            switch (map[level][i][j])
            {
            case SPACE:
                printf("  ");
                break;
            case WALL:
                printf("■");
                break;
            case DEST:
                printf("☆");
                break;
            case BOX:
                printf("★");
                break;
            case PLAYER:
                printf("人");
                break;
            case PLAYER+DEST:
                printf("出");
                break;
            case BOX + DEST://箱子在目的地上//玩家站在空地上
                printf("进");
                break;
            }
        }
        printf("\n");
    }
}
void move()
{
    int r = -1, c = -1;
    //查找玩家的位置并复制给r c
    for (int i = 0; i < ROW; i++)
    {
        for (int j = 0; j < COL; j++)
        {
            if (map[level][i][j] == PLAYER|| map[level][i][j] == PLAYER+DEST)
            {
                r = i;
                c = j;
                goto end;
            }
        }
    }
end:;
    //获取按键操作
    int key = _getch();
    switch (key)
    {
    case 72://上
        //只有人前面是空地或者目的地的时候我才可以移动
        //  r c 是玩家当前所在的下标
        if (map[level][r - 1][c] == SPACE || map[level][r - 1][c] == DEST)
        {
            map[level][r - 1][c] += PLAYER;
            map[level][r][c] -= PLAYER;
        }
        else if (map[level][r - 1][c] == BOX)
        {//箱子前面是空地或者是目的地
            if (map[level][r - 2][c] == SPACE || map[level][r - 2][c] == DEST)
            {
                //先把箱子移动到指定位置
                map[level][r - 2][c] += BOX;
                //把箱子从原来的位置删除
                map[level][r - 1][c] -= BOX;
                //把玩家移动到箱子的位置
                map[level][r - 1][c] += PLAYER;
                //把玩家从原来的位置删除
                map[level][r - 1][c] -= PLAYER;
            }
        }
        break;
    case 80://下
        if (map[level][r + 1][c] == SPACE || map[level][r + 1][c] == DEST)
        {
            map[level][r + 1][c] += PLAYER;
            map[level][r][c] -= PLAYER;
        }
        else if (map[level][r + 1][c] == BOX || map[level][r + 1][c] == DEST)
        {//箱子前面是空地或者是目的地
            if (map[level][r + 2][c] == SPACE || map[level][r + 2][c] == DEST)
            {
                //先把箱子移动到指定位置
                map[level][r + 2][c] += BOX;
                //把箱子从原来的位置删除
                map[level][r + 1][c] -= BOX;
                //把玩家移动到箱子的位置
                map[level][r + 1][c] += PLAYER;
                //把玩家从原来的位置删除
                map[level][r][c] -= PLAYER;
            }
        }
        break;
    case 75://左
        if (map[level][r][c - 1] == SPACE || map[level][r][c - 1] == DEST)
        {
            map[level][r][c - 1] += PLAYER;
            map[level][r][c] -= PLAYER;
        }
        else if (map[level][r][c - 1] == BOX)
        {//箱子前面是空地或者是目的地
            if (map[level][r][c - 2] == SPACE || map[level][r][c - 2] == DEST)
            {
                //先把箱子移动到指定位置
                map[level][r][c - 2] += BOX;
                //把箱子从原来的位置删除
                map[level][r][c - 1] -= BOX;
                //把玩家移动到箱子的位置
                map[level][r][c - 1] += PLAYER;
                //把玩家从原来的位置删除
                map[level][r][c] -= PLAYER;
            }
        }
    break;
    case 77:
        if (map[level][r][c + 1] == SPACE || map[level][r][c + 1] == DEST)
        {
            map[level][r][c + 1] += PLAYER;
            map[level][r][c] -= PLAYER;
        }
        else if (map[level][r][c + 1] == BOX)
        {//箱子前面是空地或者是目的地
            if (map[level][r][c + 2] == SPACE || map[level][r][c + 2] == DEST)
            {
                //先把箱子移动到指定位置
                map[level][r][c + 2] += BOX;
                //把箱子从原来的位置删除
                map[level][r][c + 1] -= BOX;
                //把玩家移动到箱子的位置
                map[level][r][c + 1] += PLAYER;
                //把玩家从原来的位置删除
                map[level][r][c] -= PLAYER;
            }
        }
        break;
    }
}
//什么情况下过关
int judge()
{
    for (int i = 0; i < ROW; i++)
    {
        for (int j = 0; j < COL; j++)
        {
            if (map[level][i][j] == BOX)
            {
                return 0;

            }
        }
    }
    return 1;
}
int main()
{
    menu();
    initMap();
    show();
    move();
    while (1)
    {
        show();
        if (judge())
        {
            level++;//每过一关加一
            if (level == 2)
            {
            printf("恭喜你过关了!");
            break;
            }
            
        }
        move();

    }
    return 0;

}

五、程序实现

第一关初始地图界面

按↑↓←→时,人物会向上下左右移动

第一关:

第一关通关:

第二关:

第二关完成:

总结:

上面是简易推箱子小游戏,由于我自身能力还有待提升,写出这些代码对我来说有一定难度,在此过程中我通过上网课,不断查找资料写了这篇文章,代码可能还存在许多需要改进的地方,各位小伙伴们如果有时间的话可以对其进行优化,如果上述有错误的地方麻烦大家能够指正,同时也可以给我一些建议,这样我可以向各位优秀的伙伴学习,文章较长,感谢大家愿意发时间观看。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言实现推箱子小游戏 的相关文章

  • Netty从零开始(一)

    需要用到netty 之前就当年实习的时候用过Mina netty没用过 所以加急学习了一下 感觉还不错 不多说 从官网入手 官网地址 http netty io wiki user guide for 4 x html 有兴趣的朋友可以自己
  • 2.4G信号干扰原因

    转自 http wenku baidu com link url iw 8wLsNphcELx J7artsLTdIKtCLGO7X PAgQG6BYXuG GPHzYh8xrhkRVzJo2HL1LvI2p4RlgfxCuVBSwt9VG
  • 方框滤波,均值滤波,高斯滤波

    邻域算子 局部算子 是利用给定像素周围的像素值的决定此像素的最终输出值的一种算子 对于邻域算子 除了用于局部色调调整以外 还可以用于图像滤波 实现图像的平滑和锐化 图像边缘增强或者图像噪声的去除 而线性邻域滤波是一种常用的邻域算子 像素的输
  • Android Studio Unsupported Java

    问题 升级 Android Studio Flamingo 出现如下报错信息 Unsupported Java Your build is currently configured to use Java 17 0 2 and Gradle
  • 费马小定理【模板例题】

    费马小定理 如果p是一个质数 而整数a不是p的倍数 则有a p 1 1 mod p 即 假如a是整数 p是质数 且a p互质 即两者只有一个公约数1 那么a的 p 1 次方除以p的余数恒等于1 变式延伸 在对质数 p 求余的条件下 n ap
  • 零基础如何入门数学建模?

    小羊简介 博客主页 小羊不会飞 年龄 20 大二在读 爱好 干饭 运动 码代码 看书 旅游 即将更新 1 手把手带你搭建个人博客网站 2 后台管理系统模块更新 感兴趣的朋友 赶紧上车吧 欢迎关注 点赞 收藏 留言 有任何疑问 欢迎留言讨论

随机推荐

  • arduino/Mixly HX711称重传感器

    比例系数 假设现在放上去的物体实际重量为175 测出的是43 85 那么实际的比例系数X应该等于 175 X 43 85 1992 现在放上去一个面包板 实际重量为70克 串口显示14 24 那么比例系数 1992 14 24 70 405
  • “fixture ‘xxx‘ not found / 参数传入无效”的解决方案

    问题描述 今天在对强化学习的Gradient Bandit进行编码测试的时候 在主函数中多次执行测试函数 出现以下两个问题 在主函数运行test 6测试函数时 传入的参数是3000 但是绘图结果只显示1000 也就是test 6默认参数值
  • 一篇带你MySQL运维

    1 日志 1 1 错误日志 错误日志是 MySQL 中 重要的日志之一 它记录了当 mysqld启动和停止时 以及服务器在运行过程中发生任何严重错误时的相关信息 当数据库出现任何故障导致无法正常使用时 建议首先查看此日志 该日志是默认开启的
  • 【语义分割】--SegNet理解

    原文地址 SegNet 复现详解 http mi eng cam ac uk projects segnet tutorial html 实现代码 github TensorFlow 简介 SegNet是Cambridge提出旨在解决自动驾
  • mybatis自动生成@Table、@Column、@Id注解

    在pom xml中添加如下插件以及插件相关的依赖
  • kvm之多网卡队列开启设置

    背景 目前基于dpdk数据平面开发套件的应用越来越多 而dpdk对于上层应用运行时 服务的进程数多于1时 要求网卡支持多队列 否则项nginx这种多进程应用程序只能再默认配置下运行 只能启动一个worker 要求 在kvm虚机中将网卡设置支
  • 模拟器提示关闭 hyper-V,但 hyper-V实际上并没有开启

    这个问题是windows系统问题导致无法使用BlueStacks 按下win R键打开执行窗口 输入regedit命令 打开注册表找到位置 HKEY LOCAL MACHINE SYSTEM CurrentControlSet Contro
  • 语义分割该如何走下去?

    作者 立夏之光 链接 https www zhihu com question 390783647 answer 1223902660 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 做过一年多语义分割 来回
  • Java实现MySQL图片存取

    Reference Java实现对Mysql的图片存取操作 java 字节流读取图片 字符流读取 二进制读取 mysql BLOB字段类型用法介绍 Notes Java对图片的读写就跟其它文件一样的 但要用字节流而不用字符流 MySQL中各
  • 《Ansible语法篇:剧本对象关键字之when》

    一 前言 在ansible playbook中 也可以像其他编程语言一样进行条件判断 循环等流程控制 除此之外 还可以控制task的执行结果 在ansible中 可以通过when语句来执行条件判断 只有符合条件 才会执行对应的task wh
  • 【计算机视觉】华为天才少年谢凌曦:关于视觉识别领域发展的个人观点!

    文章目录 一 前言 二 CV的三大基本困难和对应研究方向 三 以下简要分析各个研究方向 3 1 方向1a 神经网络架构设计 3 2 方向1b 视觉预训练 3 3 方向2 模型微调和终身学习 3 4 方向3 无限细粒度视觉识别任务 四 在上述
  • EasyCode代码模板-适用于mybatis-plus 的项目中

    下面的模板适用于mybatis plus 的项目中 pojo类 面的模板适用于mybatis plus 的项目中 导入宏定义 define vm 保存文件 宏定义 save pojo java 包路径 宏定义 setPackageSuffi
  • Android10.0 os定制化系列讲解导读

    一 前言 本专栏主要是作者本人在10 0 frameworks定制化实战功能系列的解读 在从事几年的frameworks定制化功能的经验的积累 开发过平板 广告机 会议机 车机等一系列系统上层定制的功能性开发 写博客的目的 一方面是整理自己
  • Centos 8 替换镜像源

    1 替换 1 1 备份 mkdir etc yum repos d bak mv etc yum repos d etc yum repos d bak 1 2 下载 curl o etc yum repos d CentOS Base r
  • 【100%通过率 】【华为OD机试真题c++ /python】寻找符合要求的最长子串【 2022 Q4 A卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 知识点双指针 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 给定一个字符串 s 找出这样一个子串 1 该子串中的任意一个字符最多出现2次 2 该子串不包含指定
  • SQL入门书籍内容汇总

    转头一晃 SQL入门书籍看完了 并且在画思维导图和整理笔记的过程中又一次加深了印象 不过也仅仅停留在课本层面上 不进行实际操作终将不知道你有没有学会如何运用 当然肯定不会自己创建一些数据库了 这个事不用质疑的 不过却可以读懂里面的一些用法
  • 【RK3399】I3399烧写Android系统详解

    00 目录 文章目录 00 目录 01 驱动安装 02 Android镜像文件烧写 03 问题讨论 04 附录 01 驱动安装 1 1 没有安装驱动的时候 显示感叹号 1 2 解压DriverAssitant v5 1 1 zip 1 3
  • 展锐8541芯片CPU推理MNN模型加速的若干问题

    一 在只有CPU的嵌入式设备上部署AI模型时 可以采取以下方法来提高模型的运行速度 1 量化模型 将浮点数模型转换为定点数模型 可以减少模型的计算和存储需求 从而提高模型的运行速度 2 剪枝模型 通过删除模型中不必要的连接和神经元 可以减少
  • 如何安装虚拟机?安装虚拟机的详细步骤

    1 下载虚拟机软件 首先 在官方网站上下载需要的虚拟机软件 如VMware VirtualBox等 注意软件版本的兼容性 最好选择最新版本 2 安装虚拟机软件 下载完成后 双击安装文件 按照提示完成安装 期间需要设置虚拟机软件的安装路径等信
  • C语言实现推箱子小游戏

    一 设计目的 用简单的C语言知识制作的推箱子游戏 通过上下左右键将所有箱子移动到目标位置 2 让我们更好地了解和巩固C语言知识 并实际运用 同时运用一些不太常见的知识点 二 功能描述 1 模块功能 本程序可分为初始界面 进行游戏 判定通关三