走迷宫之推箱子

前言:

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

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.mzph.cn/news/627610.shtml

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

相关文章

探索 Python:发现有趣的库——第 1 章:数据可视化之旅

在一个充满活力的科技世界中&#xff0c;数据分析专家“算法仙”和编程爱好者“代码侠”相遇了&#xff0c;决定一起踏上数据可视化的探险之旅。他们将运用 Matplotlib 和 Seaborn 这两个强大的 Python 库&#xff0c;将枯燥的数据转化为生动的图形。 算法仙&#xff1a;你好&…

Kafka 的 Consumer Group 解读

作为一份笔记&#xff0c;本文再次梳理一下 Kafka 的 Consumer Group。我们知道&#xff0c;一个 Topic 往往会有多个 Partition&#xff0c;一条消息只会被写到一个 Kafka 的 Partition 中&#xff0c;那 Consumer 是怎么消费 Message 的呢&#xff1f; Consumer Group 又从中…

如何低成本打造高效跨国企业内网

随着企业数字化转型的加速&#xff0c;企业对网络连接、安全性和可靠性的需求也变得越来越高&#xff0c;最近小编收到了好几封私信&#xff0c;咨询跨境企业内部组网方案。 投稿的是某跨国公司的IT运维人员&#xff0c;总部在海外&#xff0c;国内分支机构每天都需要进行数据互…

[Android]实现一个权限申请类

[Android]实现一个权限申请类 导言 在引入了动态权限申请之后&#xff0c;Android的权限申请就变得尤为繁琐&#xff0c;若是按照原有的方法一板一眼地进行申请&#xff0c;样板代码未免太多。因此本篇文章就使用ActivityResult API&#xff0c;来实现一个简单的权限申请类来帮…

C练习——魔术师猜三位数

题目&#xff1a; 有一种室内互动游戏&#xff0c;魔术师要每位观众心里想一个三位数abc&#xff08;a、b、c分别是百位、十位和个位数字&#xff09;&#xff0c;然后魔术师让观众心中记下acb、bac、bca、cab、cba五个数以及这5个数的和值。只要观众说出这个和是多少&#xf…

进程的创建与回收学习笔记

目录 一、进程内容&#xff1a; 二、进程常用命令 三、创建子进程 四、子进程进阶 五、进程的退出 六、进程的回收 一、进程内容&#xff1a; 程序&#xff1a; 存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09; 静态的 进程&#xff1a; 执行一个程序所…

拍照后的相机logo怎么去掉?看完你就知道了

在日常生活中&#xff0c;拍照已经成为了我们捕捉美好瞬间的习惯。山川湖海、花鸟鱼虫&#xff0c;城市风光、街角趣闻&#xff0c;我们都喜欢用相机或手机留住这些美好的回忆。然而&#xff0c;有时候&#xff0c;当我们按下的那一刹那&#xff0c;一些不速之客——logo&#…

安全狗连续3年获得中国网络空间安全协会感谢

在2024年的新年伊始&#xff0c;安全狗依托在2023年期间协助中国网络空间安全协会完成《网络安全态势感知研判分析报告》并支持相关网络安全态势研判工作而获得感谢信。 厦门服云信息科技有限公司&#xff08;品牌名&#xff1a;安全狗&#xff09;创办于2013年&#xff0c;是…

3d模型为什么打光只显示黑色---模大狮模型网

3D建模是现代制作动画、电影、游戏等数字媒体内容的重要工具。在建模过程中&#xff0c;打光是一个重要的环节&#xff0c;它可以让3D模型更加真实、有趣和生动。然而&#xff0c;如果打光不当&#xff0c;3D模型可能会呈现出黑色的效果&#xff0c;这可能会让人感到困惑和沮丧…

模拟瑞幸小程序购物车

是根据渡一袁老师的大师课写的&#xff0c;如有什么地方存在问题&#xff0c;还请大家指出来哟ど⁰̷̴͈꒨⁰̷̴͈う♡&#xff5e; index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-e…

浅谈智慧路灯安全智能供电方案设计

摘要: 智慧路灯&#xff0c;作为智慧城市、新基建、城市更新的主要组成部分&#xff0c;近些年在各大城市已得到很好的落地和 应用&#xff0c;但其与传统路灯相比集成大量异元异构电子设备&#xff0c;这些设备的供电电压、接口形式、权属单位各不相同&#xff0c; 如何设计一…

josef约瑟 漏电继电器 LLJ-400F Φ100 分体式结构,导轨安装

LLJ-400F AC660V漏电继电器是一种检测线路触&#xff08;漏&#xff09;电&#xff0c;并发出一个机械开闭信号至控制电路装置。它可与各种规格的低压断路器或交流接触器组成组合式剩余电流动作保护器。在如今已实现了较为完善的农村低压电网分级&#xff08;二级或三级&#x…

Apache Solr <= 8.8.1任意文件读取漏洞复现CVE-2019-17558

一、环境准备 搭建环境vulhub&#xff0c;需要提前安装docker环境 docker安装&#xff1a;docker--安装docker-ce-CSDN博客 vulhub地址&#xff1a;https://github.com/vulhub/vulhub #创建靶场环境 mkdir /opt/vulhub cd /opt/vulhub git https://github.com/vulhub/vulhu…

elementPlus下拉框实现自定义模糊查询且100%匹配的优先展示

效果&#xff1a; 我们可以看到&#xff0c;本来创建时间在创建人之上&#xff0c;但经过我们搜索创建并进行匹配度排序后&#xff0c;创建人的匹配度更高&#xff0c;因此搜索之后&#xff0c;创建人就会显示在创建时间之上。 当然如果100%匹配的同样会优先展示在最上面。 第…

11.1 pcl_ros的点云学习

本文是看了两个博主的内容&#xff0c;整理在这里是为了以后用时方便查找&#xff0c;更容易理解。引用的博文路径如下&#xff1a; ROS入门——PCL激光雷达点云处理&#xff08;1&#xff09;_pcl::torosmsg-CSDN博客 以下功能的实现是我在ubuntu20.04的环境下&#xff0c;搭…

如何制作一本电子版时尚杂志

​随着数字媒体的崛起&#xff0c;电子版时尚杂志已成为一种新的时尚风向标。然而&#xff0c;如何制作一本独具特色的电子版时尚杂志&#xff0c;却让许多初涉此领域的品牌和设计师感到困惑。教你一些方法&#xff0c;制作一本电子版时尚杂志。 一、明确目标与定位 首先&…

C语言调试大作战:与VS编译器共舞,上演一场“捉虫记”的艺术与科学

少年们好&#xff0c;我是博主那一脸阳光&#xff0c;我们接下来介绍C语言的调试和bug的分享。 引言&#xff1a; “如果你曾经在深夜与一串神秘莫测的C代码狭路相逢&#xff0c;彼此瞪大眼睛&#xff0c;犹如牛仔对决般紧张刺激&#xff1b;或者你曾试图驯服一段狂野不羁的循环…

【小黑嵌入式系统第十五课】μC/OS-III程序设计基础(四)——消息队列(工作方式数据通信生产者消费者模型)、动态内存管理、定时器管理

上一课&#xff1a; 【小黑嵌入式系统第十四课】μC/OS-III程序设计基础&#xff08;三&#xff09;——信号量&#xff08;任务同步&资源同步&#xff09;、事件标记组&#xff08;与&或&多个任务&#xff09; 前些天发现了一个巨牛的人工智能学习网站&#xff0c…

【备战蓝桥杯】如何使用Python 内置模块datetime去计算我与CSDN相遇的天数

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-6gfBeOb6YRf7C52d {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

倒计时1天|解锁「PolarDB开发者大会」正确打开方式

1月17日 9:30-16:30 北京嘉瑞文化中心 PolarDB开发者大会 明天就要和大家就见面啦&#xff5e; 大会参会指南现已出炉 各位开发者们&#xff0c;请查收~ &#x1f447;&#x1f447;&#x1f447; 点击 大会主页 or 扫描上方二维码 一键抵达大会官网&#x1f447; 查看…