我最近一直试图用Java创建一个开放空间的文明风格游戏。我希望星图每次都是随机的。玩家应该只能沿着某些路径前往不同的行星。
我已经能够随机生成一组适合我需要的星星。但是,我无法让星星以一种看起来用户友好和简单的方式相互连接。我的目标是看起来像这样: http://philip.bladen.me.uk/java/ExampleStarmap.png 并且只能实现这一目标: http://philip.bladen.me.uk/java/Starmap.png
我当前的算法采用每个星,并允许它有1到3个邻居。它为邻居挑选最近的星星。这个算法相当简单但导致一些星星没有连接到主星组,因此不允许玩家到达它们。
我正在寻找一种算法,它可以采用一组点(星星)并生成一个行列表,这些行将使星系与我的第一个图像链接类似。任何帮助或提示将不胜感激!
ArrayList<Star> s = new ArrayList<Star>();
s.addAll(stars); // Add this chunk's stars
for (StarChunk c : chunks) // Get the 8 neighboring chunks
{
if (c == null)
continue;
s.addAll(c.getStars());
}
Iterator<Star> i = stars.iterator();
while (i.hasNext())
{
boolean removed = false;
Star star = i.next();
for (Star star2 : s)
{
if (star != star2 && distance(star, star2) < 30) // Remove stars that are too close
{
if (!removed)
{
i.remove();
removed = true;
}
}
}
}
for (Star star : stars)
{
for (Star star2 : star.getPaths())
{
for (Star star3 : s)
{
if (star3 == star)
continue;
for (Star star4 : star.getPaths())
{
if (Line2D.linesIntersect(star.getX(), star.getY(), star2.getX(), star2.getY(), star3.getX(), star3.getY(), star4.getX(), star4.getY())) // Remove intersecting paths - doesn't fully work
{
star4.getPaths().remove(star3);
star3.getPaths().remove(star4);
System.out.println("Removed");
}
}
}
}
}
for (final Star star : stars)
{
Collections.sort(s, new Comparator<Star>()
{
@Override
public int compare(Star s1, Star s2)
{
return distance(s1, star) < distance(s2, star) ? -1 : distance(s1, star) == distance(s2, star) ? 0 : 1;
}
});
for (Star star2 : s)
{
if (star2 != star)
{
if (star.getPaths().size() < star.capacity && star2.getPaths().size() < star2.capacity)
{
star.addNearby(star2); // Add a path between star and star2
star2.addNearby(star);
}
}
}
}