我正在製作分形地形,但不管做什麼嘗試,它總是會看起來完全隨機。我一直遵循here中所述的鑽石和方塊算法。我能做些什麼來解決這個問題?鑽石和方塊算法不起作用
這是我的地形類別:
package game;
import java.util.Random;
public class Terrain {
Panel panel;
public Terrain(Panel panel) {
this.panel = panel;
generateTerrain();
}
private void generateTerrain() {
Random rand = new Random();
int seed = rand.nextInt(panel.colors.length);
int sideLength = panel.mapSize - 1;
int halfSideLength;
int average;
panel.map[0][0] = seed;
panel.map[panel.mapSize - 1][0] = seed;
panel.map[0][panel.mapSize - 1] = seed;
panel.map[panel.mapSize - 1][panel.mapSize - 1] = seed;
while (sideLength > 0) {
halfSideLength = sideLength/2;
for (int x = 0; x < panel.mapSize - 1; x += sideLength) {
for (int y = 0; y < panel.mapSize - 1; y += sideLength) {
average = panel.map[x][y]
+ panel.map[x + sideLength][y]
+ panel.map[x][y + sideLength]
+ panel.map[x + sideLength][y + sideLength];
average /= 4;
average += rand.nextInt(8);
panel.map[x + halfSideLength][y + halfSideLength] = average;
}
}
for (int x = 0; x < panel.mapSize - 1; x += sideLength) {
for (int y = 0; y < panel.mapSize - 1; y += sideLength) {
average = panel.map[x][y]
+ panel.map[x + halfSideLength][y]
+ panel.map[x][y + sideLength]
+ panel.map[x + halfSideLength][y + halfSideLength];
average /= 4;
panel.map[x][y] = average;
if (x == 0) {
panel.map[panel.mapSize - 1][y] = average;
}
if (y == 0) {
panel.map[x][panel.mapSize - 1] = average;
}
}
}
sideLength /= 2;
}
}
}
,這是我的面板類:
package game;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Panel extends JPanel implements ActionListener {
Terrain currentTerrain;
boolean upPressed = false;
boolean rightPressed = false;
boolean downPressed = false;
boolean leftPressed = false;
int tileSize = 1;
int mapSize = 1025;
int deltaX = 0;
int deltaY = 0;
int x = 0;
int y = 0;
int map[][] = new int[mapSize][mapSize];
Color[] colors = {
new Color(0, 0, 180),
new Color(0, 0, 255),
new Color(0, 150, 255),
new Color(255, 255, 180),
new Color(220, 220, 120),
new Color(200, 200, 60),
new Color(0, 200, 0),
new Color(0, 180, 0),
new Color(0, 160, 0),
new Color(0, 140, 0),
new Color(0, 120, 0),
new Color(0, 100, 0),
new Color(0, 80, 0),
new Color(0, 60, 0),
new Color(0, 40, 0),
new Color(40, 40, 40),
new Color(60, 60, 60),
new Color(80, 80, 80),
new Color(100, 100, 100),
new Color(120, 120, 120),
new Color(255, 255, 255)
};
public Panel(Main main) {
setPreferredSize(main.getSize());
setFocusable(true);
setBackground(Color.WHITE);
add(new KeyBindings(this));
currentTerrain = new Terrain(this);
new Timer(1000/120, this).start();
}
private void tick() {
if (upPressed) {
deltaY += 10;
} else if (downPressed) {
deltaY -= 10;
}
if (rightPressed) {
deltaX -= 10;
} else if (leftPressed) {
deltaX += 10;
}
repaint();
}
@Override
public void actionPerformed(ActionEvent e) {
tick();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
x = 0;
y = 0;
for (int[] rowData : map) {
for (int cellData : rowData) {
int v = cellData;
if(v < 0) {
v = 0;
} else if(v > colors.length - 1) {
v = colors.length - 1;
}
g.setColor(colors[v]);
g.fillRect(x + deltaX, y + deltaY, tileSize, tileSize);
x += tileSize;
if(x == mapSize * tileSize) {
x = 0;
y += tileSize;
}
}
}
}
}
你可以顯示一些示例輸出或給我們提示哪些代碼行可能有問題嗎? –
@TimBiegeleisen我相信我給「平均值」添加一個隨機值的行可能是問題。至於輸出,它看起來有點像一個顏色版本的靜態 – jklsfdgs