java生成迷宫prim_[迷宫中的算法实践]迷宫生成算法——Prim算法

该博客介绍了如何使用Prim算法在Java中生成迷宫。文章详细阐述了算法的实现步骤,包括迷宫尺寸和起点的合法化、空白迷宫的生成、邻墙列表的维护以及随机联通格子的过程。
摘要由CSDN通过智能技术生成

///

///普利姆迷宫生成法///

/// 起始点X坐标

/// 起始点Y坐标

/// 迷宫宽度

/// 迷宫高度

/// 迷宫是否含有墙

private int[,] Prim(int startX, int startY, int widthLimit, int heightLimit,boolhaveBorder)

{//block:不可通行 unBlock:可通行

const int block = 0,unBlock = 1;var r=newRandom();//迷宫尺寸合法化

if (widthLimit < 1)

widthLimit= 1;if (heightLimit < 1)

heightLimit= 1;//迷宫起点合法化

if (startX < 0 || startX >=widthLimit)

startX= r.Next(0, widthLimit);if (startY < 0 || startY >=heightLimit)

startY= r.Next(0, heightLimit);//减去边框所占的格子

if (!haveBorder)

{

widthLimit--;

heightLimit--;

}//迷宫尺寸换算成带墙尺寸

widthLimit *= 2;

heightLimit*= 2;//迷宫起点换算成带墙起点

startX *= 2;

startY*= 2;if(haveBorder)

{

startX++;

startY++;

}//产生空白迷宫

var mazeMap = new int[widthLimit + 1, heightLimit + 1];for (int x = 0; x <= widthLimit; x++)

{//mazeMap.Add(new BitArray(heightLimit + 1));

for (int y = 0; y <= heightLimit; y++)

{

mazeMap[x, y]=block;

}

}//邻墙列表

var blockPos = new List();//将起点作为目标格

int targetX = startX, targetY =startY;//将起点标记为通路

mazeMap[targetX, targetY] =unBlock;//记录邻墙

if (targetY > 1)

{

blockPos.AddRange(new int[] { targetX, targetY - 1, 0});

}if (targetX

{

blockPos.AddRange(new int[] { targetX + 1, targetY, 1});

}if (targetY

{

blockPos.AddRange(new int[] { targetX, targetY + 1, 2});

}if (targetX > 1)

{

blockPos.AddRange(new int[] { targetX - 1, targetY, 3});

}while (blockPos.Count > 0)

{//随机选一堵墙

var blockIndex = r.Next(0, blockPos.Count / 3) * 3;//找到墙对面的墙

if (blockPos[blockIndex + 2] == 0)

{

targetX=blockPos[blockIndex];

targetY= blockPos[blockIndex + 1] - 1;

}else if (blockPos[blockIndex + 2] == 1)

{

targetX= blockPos[blockIndex] + 1;

targetY= blockPos[blockIndex + 1];

}else if (blockPos[blockIndex + 2] == 2)

{

targetX=blockPos[blockIndex];

targetY= blockPos[blockIndex + 1] + 1;

}else if (blockPos[blockIndex + 2] == 3)

{

targetX= blockPos[blockIndex] - 1;

targetY= blockPos[blockIndex + 1];

}//如果目标格未连通

if (mazeMap[targetX, targetY] ==block)

{//联通目标格

mazeMap[blockPos[blockIndex], blockPos[blockIndex + 1]] =unBlock;

mazeMap[targetX, targetY]=unBlock;//添加目标格相邻格

if (targetY > 1 && mazeMap[targetX, targetY - 1] == block && mazeMap[targetX, targetY - 2] ==block)

{

blockPos.AddRange(new int[] { targetX, targetY - 1, 0});

}if (targetX < widthLimit && mazeMap[targetX + 1, targetY] == block && mazeMap[targetX + 2, targetY] ==block)

{

blockPos.AddRange(new int[] { targetX + 1, targetY, 1});

}if (targetY < heightLimit && mazeMap[targetX, targetY + 1] == block && mazeMap[targetX, targetY + 2] ==block)

{

blockPos.AddRange(new int[] { targetX, targetY + 1, 2});

}if (targetX > 1 && mazeMap[targetX - 1, targetY] == block && mazeMap[targetX - 1, targetY] ==block)

{

blockPos.AddRange(new int[] { targetX - 1, targetY, 3});

}

}

blockPos.RemoveRange(blockIndex,3);

}returnmazeMap;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值