C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了不太规则的迷宫生成算法2大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

先直接给一个直观的例子:

 _   _   _   _   _   _   _   _ 
  ╲_╱ ╲_╱ ╲_╱ ╲_╱ ╲_╱ ╲_╱ ╲_╱ ╲
╲_  ╲_  ╲    _   _╱  _╱  _╱   ╱
╱   ╱   ╱ ╲_╱ ╲_  ╲   ╲_   _╱ ╲
╲ ╱  _╱ ╲_  ╲ ╱ ╲_  ╲_  ╲_╱  _╱
╱ ╲_╱  _╱ ╲ ╱  _  ╲_╱  _  ╲_  ╲
╲ ╱  _╱   ╱ ╲_╱ ╲   ╲_  ╲_╱  _╱
╱ ╲_╱  _╱ ╲_    ╱ ╲_╱ ╲ ╱ ╲_  ╲
╲_  ╲ ╱  _╱ ╲_╱ ╲ ╱   ╱ ╲   ╲ ╱
╱   ╱ ╲_    ╱  _╱ ╲ ╱   ╱ ╲_  ╲
╲ ╱ ╲_  ╲_╱ ╲_  ╲ ╱ ╲_╱ ╲_  ╲_╱
╱ ╲_╱  _╱ ╲ ╱  _╱ ╲ ╱ ╲_╱  _╱ ╲
╲ ╱ ╲_   _╱ ╲_    ╱   ╱ ╲_  ╲ ╱
╱  _   _╱  _  ╲_╱ ╲_╱   ╱  _╱ ╲
╲ ╱ ╲_╱  _╱ ╲_╱ ╲_  ╲_╱ ╲_  ╲ ╱
╱ ╲ ╱  _╱   ╱   ╱  _╱ ╲_  ╲ ╱ ╲
╲ ╱ ╲_  ╲ ╱ ╲ ╱  _╱  _╱  _╱   ╱
╱ ╲_  ╲ ╱ ╲_  ╲_╱   ╱  _╱ ╲_╱ ╲
╲ ╱   ╱  _╱ ╲_╱ ╲_╱ ╲ ╱ ╲    _╱
╱  _╱ ╲_   _   _   _╱  _  ╲_  ╲
╲_╱ ╲_╱ ╲_╱ ╲_╱ ╲_╱ ╲_╱ ╲_╱ ╲_ 
 
以上的蜂窝形迷宫,看起来已经跳出了一般的矩形模式的框架,
但实际上,我们仍然可以进行转换,使得几乎可以继续套用矩形生成的办法
首先数据结构仍然用的二维数组,但是,表示方式需要变化:
0 0 0 0 0 0 0...
0 0 0 0 0 0 0...
0 0 x 0 x 0 x
0 0 0 x 0 x 0
0 0 x 0 x 0 x
0 0 0 x 0 x 0
0 0 x 0 x 0 x
...
每个x对应着一个六边形,其值有7位有效位,1位访问标志位,6位连通标志位,
它和相邻哪一块连通,就哪个标志位置为1(同时与它相连的那个x对应的位也要标记上)
有效数据矩阵的边界留了2,以保证不会发生访问越界的问题,并且访问标志位置上1
后面就和一般的迷宫生成算法区别不大了。
 
完整生成代码如下:
#include <stdio.h>
#include <String.h>
#include <stdlib.h>
#include <time.h>
 
int yzfY[999][999];
int dxY[][2] = {{-1,-1},{-2,0},{-1,1},{1,{2,-1}};
 
int dfs(int y,int X)
    if (yzfY[y][x]) return 0;
    yzfY[y][x] |= 1;
    int d = rand()&1?5:1;
    for (int f=rand()%6,i=0; i<6; ++i,f=(f+d)%6)
    {
        if (dfs(y+dxY[f][0],x+dxY[f][1]))
            yzfY[y][x] |= 2<<f;
            yzfY[y+dxY[f][0]][x+dxY[f][1]] |= 2<<((f+3)%6);
    return 1;
}
 
void Gen(int w,int h)
    int rw = w*2+3,rh = h*2+3;
    memset(yzfy,sizeof(yzfy));
    for (int y=0; y<rh; ++y)
    {
        yzfY[y][0] = yzfY[y][1] = 1;
        yzfY[y][rw-1] = yzfY[y][rw-2] = 1;
    for (int x=0; x<rw; ++X)
    {
        yzfy[0][x] = yzfY[1][x] = 11;
        yzfY[rh-1][x] = yzfY[rh-2][x] = 1;
    srand(time(NULL));
    dfs(rand()%(w-1)*2+2,rand()%(h-1)*2+2);
    yzfY[2][2] |= 2;
    yzfY[rh-2][rw-2] |= 2;
}
 
int main(int argc,char *argv[])
    int w = 8,h = 10,y,x;
    int rw = w*2+3,rh = h*2+3;
    Gen(w,h);
    for (y=1; y<rh-1; ++y)
    {
        if (y&1)
            for (x=2; x<rw-2; x+=2,printf(" "))
            {
                printf((yzfY[y][x-1]>>3)&1?" ":"╲");
                printf((yzfY[y+1][x]>>2)&1?" ":"_");
                printf((yzfY[y][x+1]>>1)&1?" ":"╱");
            for (x=2; x<rw-2; x+=2)
            {
                if (x>2)printf((yzfY[y+1][x-1]>>2)&1?" ":"_");
                printf(yzfY[y][x]&2?" ":"╱");
                printf((yzfY[y][x]>>3)&1?" ":"╲");
    return 0;
}

大佬总结

以上是大佬教程为你收集整理的不太规则的迷宫生成算法2全部内容,希望文章能够帮你解决不太规则的迷宫生成算法2所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: