Dobrý den,
v následujícím algoritmu potřebuji nasadit do bludiště i monstra:
public static Maze Generate(int width, int height, int monstersCount)
{
bool enableChange = true;
bool[,] tile = new bool[width, height];
Maze output = new Maze() { Monsters = new Monster[monstersCount] };
int
index, x1, y1, x2, y2,
gateX = numberGenerator.Next(width),
gateY = numberGenerator.Next(height);
sbyte
differenceX = 0,
differenceY = 0;
List<Point> path = new List<Point>()
{
new Point(gateX, gateY)
};
tile[gateX, gateY] = true;
while(path.Count > 0)
{
Point currentPath = path[index = numberGenerator.Next(path.Count)];
differenceX = 2;
enableChange = true;
if(TestOfTile(tile, width, height, currentPath.X, currentPath.Y + 2))
{
differenceX = 0;
differenceY = 1;
enableChange = numberGenerator.Next(2) == 1;
}
if(enableChange && TestOfTile(tile, width, height, currentPath.X, currentPath.Y - 2))
{
differenceX = 0;
differenceY = -1;
enableChange = numberGenerator.Next(2) == 1;
}
if(enableChange && TestOfTile(tile, width, height, currentPath.X + 2, currentPath.Y))
{
differenceX = 1;
differenceY = 0;
enableChange = numberGenerator.Next(2) == 1;
}
if(enableChange && TestOfTile(tile, width, height, currentPath.X - 2, currentPath.Y))
{
differenceX = -1;
differenceY = 0;
enableChange = numberGenerator.Next(2) == 1;
}
if(differenceX == 2)
path.RemoveAt(index);
else
{
x1 = currentPath.X + differenceX;
y1 = currentPath.Y + differenceY;
tile[x1, y1] = true;
x2 = x1 + differenceX;
y2 = y1 + differenceY;
x1 = x2 + differenceX;
y1 = y2 + differenceY;
if
(
x1 < 0 || x1 == width ||
y1 < 0 || y1 == height ||
!tile[x1, y1]
)
{
tile[x2, y2] = true;
path.Add(new Point(x2, y2));
}
}
}
output.Path = tile;
output.Exit = new Gate(GateType.Gate1Right, gateX, gateY);
output.Hero = new Monster(MonsterType.Hero, gateX, gateY, width, height, tile);
return output;
}
static bool TestOfTile(bool[,] tile, int width, int height, int x, int y)
{
return
x >= 0 && x < width &&
y >= 0 && y < height &&
!tile[x, y];
}
Hlavním výstupem je pole příznaků - kde se má vykreslit textura cesty. Můj problém - potvory musí být rozmístěny rovnoměrně, musím znát jejich výchozí směr a bylo by vcelku přívětivé, kdyby hrdina byl co nejdál od brány - hlavního cíle levelu. Algoritmus bych popsal stylem - jdi od výchozího bodu všemi směry, kterými to jde - bez zkřížení s jinými cestami... Napadá mne jediné, avšak složité řešení - dát všem monstrum pevnou počáteční pozici a všechny budou chodit po bludišti, dokud nesplní propracovanou podmínku - načež se zastaví...
Děkuji.
Výsledek zde:
https://www.facebook.com/photo.php?fbid=756237081086851&set=gm.654374731305325&type=1