Starmap行星路径算法

时间:2014-07-11 14:03:28

标签: java

我最近一直试图用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);
                }
            }
        }
    }

0 个答案:

没有答案