走迷宫之推箱子

news2024/11/19 6:16:12

前言:

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

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

效果图: 

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python绘制热力图-数据处理-VOC数据类别标签分布及数量统计(-代码)

Python是一种功能强大的编程语言&#xff0c;它提供了许多库和工具&#xff0c;用于处理和可视化数据。在本文中&#xff0c;我们将介绍使用Python绘制热力图&#xff0c;并对VOC数据集中的类别标签进行分布及数量统计。 首先&#xff0c;我们需要导入所需的库。使用numpy库来…

【Java】后端开发语言Java和C#,两者对比注解和属性的区别以及作用

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《Java》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…

SpringBoot 源码解析4:refresh 方法解析

SpringBoot 源码解析4&#xff1a;refresh 方法解析 1. refresh 方法解析2. 准备刷新 AbstractApplicationContext#prepareRefresh3. 获取bean工厂 AbstractApplicationContext#obtainFreshBeanFactory4. 准备bean工厂 AbstractApplicationContext#prepareBeanFactory5. Servle…

Windows解决.conda文件夹占用C盘空间过大的问题

背景&#xff1a;C盘空间被.conda文件占用16G&#xff0c;主要原因是里面存放了python环境&#xff0c;提前进行环境迁移&#xff0c;防止后面环境增长C盘空间不足 解决办法&#xff1a; 1. .conda文件备份 2. 将.conda文件夹中的envs内容复制到Anaconda的安装目录下D:\Softwa…

HNU-编译原理-实验2-Bison

编译原理实验2Bison 计科210X 甘晴void 202108010XXX 实验要求 详细的实验项目文档为 https://gitee.com/coderwym/cminus_compiler-2023-fall/tree/master/Documentations/lab2 实验步骤 本次实验需要在 Lab1 已完成的 flex 词法分析器的基础上&#xff0c;进一步使用 b…

车机联网

通过笔记本电脑&#xff0c;D-link给车机提供网络 因为笔记本用的无线网络上网&#xff0c;将无线网络连接设置为共享 设置后的效果 本地连接属性设置 Dlink连接电脑和车机&#xff1b;获取车机的动态ip&#xff08;动态ip每次开关机都会变化&#xff0c;注意更新&#xff09…

【python 的各种模块】(9) 在python使用PIL( 即pillow模块 ) 修改图片

目录 1 导入PIL模块&#xff08;pillow&#xff09; 1.1 PIL的全称&#xff1a;Python Imaging Library 1.2 导入PIL模块 1.2.1 可用的导入形式 1.2.2 常用的导入形式 1.2.3 PIL下面的常用子模块 2 PIL.Image的方法 (读入&#xff0c;生成和显示图片) 2.1 用 PIL.Image…

《教育》期刊是什么级别的期刊?是正规期刊吗?能评职称吗?

《教育》以教育行业的各类新闻为重点&#xff0c;积极推广各地教育部门改革经验及优秀成果&#xff0c;努力挖掘教育一线先进单位和个人&#xff0c;充分发挥新闻舆论的监督作用。 收录情况&#xff1a;知网收录 投稿方式&#xff1a;教育类&#xff5c;《教育》省级 出版周期&…

GPT2 GPT3

what is prompt 综述1.Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing(五星好评) 综述2. Paradigm Shift in Natural Language Processing(四星推荐) 综述3. Pre-Trained Models: Past, Present and Future Pro…

Vue学习笔记5-- nextTick | Vue封装的过渡与动画

一、nextTick(tick-工作&#xff0c;起作用&#xff1b;下次起作用&#xff09; 语法&#xff1a; this.$nextTick(回调函数&#xff09;作用&#xff1a;在下一次DOM更新结束后执行其指定的回调。什么时候用&#xff1a;当改变数据后&#xff0c;要基于更新后的新DOM进行某些…

虾皮电商 电商平台:虾皮(Shopee)东南亚领先的电子商务平台

在当今数字化时代&#xff0c;电子商务平台的兴起改变了人们的购物方式。虾皮&#xff08;Shopee&#xff09;作为东南亚地区领先的电子商务平台&#xff0c;为消费者提供了便捷、多样化的购物体验。由新加坡的Sea Group&#xff08;前称Garena&#xff09;于2015年创立&#x…

程序员书单|本月有哪些新书值得关注?

2024年的第一个月&#xff0c;看了一下计算机书籍的榜单&#xff0c;本周有这样几本新书上榜。 1、GPT图解 大模型是怎样构建的 带你从0到1构建大模型&#xff0c;突破语言奥秘&#xff0c;开启智能未来&#xff01;深入探索自然语言处理技术的核心原理&#xff0c;结合实战&a…

【Linux】第二十九站:再谈进程地址空间

文章目录 一、一些疑问二、程序没有加载前的地址&#xff08;程序)三、程序加载后的地址四、动态库的地址 一、一些疑问 什么是虚拟地址&#xff1f;什么是物理地址&#xff1f;CPU读到的指令里面用的地址&#xff0c;是什么地址&#xff1f;&#xff1f; 我们之前在使用动态…

将web如vue等项目部署到宝塔docker镜像中,以便能在任意浏览器访问

文章目录 一、准备工作二、具体步骤1、从已经推送的镜像中拉取镜像2、切换到宝塔-容器&#xff0c;添加容器3、启动容器4、将刚刚的端口号添加到防火墙白名单5、访问部署好的项目 参考资料 一、准备工作 仅需确认宝塔面板已经有docker镜像容器 目前新版宝塔面板都已经内置了d…

数据结构之list类

前言 list是列表类。从list 类开始&#xff0c;我们就要接触独属于 Python 的数据类型了。Python 简单、易用&#xff0c;很大一部分原因就是它对基础数据类型的设计各具特色又相辅相成。 话不多说&#xff0c;让我们开始学习第一个 Python 数据类型一list。 1. list的赋值 输…

做完十年数据分析后的思考与总结

种一棵树最好的时间是十年前&#xff0c;其次是现在。十年了&#xff0c;本次分享大多来自工作中的日常所思所想&#xff0c;欢迎自取。 01 数据分析的本质 数据是基础&#xff0c;分析才是重点。 行业内有专门的统计岗&#xff0c;就是只负责做好数据统计就可以了&#xff0…

使用pycocotools打印更多数据(注意,修改后最好再还原!最好是一次性使用)

文章目录 1 写在前面2 代码效果3 代码修改 1 写在前面 夹带私货&#xff0c;可能有用呢&#xff1a;YOLOv7-tiny&#xff0c;通过pycocotools包得到预测大中小尺寸目标的指标值 仅供参考&#xff01;写这个代码的目的是能够打印出iou0.50的AP、AR的小中大3个尺寸的值&#xff…

记录汇川:H5U与Factory IO测试14

现实53工位的物料运输。 设置了自动连续存启动&#xff1a;就是一个一个运&#xff0c;按照顺序将空的货架填满。 设置了自动连续存停止&#xff1a;就是完成当前循环后退出。 设置了自动连续取启动&#xff1a;就是一个一个运&#xff0c;按照顺序将有货的货架清空。 设置…

Linux系统:yum仓库

目录 一、yum 1、yum概述 2、yum仓库 3、yum实现过程原理 二、yum配置文件详解 1、主配置文件 2、yum仓库设置文件 3、yum日志文件 三、yum命令详解 1、查询 1.1 yum list [软件名] 1.2 yum info [软件名] 1.3 yum search <关键词> 1.4 yum provides <关…

从0到1:实验室设备借用小程序开发笔记

概论 实验室设备借用小程序&#xff0c;适合各大高校&#xff0c;科技园区&#xff0c;大型企业集团的实验室设备借用流程, 通过数字化的手段进一步提升相关单位设备保障水平&#xff0c;规范实验室和设备管理&#xff0c;用户通过手机小程序扫描设备的二维码&#xff0c;可以…