这里我有一个程序正在创建一个恒星和行星的地图。它通过以下方式实现:
indexMap[][]
。这对于地图上的每个x和y坐标都是简单的意思,它会从1开始向前计数。e.g. indexMap[0][0] = 1, indexMap[1][0] = 2. indexMap[2][0] = 3... etc.
Map<Integer, Systems> map
的形式出现,Systems是一个java类,它存储象限数的值,正文的类型(即行星)及其x和y坐标,而Integer是来自的当前索引。正在检查的indexMap[][]
。这一切似乎都很好,但是当我遍历我的所有系统(第48行)时,我遇到了问题。根据下面的控制台日志,在创建的6颗星和42颗行星中,迭代时只发现了5颗行星和1颗恒星。此外,值得注意的是,它们都是同一象限的一部分,即便如此,如果你要计算实际上在象限6中的行星数量,并不是所有的物体都能找到那个象限。
我是否正在不正确地进行迭代,或者是否还有另一个我无法预见的问题?
CODE
public class Systems
{
public float x, y;
public int body, quadNum;
public Systems(int quadNum, int body, float x, float y)
{
this.quadNum = quadNum;
this.body = body;
this.x = x;
this.y = y;
}
}
public class UniverseGen
{
private float chanceNum, systemChance = 0.02f, planetChance = 0.1f;
private Map<Integer, Systems> map = new HashMap<Integer, Systems>();
public int[][] indexMap;
private int indexWidth, indexHeight;
public int quadNum = 1;
private int numOfStars = 0, numOfPlanets = 0;
private int space = 0, star = 1, planet = 2;
public Map<Integer, Systems> initMap(int width, int height)
{
indexWidth = width / BodyManager.TILE_WIDTH;
indexHeight = height / BodyManager.TILE_HEIGHT;
indexMap = new int[indexWidth][indexHeight];
//Create Index Array
System.out.println("Creating Index Array...");
int indexCount = 0;
for (int y=0; y<indexMap[0].length; y++)
{
for (int x=0; x<indexMap.length; x++)
{
indexMap[x][y] = indexCount;
indexCount++;
}
}
//Create Quadrants
System.out.println("Creating Quadrants...");
for (int y=0; y<indexHeight; y++)
{
for (int x=0; x<indexWidth; x++)
{
createQuadrants(x, y);
}
}
System.out.println("Number of Stars: " + numOfStars);
System.out.println("Number of Planets: " + numOfPlanets);
for (Systems s : map.values())
{
if (s.body != 0)
{
System.out.println("Body: " + s.body + " Quadrant: " + s.quadNum + " x, y:" + s.x + ", " + s.y);
}
}
return map;
}
private void createQuadrants(int x, int y)
{
int tileX = x * BodyManager.TILE_WIDTH;
int tileY = y * BodyManager.TILE_HEIGHT;
int planetCount = 0;
if (x <= 0 || y <= 0 || x >= indexWidth || y >= indexHeight)
{
map.put(indexMap[x][y], new Systems(0, space, tileX, tileY));
}
else if (randomChance() <= systemChance && checkSystems(x, y))
{
System.out.println("Star: " + tileX + ", " + tileY + " Quad: " + quadNum);
//Create Quadrant
for (int i=-20; i<=20; i++)
{
for (int j=-20; j<=20; j++)
{
//Surrounding tiles
int newX = (tileX + (i * BodyManager.TILE_WIDTH));
int newY = (tileY + (j * BodyManager.TILE_HEIGHT));
//If outside world boundaries, skip
if (x + i <= 0 || y + j <= 0 || x + i >= indexWidth || y + j >= indexHeight)
continue;
//Create star at origin of system
else if (i == 0 && j == 0)
{
map.put(indexMap[x + i][y + j], new Systems(quadNum, star, tileX, tileY));
}
//When checking one tile outside the origin, create space
else if (i >= -1 && i <= 1 && j >= -1 && j <= 1)
map.put(indexMap[x + i][y + j], new Systems(quadNum, space, newX, newY));
//If planet parameters work out, create planet
else if (i >= -6 && i <= 6 && j >= -6 && j <= 6 &&
planetCount <= 6 &&
randomChance() <= planetChance &&
checkPlanets(x, y))
{
System.out.println("Planet: " + newX + ", " + newY);
map.put(indexMap[x + i][y + j], new Systems(quadNum, planet, newX, newY));
planetCount++;
numOfPlanets++;
}
//If none of these create space
else
map.put(indexMap[x + i][y + j], new Systems(quadNum, space, newX, newY));
}
}
numOfStars++;
quadNum++;
}
else
{
//Set to empty object
map.put(indexMap[x][y], new Systems(0, space, tileX, tileY));
}
}
//Some code has been deleted to shorten this post
这是控制台输出:
Creating Index Array...
Creating Quadrants...
Star: 1000, 840 Quad: 1
Planet: 880, 880
Planet: 900, 940
Planet: 920, 840
Planet: 920, 900
Planet: 920, 920
Planet: 940, 740
Planet: 980, 900
Star: 900, 860 Quad: 2
Planet: 820, 860
Planet: 840, 820
Planet: 860, 860
Planet: 880, 820
Planet: 880, 980
Planet: 900, 940
Planet: 920, 900
Star: 1080, 860 Quad: 3
Planet: 980, 780
Planet: 980, 840
Planet: 1040, 760
Planet: 1040, 820
Planet: 1060, 920
Planet: 1080, 940
Planet: 1120, 740
Star: 900, 880 Quad: 4
Planet: 780, 880
Planet: 800, 880
Planet: 800, 980
Planet: 840, 960
Planet: 860, 960
Planet: 880, 820
Planet: 880, 920
Star: 1020, 880 Quad: 5
Planet: 900, 940
Planet: 920, 760
Planet: 920, 1000
Planet: 940, 760
Planet: 940, 800
Planet: 960, 840
Planet: 960, 960
Star: 1060, 1160 Quad: 6
Planet: 940, 1060
Planet: 940, 1080
Planet: 940, 1280
Planet: 980, 1060
Planet: 980, 1080
Planet: 1000, 1100
Planet: 1020, 1240
Number of Stars: 6
Number of Planets: 42
Body: 2 Quadrant: 6 x, y:940.0, 1060.0
Body: 2 Quadrant: 6 x, y:980.0, 1060.0
Body: 2 Quadrant: 6 x, y:940.0, 1080.0
Body: 2 Quadrant: 6 x, y:980.0, 1080.0
Body: 2 Quadrant: 6 x, y:1000.0, 1100.0
Body: 1 Quadrant: 6 x, y:1060.0, 1160.0
答案 0 :(得分:0)
我找到了解决此问题的方法。感谢@aro_tech让我走上正轨。
我不会详细介绍,但我必须分别从地图本身访问象限编号,并修复了我在这篇文章中编辑过的checkSystems()
方法的一些问题。