Глюк 2D сотовых автоматов

Я хотел бы сделать так, чтобы мой код генерировал систему пещер в игре. У меня проблемы с кодом; кажется, он делает сетки в частях между пещерами, и я не хочу сетку, я хочу открытую местность. Вот мой код:

package CATest;

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class CATest extends JPanel{
    static CATest w;
    static Random rand=new Random();
    JFrame jf=new JFrame();
    boolean tileMap[][];
    public static void main(String argsp[]){
        w=new CATest();
        w.jf.add(w);
        w.jf.setSize(100,400);
        w.jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        w.jf.setVisible(true);
        w.tileMap=new boolean[100][400];
        for(int x=0;x<w.tileMap.length;x++)
            for(int y=0;y<w.tileMap[0].length;y++)
                if(rand.nextFloat()<0.7)
                    w.tileMap[x][y]=true;
        for(int step=0;step<7;step++){
            boolean newMap[][]=new boolean[100][400];
            for(int x=0;x<w.tileMap.length;x++)
                for(int y=0;y<w.tileMap[0].length;y++){
                    int count=0;
                    if(x-1>=0&&y-1>=0&&x+1<w.tileMap.length&&y+1<w.tileMap[0].length){
                        if(w.tileMap[x-1][y])
                            count++;
                        if(w.tileMap[x+1][y])
                            count++;
                        if(w.tileMap[x][y-1])
                            count++;
                        if(w.tileMap[x][y+1])
                            count++;
                        newMap[x][y]=count<=3;
                    }
                }
            w.tileMap=newMap;
        }
        w.repaint();
    }
    @Override
    public void paintComponent(Graphics g){
        for(int x=0;x<tileMap.length;x++)
            for(int y=0;y<tileMap[0].length;y++){
                if(tileMap[x][y])
                    g.setColor(Color.black);
                else g.setColor(Color.white);
                g.drawRect(x,y,1,1);
            }
    }
}

Вот картина того, что происходит: клеточные автоматы Как видите, есть сетка где должна быть пещера. Пожалуйста помоги.


person Mike12670    schedule 16.06.2020    source источник


Ответы (1)


Я упустил тот факт, что необходимо учитывать центральную плитку. Итак, вместо

if(w.tileMap[x-1][y])
    count++;
if(w.tileMap[x+1][y])
    count++;
if(w.tileMap[x][y-1])
    count++;
if(w.tileMap[x][y+1])
    count++;

так должно быть

if(w.tileMap[x][y])
    count++;
if(w.tileMap[x-1][y])
    count++;
if(w.tileMap[x+1][y])
    count++;
if(w.tileMap[x][y-1])
    count++;
if(w.tileMap[x][y+1])
    count++;
person Mike12670    schedule 16.06.2020