【C语言】走迷宫之推箱子

前言:

在上一篇文章当中我介绍了一个走迷宫的写法,但是那个迷宫没什么可玩性和趣味性,所以我打算在迷宫的基础上加上一个推箱子,使之有更好的操作空间,从而增强了游戏的可玩性和趣味性。

1. 打印菜单

void menu()
{
	printf("|---------------------------------------|\n");
	printf("|                                       |\n");
	printf("|                走迷宫                 |\n");
	printf("|                1.Start                |\n");
	printf("|                2.Exit                 |\n");
	printf("|                e.Restart              |\n");
	printf("|                                       |\n");
	printf("|---------------------------------------|\n");
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("选择有误,请重新选择!\a\n");
		}
	} while (input);
}

2. 分析迷宫的组成要素

迷宫的组成要素无非就是:墙、路、入口、出口,根据这些要素我们可以设置一个数组然后随机给其赋值为0,1,2,3,当数组等于0时打印路(这里用空格代替),等于1时打印墙(这里用█代替),等于2打印入口(这里用S代替),等于3时打印出口(这里用E代替)。

3. 实现迷宫的组成要素

因为这些要素的生成都与随机数有关,所以这里就要使用到time函数、srand函数和rand函数来进行随机数的生成。

#include<time.h>
srand((time(NULL))
int x = rand();

3.1 生成路

给数组初始化为0生成路,后面再用随机数生成。

  for (int i = 0; i < SIZE; i++)
  {
      for (int j = 0; j < SIZE; j++)
      {
          maze[i][j] = 0;
      }
  }

3.2 生成围墙

还需要设置围墙将我们的迷宫围起来,防止数组的越界访问。

for (int i = 0; i < SIZE; i++)
{
    maze[0][i] = 1;
    maze[i][0] = 1;
    maze[SIZE - 1][i] = 1;
    maze[i][SIZE - 1] = 1;
}

3.3 生成入口、出口和箱子

因为入口、出口和箱子(我在这里只设置了一个)都是只有一个,所以这里我们需要单独使用随机数生成入口、出口和箱子。

  //设置入口
 int start_x = rand() % SIZE;
 int start_y = rand() % SIZE;
 maze[start_y][start_x] = 2;
 //设置出口
 int end_x = rand() % SIZE;
 int end_y = rand() % SIZE;
 maze[end_y][end_x] = 3;
 //设置箱子
 int box_x = rand() % SIZE;
 int box_y = rand() % SIZE;
 maze[box_y][box_x] = 4;

3.4 防止入口、出口和箱子出现在错误的位置上

这里使用了goto语句

3.4.1 防止入口和出口出现在围墙上

 again:
 //防止入口或出口出现在围墙上
  if (start_x == 0 || start_x == SIZE - 1 || start_y == 0 || start_y == SIZE - 1
      || end_x == 0 || end_x == SIZE - 1 || end_y == 0 || end_y == SIZE - 1
      || box_x == 0 || box_x == SIZE - 1 || box_y == 0 || box_y == SIZE - 1)
      goto again;

3.41 防止箱子出现在围墙的边上

因为如果箱子出现在边上,这个箱子就推不了左右了。所以需要防止箱子出现在围墙的边上

again:
//防止箱子出现在边上
if (box_y == 1 || box_y == SIZE || box_x == 1 || box_x == SIZE)
    goto again;

3.5 生成墙

for (int i = 0; i < SIZE; i++)
{
    for (int j = 0; j < SIZE; j++)
    {
        if (maze[i][j] != 2 && maze[i][j] != 3)
        {
            if (rand() % 4 == 0)
            {
                maze[i][j] = 1;
            }
        }
    }
}

4. 操作移动

4.1 getch函数

在这里用到了getch()函数,这个函数需要用#include <conio.h>来进行调用。

#include <conio.h>
int main()
{
	while (1)
	{
		int x = getch(); 
		if (x == 'w')
			printf("上\n");
		if (x == 'a')
			printf("左\n");
		if (x == 's')
			printf("下\n");
		if (x == 'd')
			printf("右\n");
	}
	return 0;
}

4.2 操作S的移动: 

输入w向上移动,输入s向下移动,输入a向左移动,输入d向右移动。

以输入w向上移动为例:

需要满足S的上一个格子是路,也就是需要满足maze[start_y - 1][start_x] == 0才会接受向上移动的信息,而要想实现一个向上移动的效果,我们就需要将原来的位置变为路也就是使maze[start_y][start_x] = 0;,然后使原来位置的上一个变为S也就是 start_y--; maze[start_y][start_x] = 2;

完整的移动代码: 

if (x == 'w')//上
    {
        if (maze[start_y - 1][start_x] == 0)
        {
            maze[start_y][start_x] = 0;
            start_y--;
            maze[start_y][start_x] = 2;
        }
    }

其中system("cls")函数的作用是清屏,它需要使用#icnldue<stdlib.h>进行调用。 

4.3 操作箱子的移动: 

以向上移动为例:

箱子可以向上移动的前提是:

1.箱子出现在S的上面,也就是maze[start_y - 1][start_x] == 4

2.箱子的上面不是墙,也就是maze[box_y - 1][box_x] != 1

实现一个向上移动的效果:

实现这个移动效果的写法与移动S的写法相同

if (x == 'w')//上
{
    if (maze[start_y - 1][start_x] == 4)
    {
            if (maze[box_y - 1][box_x] != 1)
            {
                maze[box_y][box_x] = 0;
                box_y--;
                maze[box_y][box_x] = 4;
            }
    }

4.5 完整移动代码: 

do
{
    system("cls");
    print_maze(maze);
    int x = getch();
    if (x == 'w')//上
    {
        if (maze[start_y - 1][start_x] == 4)
        {
                if (maze[box_y - 1][box_x] != 1)
                {
                    maze[box_y][box_x] = 0;
                    box_y--;
                    maze[box_y][box_x] = 4;
                }
        }
        if (maze[start_y - 1][start_x] != 1 && maze[start_y - 1][start_x] != 4&& maze[start_y - 1][start_x] != 3)
        {
            maze[start_y][start_x] = 0;
            start_y--;
            maze[start_y][start_x] = 2;
        }
       
    }
    if (x == 'a')//左
    {
        if (maze[start_y][start_x - 1] == 4)
        {
            if (maze[box_y][box_x - 1] != 1)
            {
                maze[box_y][box_x] = 0;
                box_x--;
                maze[box_y][box_x] = 4;
            }
        }
        if (maze[start_y][start_x - 1] != 1 && maze[start_y][start_x - 1] != 4 && maze[start_y][start_x - 1] != 3)
        {
            maze[start_y][start_x] = 0;
            start_x--;
            maze[start_y][start_x] = 2;
        }
    }
    if (x == 's')//下
    {
        if (maze[start_y + 1][start_x] == 4)
        {
            if (maze[box_y + 1][box_x] != 1)
            {
                maze[box_y][box_x] = 0;
                box_y++;
                maze[box_y][box_x] = 4;
            }
        }
        if (maze[start_y + 1][start_x] != 1 && maze[start_y + 1][start_x] != 4 && maze[start_y + 1][start_x] != 3)
        {
            maze[start_y][start_x] = 0;
            start_y++;
            maze[start_y][start_x] = 2;
        }
    }
    if (x == 'd')//右
    {
        if (maze[start_y][start_x + 1] == 4)
        {
            if (maze[box_y][box_x + 1] != 1)
            {
                maze[box_y][box_x] = 0;
                box_x++;
                maze[box_y][box_x] = 4;
            }
        }
        if (maze[start_y][start_x + 1] != 1&& maze[start_y][start_x + 1] != 4 && maze[start_y][start_x + 1] != 3)
        {
            maze[start_y][start_x] = 0;
            start_x++;
            maze[start_y][start_x] = 2;
        }
    }
  
} while (1);

其中system("cls")函数的作用是清屏,它需要使用#icnldue<stdlib.h>进行调用。 

5. 游戏的结束与游戏的重开

当门的位置等于箱子也就是maze[end_y][end_x] == 4即为通关成功。

加一个e的指令重开游戏

 if (x == 'e')
        {
            system("cls");
            printf("重新开始游戏!\n");
            break;
        }

完整代码 :

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#include<conio.h>
#define SIZE 45
//打印迷宫
void print_maze(int maze[SIZE][SIZE])
{
    for (int i = 0; i < SIZE; i++)
    {
        for (int j = 0; j < SIZE; j++)
        {
            if (maze[i][j] == 1)
            {
                printf("█");
            }
            else if (maze[i][j] == 2)
            {
                printf("S");//入口
            }
            else if (maze[i][j] == 3)
            {
                printf("E");//出口
            }
            else if (maze[i][j] == 4)
            {
                printf("@");//箱子
            }
            else
            {
                printf(" ");
            }
        }
        printf("\n");
    }
    printf("\n");
}

void generate_maze(int maze[SIZE][SIZE])
{
again:
    for (int i = 0; i < SIZE; i++)
    {
        for (int j = 0; j < SIZE; j++)
        {
            maze[i][j] = 0;
        }
    }
    //围墙
    for (int i = 0; i < SIZE; i++)
    {
        maze[0][i] = 1;
        maze[i][0] = 1;
        maze[SIZE - 1][i] = 1;
        maze[i][SIZE - 1] = 1;
    }
    //设置入口
    int start_x = rand() % SIZE;
    int start_y = rand() % SIZE;
    maze[start_y][start_x] = 2;
    //设置出口
    int end_x = rand() % SIZE;
    int end_y = rand() % SIZE;
    maze[end_y][end_x] = 3;
    //设置箱子
    int box_x = rand() % SIZE;
    int box_y = rand() % SIZE;
    maze[box_y][box_x] = 4;

    //防止入口或出口出现在围墙上
    if (start_x == 0 || start_x == SIZE - 1 || start_y == 0 || start_y == SIZE - 1
        || end_x == 0 || end_x == SIZE - 1 || end_y == 0 || end_y == SIZE - 1
        || box_x == 0 || box_x == SIZE - 1 || box_y == 0 || box_y == SIZE - 1)
    {
        goto again;
    }
    //防止箱子出现在边上
    if (box_y == 1 || box_y == SIZE || box_x == 1 || box_x == SIZE)
        goto again;
    //设置迷宫
    for (int i = 0; i < SIZE; i++)
    {
        for (int j = 0; j < SIZE; j++)
        {
            if (maze[i][j] != 2 && maze[i][j] != 3 && maze[i][j] != 4)
            {
                if (rand() % 5 == 0)
                {
                    maze[i][j] = 1;
                }
            }
        }
    }
    //操作S移动
    do
    {
        system("cls");
        print_maze(maze);
        int x = getch();
        if (x == 'w')//上
        {
            if (maze[start_y - 1][start_x] == 4)
            {
                if (maze[box_y - 1][box_x] != 1)
                {
                    maze[box_y][box_x] = 0;
                    box_y--;
                    maze[box_y][box_x] = 4;
                }
            }
            if (maze[start_y - 1][start_x] != 1 && maze[start_y - 1][start_x] != 4 && maze[start_y - 1][start_x] != 3)
            {
                maze[start_y][start_x] = 0;
                start_y--;
                maze[start_y][start_x] = 2;
            }

        }
        if (x == 'a')//左
        {
            if (maze[start_y][start_x - 1] == 4)
            {
                if (maze[box_y][box_x - 1] != 1)
                {
                    maze[box_y][box_x] = 0;
                    box_x--;
                    maze[box_y][box_x] = 4;
                }
            }
            if (maze[start_y][start_x - 1] != 1 && maze[start_y][start_x - 1] != 4 && maze[start_y][start_x - 1] != 3)
            {
                maze[start_y][start_x] = 0;
                start_x--;
                maze[start_y][start_x] = 2;
            }
        }
        if (x == 's')//下
        {
            if (maze[start_y + 1][start_x] == 4)
            {
                if (maze[box_y + 1][box_x] != 1)
                {
                    maze[box_y][box_x] = 0;
                    box_y++;
                    maze[box_y][box_x] = 4;
                }
            }
            if (maze[start_y + 1][start_x] != 1 && maze[start_y + 1][start_x] != 4 && maze[start_y + 1][start_x] != 3)
            {
                maze[start_y][start_x] = 0;
                start_y++;
                maze[start_y][start_x] = 2;
            }
        }
        if (x == 'd')//右
        {
            if (maze[start_y][start_x + 1] == 4)
            {
                if (maze[box_y][box_x + 1] != 1)
                {
                    maze[box_y][box_x] = 0;
                    box_x++;
                    maze[box_y][box_x] = 4;
                }
            }
            if (maze[start_y][start_x + 1] != 1 && maze[start_y][start_x + 1] != 4 && maze[start_y][start_x + 1] != 3)
            {
                maze[start_y][start_x] = 0;
                start_x++;
                maze[start_y][start_x] = 2;
            }
        }

        if (maze[end_y][end_x] == 4)
        {
            system("cls");
            print_maze(maze);
            printf("恭喜你成功通关!\n");
            break;
        }
        if (x == 'e')
        {
            system("cls");
            printf("重新开始游戏!\n");
            break;
        }
    } while (1);

}
void menu()
{
    printf("|---------------------------------------|\n");
    printf("|                                       |\n");
    printf("|                走迷宫                 |\n");
    printf("|                1.play                 |\n");
    printf("|                2.exit                 |\n");
    printf("|                                       |\n");
    printf("|---------------------------------------|\n");
}



void game()
{
    srand(time(NULL));
    int maze[SIZE][SIZE];
    //打印迷宫
    generate_maze(maze);
}

int main()
{
    int input = 0;
    do
    {
        menu();
        printf("请选择:");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏!\n");
            break;
        default:
            printf("选择有误,请重新选择!\a\n");
        }
    } while (input);
}

效果图: 

以上就是《走迷宫之推箱子》的全部内容啦,如果上述内容对你有帮助的话不要忘记点上一个关注支持一下小编呦,期待我们下次再见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/403412.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BUUCTF第二十四、二十五题解题思路

目录 第二十四题CrackRTF 第二十五题[2019红帽杯]easyRE1 第二十四题CrackRTF 查壳 无壳&#xff0c;32位&#xff0c;用32位IDA打开&#xff0c;打开后的main函数很短&#xff0c;可以找到一句“jmz _main_0”——跳转到 _main_0&#xff0c;说明真正的主函数是_main_0&am…

opencv图像的本质

目的 OpenCV是一个跨平台的库&#xff0c;使用它我们可以开发实时的计算机视觉应用程序。 它主要集中在图像处理&#xff0c;视频采集和分析&#xff0c;包括人脸检测和物体检测等功能。 数字图像在计算机中是以矩阵形式存储的&#xff0c;矩阵中的每一个元素都描述一定的图像…

学生个性化成长平台搭建随笔记

1.Vue的自定义指令 在 Vue.js 中&#xff0c;我们可以通过 Vue.directive() 方法来定义自定义指令。具体来说&#xff0c;我们需要传递两个参数&#xff1a; 指令名称&#xff1a;表示我们要定义的指令名称&#xff0c;可以是一个字符串值&#xff0c;例如&#xff1a;has-rol…

时域相位分析技术 和空域相位分析技术

l) 时域相位分析技术 在光 学测量 的许 多情况 下 &#xff0c; 时变图像信 号 的背景光 强 与调制 度可 以看作是 常 数 &#xff0c;并且 其光 强 随时 间 的变化也满足 正 弦条件 。 那 么针 对某 一 空 间采样 点 (x &#xff0c;y) &#xff0c; 某时刻 采 集到 的光 强 可…

CleanMyMacX4.15破解版下载安装包步骤教程

安装CleanMyMac X的步骤如下&#xff1a; 在中文网站上进行安装包的免费下载。找到下载完成的安装包&#xff0c;然后双击打开。用鼠标拖动CleanMyMac X应用程序的图标&#xff0c;将其拖放至右侧的“应用程序”文件夹内。稍等片刻&#xff0c;CleanMyMac X应用程序就会出现在…

使用 package.json 配置代理解决 React 项目中的跨域请求问题

使用 package.json 配置代理解决 React 项目中的跨域请求问题 当我们在开发前端应用时&#xff0c;经常会遇到跨域请求的问题。为了解决这个问题&#xff0c;我们可以通过配置代理来实现在开发环境中向后端服务器发送请求。 在 React 项目中&#xff0c;我们可以使用 package…

【Docker实操】部署php项目

概述 最终达成的容器部署结构和原理如下图&#xff1a; 一、获取nginx、php官方镜像 docker pull nginx //拉取nginx官方镜像 docker pull php:7.4-fpm //拉取php官方镜像需要获取其他可用的php版本&#xff0c;可以上【docker hub】搜索【php】&#xff0c;所有的【xxx-fp…

Windows 7 驱动安装

Windows 7 驱动安装 1. 驱动安装2. 安装驱动和运行环境References 1. 驱动安装 驱动精灵 标准版 驱动精灵 万能网卡版 注意&#xff1a;更改安装路径和安装选项 ​​​ 2. 安装驱动和运行环境 避免自行管理混乱。 References [1] Yongqiang Cheng, https://yongqiang.blo…

igolang学习1,dea的golang-1.22.0

参考&#xff1a;使用IDEA配置GO的开发环境备忘录-CSDN博客 1.下载All releases - The Go Programming Language (google.cn) 2.直接next 3.window环境变量配置 4.idea的go插件安装 5.新建go项目找不到jdk解决 https://blog.csdn.net/ouyang111222/article/details/1361657…

图论(算法竞赛、蓝桥杯)--Dijkstra算法最短路

1、B站视频链接&#xff1a;D02 最短路 Dijkstra 算法_哔哩哔哩_bilibili 题目链接&#xff1a;【模板】单源最短路径&#xff08;弱化版&#xff09; - 洛谷 #include <bits/stdc.h> using namespace std; #define INF 2147483647 int n,m,s,a,b,c; const int N100010…

测试环境搭建整套大数据系统(三:搭建集群zookeeper,hdfs,mapreduce,yarn,hive)

一&#xff1a;搭建zk https://blog.csdn.net/weixin_43446246/article/details/123327143 二&#xff1a;搭建hadoop&#xff0c;yarn&#xff0c;mapreduce。 1. 安装hadoop。 sudo tar -zxvf hadoop-3.2.4.tar.gz -C /opt2. 修改java配置路径。 cd /opt/hadoop-3.2.4/etc…

Stable Diffusion 模型的概念、类型、下载、安装、使用

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 我们在《Stable Diffusion WebUI 界面介绍》 时&#xff0c;第一个就讲到了 Stable Diffusion 模型&#xff0c;那么这个模型是什么&#xff1f;该从哪儿下载&…

DevOps的3大核心基础架构

原文链接&#xff1a;DevOps的3大核心基础架构_软件开发生产线 CodeArts_理论实践_DevOps概览 由于近年DevOps概念的火热&#xff0c;加之DevOps的涵盖面非常广&#xff0c;因此有很多文章和技术都在和DevOps强行关联&#xff0c;使很多想要了解学习DevOps的开发者迷惑不解。 …

Gitee教程2(完整流程)

1.配置git git config --global user.name "用户名" git config --global user.email "密码" 如何获取&#xff1f; gitee右上角加号点击新建仓库&#xff0c;仓库名随便起一个就行 找到这条命令&#xff0c;把这两句一个一个复制到vscode终端就行 2.创建g…

Unity之ShaderGraph如何实现水面波浪

前言 这几天通过一个水的波浪数学公式,实现了一个波浪效果,感觉成就感满满,下面给大家分享一下 首先先给大家看一下公式; 把公式转为ShaderGraph 第一行公式:waveType = z*-1*Mathf.Cos(wave.WaveAngle/360*2*Mathf.PI)+x*Mathf.Sin(WaveAngle/360*-2*Mathf.PI) 转换…

ChatGPT在数据处理中的应用

ChatGPT在数据处理中的应用 今天的这篇文章&#xff0c;让我不断体会AI的强大&#xff0c;愿人类社会在AI的助力下走向更加灿烂辉煌的明天。 扫描下面二维码注册 ​ 数据处理是贯穿整个数据分析过程的关键步骤&#xff0c;主要是对数据进行各种操作&#xff0c;以达到最终的…

【b站咸虾米】chapter5_uniapp-API_新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握

课程地址&#xff1a;【新课uniapp零基础入门到项目打包&#xff08;微信小程序/H5/vue/安卓apk&#xff09;全掌握】 https://www.bilibili.com/video/BV1mT411K7nW/?p12&share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 5 API API 概述 | uni-app…

Elasticsearch:了解人工智能搜索算法

作者&#xff1a;来自 Elastic Jessica Taylor, Aditya Tripathi 人工智能工具无处不在&#xff0c;其原因并不神秘。 他们可以执行各种各样的任务并找到许多日常问题的解决方案。 但这些应用程序的好坏取决于它们的人工智能搜索算法。 简单来说&#xff0c;人工智能搜索算法是…

Python基础综合案例 --- 数据可视化

1.折线图可视化 1.按照 json 格式封装的数据可以在各类编程语言中流通:比如说一个人说法语,一个人说德语,互相听不懂,但是它们可以将各自说的语言统一转化为英语说出,这样互相之间就听的懂了 1.在python中,符合 json 格式的数据有以下两种形式: 第一种是字典存在形式;…

基于springboot+vue的中小企业设备管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…