【游戏开发算法每日一记】使用随机prime算法生成错综复杂效果的迷宫(C#和C++)

在这里插入图片描述


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏:Unity基础实战

🅰️



文章目录

    • 🅰️
    • 前言
    • 🎶(==1==)简单的prime算法——十字检测
    • c#版本的十字Prim
    • c++版本的十字Prim
    • 🎶(==2==)prime算法生成的效果
    • 🅰️


前言


🎶(1简单的prime算法——十字检测


在这里插入图片描述

在这里插入图片描述

  • 1.首先全部判定为墙,最外的为路包裹墙(类似于防止数组越界
    在这里插入图片描述
  • 2.红色为它的检测范围(假设检测点在如图所示的位置)———(可先忽略此步骤)

——————在这里插入图片描述

  • 3.该检测点(紫色)需要在起点的旁边或者外墙旁边,已保证它可以生成主路线而不是死迷宫
    在这里插入图片描述
    在这里插入图片描述
  • 4.生成后是这样的,没有出口,它不会自动打破墙
    在这里插入图片描述
  • 5,所以需要我们自己检测一波打出一个出口

在这里插入图片描述

  • 运行结果
    在这里插入图片描述

c#版本的十字Prim

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace algorithm
{/// <summary>/// 该Prom算法,初始化时全部是墙/// </summary>class PrimOfAlgorithm{public const int max = 40;int[,] Maze = new int[max  , max ];  //默认全为0 ,全为墙Random random = new Random();//X和Y方向的队列List<int> X = new List<int>();List<int> Y = new List<int>();/// <summary>/// 生成迷宫/// </summary>public  void CreatMap(){//设置迷宫进口Maze[2, 1] = 1;//将最外围设置为路,包裹最外层的的墙,防止出界for (int i = 0; i < max; i++){Maze[i ,0]= 1;Maze[i, max - 1] = 1;Maze[0, i] = 1;Maze[max - 1, i] = 1;  }//设置一个坐标.该检测点需要在起点的旁边,或者旁边是外围路X.Add (2);Y.Add (2);while( Y.Count > 0){int index = random.Next(0, X.Count - 1); //随机性则有错综复杂的效果int xPosition=  X[index];int yPosition = Y[index];//判断上下左右是否有路int count = 0;for (int i = xPosition - 1; i <= xPosition + 1; i++) //左右位置{for (int j = yPosition - 1; j <= yPosition + 1; j++) //上下位置{//判断它是不是十字检测中的点,和判断它是否为路if (Math.Abs(xPosition - i) + Math.Abs(yPosition - j) == 1 && Maze[i,j] > 0) {++count; //路++  }}}//如果十字检测的路标记少于或等于1条?(为甚不直接小于1呢,因为它要保证生成一条主路)if (count <= 1){//将此刻的位置变成路Maze[xPosition, yPosition] = 1;for (int i = xPosition - 1; i <= xPosition + 1; i++){for (int j = yPosition - 1; j <= yPosition + 1; j++){//判断它是不是十字检测中的点并且是墙if (Math.Abs(xPosition - i) + Math.Abs(yPosition - j) == 1 && Maze[i, j] == 0){//把十字检测到的墙放入XY墙列表X.Add(i);Y.Add(j);}}}}//删除列表中已经变成路的点X.RemoveAt(0 + index );Y.RemoveAt(0 + index ); //记住不能是Remove}//设置迷宫出口(出口不可能是四个底脚)for (int i = max - 3; i >= 0; i--){if (Maze[i, max - 3] == 1){Maze[i, max - 2] = 1;break;}}//画迷宫for (int i = 0; i < max; i++){for (int j = 0; j < max; j++){if (Maze[i, j] == 1)Console.Write("  ");elseConsole.Write("囚");}Console.WriteLine();}}static void Main(string[] args){PrimOfAlgorithm aa = new PrimOfAlgorithm();aa.CreatMap();}}}

c++版本的十字Prim


#include <iostream>
#include<vector>
#include <windows.h>
using namespace std;
static const int L = 44;
void CreateMaze();
int main()
{CreateMaze();
}void CreateMaze() {int Maze[L][L] = { 0 };vector<int> X;vector<int> Y;//最外围设置为路,可以有效的保护里面一层墙体,并防止挖出界for (int i = 0; i < L; i++) {Maze[i][0] = 1;Maze[0][i] = 1;Maze[L - 1][i] = 1;Maze[i][L - 1] = 1;}//设置迷宫进口Maze[2][1] = 1;//任取初始值X.push_back(2);Y.push_back(2);//当墙队列为空时结束循环while (X.size()) {//在墙队列中随机取一点int r = rand() % X.size();int x = X[r];int y = Y[r];//判读上下左右四个方向是否为路int count = 0;for (int i = x - 1; i < x + 2; i++) {	for (int j = y - 1; j < y + 2; j++) {if (abs(x - i) + abs(y - j) == 1 && Maze[i][j] > 0) {++count;}}}if (count <= 1) {Maze[x][y] = 1;//在墙队列中插入新的墙for (int i = x - 1; i < x + 2; i++) {for (int j = y - 1; j < y + 2; j++) {if (abs(x - i) + abs(y - j) == 1 && Maze[i][j] == 0) {X.push_back(i);Y.push_back(j);}}}}//删除当前墙X.erase(X.begin() + r);Y.erase(Y.begin() + r);}//设置出口 (从最下往上面判断)for (int i = L - 3; i >= 0; i--) {if (Maze[i][L - 3] == 1) {Maze[i][L - 2] = 1;break;}}//画迷宫for (int i = 0; i < L; i++){for (int j = 0; j < L; j++) {if (Maze[i][j] == 1) printf("  ");else printf("囚");}printf("\n");}}

🎶(2prime算法生成的效果


迷宫相对比较自然,但迷宫的分岔路会比较多,适合生成错综复杂的地图效果,主路不是特别明显

  • 初始化大地图,0代表墙,1代表道路,墙为地图边缘包裹

  • 靠近地图边缘随机选取状态为1的道路点,作为出生点a

  • 然后将 a 点周围所有的墙体点标记为待检测点,加入到待检测集合

  • 从待检测集合随机取一个点 b ,判断顺着它方向的下一个点 c,是否是道路

  • 如果是,则将这个待检测点墙体打通,将其移出待检测集合;将下一个点 c作为新的起点,重新执行第3步

  • 如果不是就把这个待检测点移出待检测集合,重新作为墙体点
    不断重复,直到待检测集合全部检查过,重新为空
    在这里插入图片描述

🅰️


⭐【Unityc#专题篇】之c#进阶篇】

⭐【Unityc#专题篇】之c#核心篇】

⭐【Unityc#专题篇】之c#基础篇】

⭐【Unity-c#专题篇】之c#入门篇】

【Unityc#专题篇】—进阶章题单实践练习

⭐【Unityc#专题篇】—基础章题单实践练习

【Unityc#专题篇】—核心章题单实践练习


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述


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

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

相关文章

无人机航迹规划:五种最新智能优化算法(COA、SWO、KOA、GRO、LO)求解无人机路径规划MATLAB

一、五种算法&#xff08;LSO、SWO、KOA、GRO、LO&#xff09;简介 1、小龙虾优化算法COA 小龙虾优化算法&#xff08;Crayfsh optimization algorithm&#xff0c;COA&#xff09;由Jia Heming 等人于2023年提出&#xff0c;该算法模拟小龙虾的避暑、竞争和觅食行为&#xf…

windows安装composer并更换国内镜像

第一步、官网下载 下载地址 Composer安装https://getcomposer.org/Composer-Setup.exe第二步、双击安装即可 第三步选择 php安装路径并配置path 第四步、 composer -v查看安装是否成功&#xff0c;出现成功界面 第五步、查看镜像地址并更换&#xff08;composer国内可能较慢…

Java通过JNI技术调用C++动态链接库的helloword测试

JNI调用原理 原理就不细说了&#xff0c;其实就是写个库给Java调&#xff0c;可以百度一下Java JNI&#xff0c;下面是HelloWorld代码测试 编写一个本地测试类 package com.my.study.cpp_jni;/*** 测试Java调用C库* <p>使用命令javac -h . NativeTest.java自动生成C头…

CTFhub-RCE-读取源代码

源代码&#xff1a; <?php error_reporting(E_ALL); if (isset($_GET[file])) { if ( substr($_GET["file"], 0, 6) "php://" ) { include($_GET["file"]); } else { echo "Hacker!!!"; } } else {…

塑料质量检测是确保产品制造和装配过程的关键环节

激光塑料透光率检测是一种有效的塑料材料特性检测方法。在激光束通过上层透明材料后&#xff0c;被下层材料吸收。上层材料可以是透明的或者是有颜色的&#xff0c;但是必须能够保证有足够的激光通过。 塑料质量检测是确保产品制造和装配过程的关键环节。通过激光塑料透光率检测…

手机地磁传感器与常见问题

在手机中&#xff0c;存在不少传感器&#xff0c;例如光距感&#xff0c;陀螺仪&#xff0c;重力加速度&#xff0c;地磁等。关于各传感器&#xff0c;虽功能作用大家都有所了解&#xff0c;但是在研发设计debug过程中&#xff0c;却总是会遇到很多头疼的问题。关于传感器&…

SPSS时间序列分析:序列图

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

从0到0.01入门React | 006.精选 React 面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

ubuntu上安装edge浏览器

1下载edge浏览器 官网下载 edge浏览器的linux版本可在上面的官网中寻找。 我选择的是Linux(.deb)。 2 安装 可在终端的edge安装包所在的路径下输入下面命令安装。 sudo dpkg -i edge安装包的名称.deb3 安装可能存在的问题 1dpkg:依赖关系问题使得edge-stable的配置工作不…

PSP - 蛋白质复合物结构预测 Template Pair 特征 Mask 可视化

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/134333419 在蛋白质复合物结构预测中&#xff0c;在 TemplatePairEmbedderMultimer 层中 &#xff0c;构建 Template Pair 特征的源码&#xff0c…

Elastic Observability 8.11:ES|QL、APM 中的通用分析和增强的 SLOs

作者&#xff1a;Tom Grabowski, Katrin Freihofner, Israel Ogbole Elastic Observability 8.11 引入了 ES|QL for Observability&#xff08;技术预览版&#xff09;、Universal ProfilingTM 和 Elastic APM 集成&#xff0c;以及针对 Elastic Observability 的新 SLO &#…

ZYNQ_project:ram_dual_port

伪双端口ram&#xff1a;写端口&#xff1a;clk_w,en_A,we_A,addr_A,din_A;读端口:clk_r,en_B,addr_B;dout_B. 设计读写模块&#xff0c;写入256个数据&#xff0c;再读出256个数据。 输入时钟100Mhz&#xff0c;输出时钟50Mhz。 多bit数据&#xff0c;高速时钟域到低速时钟…

二十六、W5100S/W5500+RP2040树莓派Pico<WOL示例>

文章目录 1 前言2 简介2 .1 什么是Wake on LAN&#xff1f;2.2 Wake on LAN的优点2.3 Wake on LAN数据交互原理2.4 Wake on LAN应用场景 3 WIZnet以太网芯片4 Wake on LAN示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关…

具名挂载和匿名挂载

匿名卷挂载 &#xff1a; -v 的时候只指定容器内的路径 如下面这个&#xff1a;/etc/nginx 1.docker run -d -P --name nginx -v /etc/nginx nginx 2.查看所有卷 docker volume ls 这里发现&#xff0c;这就是匿名挂载&#xff0c;只指定容器内的路径&#xff0c;没有指定…

平安人寿基于 Apache Doris 统一 OLAP 技术栈实践

导读&#xff1a;平安人寿作为保险行业领军企业&#xff0c;坚持技术创新&#xff0c;以数据业务双轮驱动的理念和更加开放的思路来应对不断增长的数据分析和应用需求&#xff1b;以深挖数据价值、保障业务用数效率为目标持续升级大数据产品体系。自 2022 年起平安人寿开始引入…

某城高速综合管控大数据大屏可视化【可视化项目案例-04】

🎉🎊🎉 你的技术旅程将在这里启航! 🚀🚀 本文选自专栏:可视化技术专栏100例 可视化技术专栏100例,包括但不限于大屏可视化、图表可视化等等。订阅专栏用户在文章底部可下载对应案例源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不…

notes_质谱蛋白组学数据分析基础知识

目录 1. 蛋白组学方法学1.1 液相-质谱法1) 基本原理2) bottom-up策略的基本流程 1.2 PEA/Olink 2. 质谱数据分析2.1 原始数据格式2.2 分析过程1&#xff09;鉴定搜索引擎&#xff08;质谱组学&#xff09;重难点/潜在的研究方向 2&#xff09;定量3&#xff09;预处理 2.3 下游…

MySQL 批量修改表的列名为小写

1、获取脚本 SELECT concat( alter table , TABLE_NAME, change column , COLUMN_NAME, , lower( COLUMN_NAME ), , COLUMN_TYPE, comment \, COLUMN_COMMENT, \; ) AS 脚本 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA 数据库名 and TABLE_NAME表名-- 大写是up…

22.斐波那契数列数列前20项.

#include<stdio.h>int main(){int i,sum1; int a[100];a[0]0;a[1]1;for(i2;i<20;i){a[i]a[i-1]a[i-2]; sumsuma[i];}printf("斐波那契数列的前20项和为&#xff1a;%d",sum);return 0;}

【Linux进程】进程控制

目录 一、进程创建 1.2 fork函数初识 1.2 fork函数返回值 1.3 写时拷贝 1.4 fork常规用法 1.5 fork调用失败的原因 二、进程终止 2.1 进程退出场景 2.2 进程退出码 2.2.1 用strerror打印错误信息 2.2.2 errno全局变量 2.3 进程常见退出方法 2.3.1 进程正常退出 2…