I am trying to generate a tree but my code for structure generation isn't working and builds the tree completely wrong and I don't know How to fix it.
Heres the code:
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.awt.Color; /** * Write a description of class Worldy here. * * @author (your name) * @version (a version number or a date) */ public class Worldy extends World { public int[][] block; public int[][] tree = {{-1, 9, 9, 9, -1, -1}, {9, 9, 9, 9, -1, -1}, {9, 9, 8, 8, 8, 8}, {9, 9, 9, 9, -1, -1}, {-1, 9, 9, 9, -1, -1}}; public int[] spawn = {0, 0}; public static int blockSize = 16; public static int pixelSize = 3; public int level = 0; public int surfaceLevel; public int sX = 0; public int sY = 0; public int randWidth = Greenfoot.getRandomNumber(6)+2; public Player player; public Worldy() { super(600, 400, 1, false); setLevel(0); } public void act() { if(level == 1) { render(); } } public void setLevel(int level) { this.level = level; removeObjects(getObjects(null)); if(level == 0) { setBackground("Menu.png"); addObject(new Button("Start", 1), 300, 200); } else if(level == 1) { getBackground().setColor(new Color(130, 180, 255)); getBackground().fill(); generateWorld(); render(); player = new Player(); addObject(player, spawn[0]*blockSize*pixelSize-sX, spawn[1]*blockSize*pixelSize-sY); addObject(new PlayerArm(), spawn[0]*blockSize*pixelSize-sX, spawn[1]*blockSize*pixelSize-sY); addObject(new FPS(), 50, 10); } } public void generateWorld() { block = new int[600][600]; surfaceLevel = Greenfoot.getRandomNumber(200)+block[0].length/2; for(int x = 0; x < block.length; x++) { for(int y = 0; y < block[0].length; y++) { block[x][y] = -1; } } for(int x = 0; x < block.length; x++) { for(int y = 0; y < block[0].length; y++) { if(y==surfaceLevel) { if(Greenfoot.getRandomNumber(50)==0) { generateStructure(tree, x, y-1, false); block[x][y] = 0; } else { block[x][y] = 1; } if(x==block.length/2) { spawn[0] = x; spawn[1] = surfaceLevel-2; } } else if(y>surfaceLevel&&y<surfaceLevel+randWidth) { block[x][y] = 0; } else if(y==block[0].length-1) { block[x][y] = 3; } else if(y>surfaceLevel) { int coalRarity = 2; int coalLevel = block[0].length; int copperRarity = 6; int copperLevel = block[0].length-surfaceLevel; int diamondRarity = 10; int diamondLevel = 30; if((Greenfoot.getRandomNumber(coalRarity*10)==0 || (x>0&&block[x-1][y] == 5&&Greenfoot.getRandomNumber(coalRarity)==0) || (y<block[0].length-1&&x>0&&block[x-1][y+1] == 5&&Greenfoot.getRandomNumber(coalRarity)==0) || (x>0&&block[x-1][y-1] == 5&&Greenfoot.getRandomNumber(coalRarity)==0) || (block[x][y-1] == 5&&Greenfoot.getRandomNumber(coalRarity)==0))&&y>block[0].length-coalLevel) block[x][y] = 5; else if((Greenfoot.getRandomNumber(copperRarity*10)==0 || (x>0&&block[x-1][y] == 6&&Greenfoot.getRandomNumber(copperRarity)==0) || (y<block[0].length-1&&x>0&&block[x-1][y+1] == 6&&Greenfoot.getRandomNumber(copperRarity)==0) || (x>0&&block[x-1][y-1] == 6&&Greenfoot.getRandomNumber(copperRarity)==0) || (block[x][y-1] == 6&&Greenfoot.getRandomNumber(copperRarity)==0))&&y>block[0].length-copperLevel) block[x][y] = 6; else if((Greenfoot.getRandomNumber(diamondRarity*10)==0 || (x>0&&block[x-1][y] == 7&&Greenfoot.getRandomNumber(diamondRarity)==0) || (y<block[0].length-1&&x>0&&block[x-1][y+1] == 7&&Greenfoot.getRandomNumber(diamondRarity)==0) || (x>0&&block[x-1][y-1] == 7&&Greenfoot.getRandomNumber(diamondRarity)==0) || (block[x][y-1] == 7&&Greenfoot.getRandomNumber(diamondRarity)==0))&&y>block[0].length-diamondLevel) block[x][y] = 7; else block[x][y] = 2; } else { block[x][y] = -1; } } int upDown = Greenfoot.getRandomNumber(4); if(upDown == 0) { surfaceLevel++; } else if(upDown == 1) { surfaceLevel--; } randWidth = Greenfoot.getRandomNumber(6)+2; } } public void generateStructure(int[][] structure, int bottomX, int bottomY, boolean solid) { int index = 0; for(int x = 0; x < block.length; x++) { for(int y = 0; y < block[0].length; y++) { if(x>bottomX-(double)(structure.length)/2&&x<bottomX+(double)(structure.length)/2&&y>bottomY-structure[0].length&&y<=bottomY) { int bX = index%structure.length; int bY = (index-(index%structure.length))/structure.length; if(!solid&&block[x][y]==-1) { block[x][y] = structure[bX][bY]; } else if(solid) { block[x][y] = structure[bX][bY]; } index++; } } } } public void render() { removeObjects(getObjects(Block.class)); for(int x = 0; x < block.length; x++) { for(int y = 0; y < block[0].length; y++) { int trueX = (x*blockSize*pixelSize+(int)(blockSize/2)*pixelSize)-sX; int trueY = (y*blockSize*pixelSize+(int)(blockSize/2)*pixelSize)-sY; if(block[x][y] > -1 && trueX >= -(blockSize*pixelSize)/2 && trueX <= getWidth()+(blockSize*pixelSize)/2 && trueY >= -(blockSize*pixelSize)/2 && trueY <= getHeight()+(blockSize*pixelSize)/2) { addObject(new Block(block[x][y]), trueX, trueY); } } } } }