Java 星图行星路径算法
我最近一直在尝试用Java创建一个开放空间civ风格的游戏。我希望星图每次都是随机的。玩家只能沿着特定的路径前往不同的星球 我已经能够随机生成一组适合我需要的星星。然而,我一直无法让明星们以一种用户友好和简单的方式相互连接。我的目标是看起来像这样: 我们只能做到这一点: 我目前的算法是每颗星取一个,允许它有1到3个邻居。它选择离它最近的星星作为邻居。这个算法相当简单,但会导致一些明星没有连接到主星群,因此不允许玩家接近他们 我正在寻找一种算法,可以采取一组点(星),并生成一系列的线,这将使一个恒星系统类似于我的第一个图像链接。任何帮助或提示都将不胜感激Java 星图行星路径算法,java,Java,我最近一直在尝试用Java创建一个开放空间civ风格的游戏。我希望星图每次都是随机的。玩家只能沿着特定的路径前往不同的星球 我已经能够随机生成一组适合我需要的星星。然而,我一直无法让明星们以一种用户友好和简单的方式相互连接。我的目标是看起来像这样: 我们只能做到这一点: 我目前的算法是每颗星取一个,允许它有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);
}
}
}
}
arraylists=newarraylist();
s、 添加所有(星星);//添加此区块的星星
for(StarChunk c:chunks)//获取8个相邻的块
{
如果(c==null)
继续;
s、 addAll(c.getStars());
}
迭代器i=stars.Iterator();
while(i.hasNext())
{
布尔值=假;
星=i.下一个();
(星空2:s)
{
如果(star!=star2&&distance(star,star2)<30)//删除太近的星星
{
如果(!已删除)
{
i、 删除();
删除=真;
}
}
}
}
对于(星星:星星)
{
for(Star-star2:Star.getpath())
{
(星空3:s)
{
如果(星3==星)
继续;
for(star4:Star.getpath())
{
如果(Line2D.linesIntersect(star.getX()、star.getY()、star2.getX()、star2.getY()、star3.getX()、star3.getY()、star4.getX()、star4.getY())//删除相交路径-无法完全工作
{
star4.getpath().remove(star3);
star3.getpath().remove(star4);
系统输出打印项次(“删除”);
}
}
}
}
}
for(最后一颗星:星星)
{
Collections.sort(s,新的Comparator()
{
@凌驾
公共整数比较(星号s1、星号s2)
{
返回距离(s1,星)<距离(s2,星)?-1:距离(s1,星)=距离(s2,星)?0:1;
}
});
(星空2:s)
{
if(star2!=star)
{
if(star.getpath().size()
为了帮助您改进算法,您必须提供您的代码。提示:从一个完整的全星图开始,找到最小生成树。