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

在这里插入图片描述


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

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

👨‍💻 本文由 秩沅 原创

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

🅰️



文章目录

    • 🅰️
    • 前言
    • 🎶(==1==)简单的prime算法——十字检测
    • c#版本的十字Prim
    • c++版本的十字Prim
    • Unity版本的十字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");}}

Unity版本的十字Prim


在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:      
//___________功能:  生成迷宫
//___________创建者:_____秩沅_____
//_____________________________________
//-------------------------------------
public class Muze : MonoBehaviour
{const int max = 40;//建立迷宫数组private int[,] mauz = new int [max ,max ];//墙列表private List<int > X = new List<int>();private List<int>  Y = new List<int>();//待加载资源private GameObject m_prefab_tile;private GameObject m_prefab_wall;private void Awake(){//资源加载m_prefab_tile = Resources.Load<GameObject>("prefabs/tile_white");m_prefab_wall = Resources.Load<GameObject>("prefabs/cube_bread");}void Start(){//初始坐标CreatMazu(new Vector2(2,1));}/// <summary>/// 生成迷宫/// </summary>public void CreatMazu( Vector2  position){//step1.设置外墙for (int i = 0; i < max ; i++){mauz[0, i] = 1;mauz[i, 0] = 1;mauz[i, max - 1] = 1;mauz[max - 1, i] = 1;}//step2.将初始位置放入队列当中X.Add((int )position.x);Y.Add((int )position.y);mauz[(int )position.x, (int )position.y] = 1; //它为起点while(X.Count > 0) //当列表里面有值的时候,也代表有墙的时候{//step3:从列表中取判定点int index = Random.Range(0, X.Count - 1); //从墙队列里面随机取一个下标int xPosition = X[index];int yPosition = Y[index];int count = 0;  //路的数量//step4:道路判定for (int i = xPosition - 1; i <= xPosition + 1; i++){for (int j = yPosition - 1; j <= yPosition + 1; j++){if (Mathf.Abs(xPosition - i) + Mathf.Abs(yPosition - j) == 1 && mauz[i, j] > 0){count++;}}}//step5:变成路,添加墙if (count <= 1){mauz[xPosition, yPosition] = 1; //变成路for (int i = xPosition - 1; i <= xPosition + 1; i++){for (int j = yPosition - 1; j <= yPosition + 1; j++){if (Mathf.Abs(xPosition - i) + Mathf.Abs(yPosition - j) == 1 && mauz[i, j] == 0){X.Add(i);Y.Add(j);}}}}//step6:移除列表里面的墙X.RemoveAt(0 + index);Y.RemoveAt(0 + index);}//step7:检测一下设置出口for (int i = max - 3 ; i  > 0 ; i-- ){if(mauz[i,max - 3 ] == 1 ){mauz[i, max - 2] = 1;break;}}//step8:加载迷宫for (int i = 0; i < max ; i++){for (int j = 0; j < max ; j++){if(mauz[i,j] == 0 ){GameObject ob =  Instantiate(m_prefab_wall,new Vector3(i * 0.254f, 0 , j * 0.254f),Quaternion.identity );ob.transform.SetParent(transform);}                }}}
}

🎶(2prime算法生成的效果


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

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

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

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

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

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

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

🅰️


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

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

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

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

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

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

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


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


在这里插入图片描述


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

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

相关文章

Python小白之PyCharm仍然显示“No module named ‘xlwings‘”

Python小白之“没有名称为xlwings‘的模块”-CSDN博客文章浏览阅读8次。cmd 打开命令行&#xff0c;输入python出现>>>的提示格&#xff0c;输入import xlwings 回车&#xff0c;正常报错&#xff1a;No module named xlwings。输入python 回车后&#xff0c;再输入im…

宏观角度认识递归之求根节点到叶节点数字之和

LCR 049. 求根节点到叶节点数字之和 - 力扣&#xff08;LeetCode&#xff09; 理解题意分析子问题&#xff1a;给一个头节点&#xff0c;要返回该头结点左右子树的根结点到叶节点数字和。此处还需注意&#xff1a;在获取根结点到叶节点数字和的时候&#xff0c;要传递一个参数&…

openGauss学习笔记-121 openGauss 数据库管理-设置密态等值查询-使用JDBC操作密态数据库

文章目录 openGauss学习笔记-121 openGauss 数据库管理-设置密态等值查询-使用JDBC操作密态数据库121.1 连接密态数据库121.2 调用isValid方法刷新缓存示例121.3 执行密态等值查询相关的创建密钥语句121.4 执行密态等值查询相关的创建加密表的语句121.5 执行加密表的预编译SQL语…

ACM练习——第三天

今天继续练习C和ACM模式 在写题之前先了解一些新的知识 1.#include <algorithm> #include <algorithm> 是 C 标准库中的头文件之一&#xff0c;其中包含了一系列用于处理各种容器&#xff08;如数组、向量、列表等&#xff09;和其他数据结构的算法。这个头文件提供…

【Liunx】DHCP服务

【Liunx】DHCP服务 DHCP概述A.安装dhcpB.查看配置文件C.修改配置文件 DHCP概述 DHCP(Dynamic Host Configuration Protocol)i动态主机配置协议 DHCP是由Internet工作任务小组设计开发的&#xff0c;专门用于为TCP/IP网络中的计算机自动分配TCP/IP参数的协议。 口使用DHCP服务的…

使用PHP编写采集药品官方数据的程序

目录 一、引言 二、程序设计和实现 1、确定采集目标 2、使用PHP的cURL库进行数据采集 3、解析JSON数据 4、数据处理和存储 5、数据验证和清理 6、数据输出和可视化 7、数据分析和挖掘 三、注意事项 1、合法性原则 2、准确性原则 3、完整性原则 4、隐私保护原则 …

【避雷帖!】安美酷便携屏(安美特)

强烈建议别购买京东安美酷便携屏&#xff0c;太脆弱了&#xff0c;一碰就坏&#xff0c;客服态度不行&#xff0c;容易闪屏等等缺点。而且价格偏贵&#xff0c;淘宝上两百块的屏幕足够用了&#xff0c;没必要花六百多块钱&#xff0c;如果就是买来打游戏的话&#xff0c;也用不…

Adobe 2023 全家桶最终版,一键安装,永久免费,赶紧收藏!(win/mac)

文件名称 Adobe 2023 全家桶最终版 支持系统 windows、mac 获取方式 文章底部 分享形式 百度网盘 小励花了一天的时间给大家整理上传了这份最终版全家桶&#xff0c;全部一键安装即可&#xff0c;无需激活&#xff0c;安装以后即可永久使用&#xff0c;觉得给力的小伙伴…

1688往微信小程序自营商城铺货商品采集API接口

一、背景介绍 随着移动互联网的快速发展&#xff0c;微信小程序作为一种新型的电商形态&#xff0c;正逐渐成为广大商家拓展销售渠道、提升品牌影响力的重要平台。然而&#xff0c;对于许多传统企业而言&#xff0c;如何将商品信息快速、准确地铺货到微信小程序自营商城是一个…

VMware 安装CentOS7

一、软件准备 VMware 虚拟机安装 官网下载链接&#xff1a;VMware pro 17 下载链接 下载 VMware Workstation Pro | CN vm安装教学就不在细说&#xff0c;纯傻瓜式安装 Centos 7镜像文件下载 下载地址&#xff1a; Index of /centos/ | 清华大学开源软件镜像站 | Tsinghua O…

算法笔记——递归(1)

这里写目录标题 递归的思想序列求最大值翻转字符串斐波那契数列数塔回文字符串上楼汉诺塔棋盘覆盖问题数字螺旋矩阵盒分形 递归的思想 子问题须与原始问题为同样的事&#xff0c;且更为简单。 不能无限制地调用本身&#xff0c;须有个出口&#xff0c;化简为非递归状况处理 序…

【中间件篇-Redis缓存数据库05】Redis集群高可用高并发

Redis集群 Redis Cluster是Redis的分布式解决方案&#xff0c;在3.0版本正式推出&#xff0c;有效地解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时&#xff0c;可以采用Cluster架构方案达到负载均衡的目的。之前,Redis分布式方案一般有两种: 1、客户端分…

【unity插件】Shader实现UGUI的特效——UIEffect为 Unity UI 提供视觉效果组件

文章目录 前言地址描述Demo 演示Installation 安装如何玩演示用法使用示例完结 前言 一般的shader无法直接使用在UI上&#xff0c;需要在shader中定义特定的面板参数&#xff0c;今天就来推荐github上大佬做的一套开源的一系列UGUI&#xff0c;Shader实现的特效——UIEffect 为…

KODExplorer中ace.js代码编辑器中自定义PHP提示片段

目录 KODExplorerace.js参考 KODExplorer 这是搭建云盘工具&#xff0c;该工具可以作为在线开发工具使用&#xff0c;其中使用了ace.js作为编辑器&#xff0c;这里主要讲解ace.js编辑器中如何自定义代码提示下载旧版本&#xff0c;再升级到新版本&#xff0c;直接下载新版本没…

【Axure高保真原型】3D饼图_移入显示数据标签

今天和大家分享3D饼图_移入显示数据标签的原型模板&#xff0c;鼠标移入扇形区域时&#xff0c;对应区域会变绿&#xff0c;可以查看该区域对应的项目、数据和占比&#xff0c;这个原型模板是用Axure原生元件制作的&#xff0c;所以无需联网&#xff0c;而且可以自由修改样式、…

4种互斥机制比较

4种互斥机制 关中断禁止任务切换信号量互斥信号量 关中断 关中断&#xff08;Disable Interrupts&#xff09;&#xff1a;通过禁用中断来实现互斥。在关中断期间&#xff0c;任何中断请求都会被忽略&#xff0c;从而确保了临界区的独占性。然而&#xff0c;这种方法会导致系统…

基于Python实现汽车销售数据可视化【500010086】

导入模块 import numpy as np import pandas as pd import plotly.graph_objects as go import plotly.express as px获取数据 df1 pd.read_excel(r"./data/中国汽车总体销量.xlsx") print(df1.head(5))df1.info()df1[年份] df1[时间].dt.year df1[月份] df1[时…

Fourier分析导论——第5章——实数据R上的Fourier变换(E.M. Stein R. Shakarchi)

第5章 实数域ℝ上的Fourier变换 The theory of Fourier series and integrals has always had major difficulties and necessitated a large math- ematical apparatus in dealing with questions of con- vergence. It engendered the development of methods of summa…

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 {…

android studio开发flutter应用,使用mumu模拟器调试软件

安装好mumu模拟器&#xff0c;先打开网易mumu模拟器的开发者模拟。系统应用 > 设置 > 关于手机 > 版本号 多点击几次调出开发者模式&#xff1a; 然后找到mumu模拟器的安装目录&#xff0c;找到shell文件夹里面的adb.exe&#xff0c;然后执行命令&#xff1a; adb co…