I am creating a 2D TileMap.I am using integers to determine tile type. I wanted to turn every grass tile(4) that neighbours at least one ocean tile(3) in to sand(1).
public void geography() {
for(int x=0; x<width; x++) { //Iterates through array
for(int y=0; y<height; y++) {
int counter = sametile(x,y,1,3); // uses a method to count neighbouring tiles
if(counter>0 && map[x][y]==4) { //if it at least has 1
map[x][y]=1; //turns that tile into sand
}
}
}
}
public int sametile(int locx,int locy,int diameter,int tile) { //location x,y,search diameter and tile type
int counter=0;
for(int x=locx-diameter; x<locx+diameter; x++) { //where we start and end
for(int y=locy-diameter; y<locy+diameter; y++) {
if (x < diameter || y < diameter || x+diameter>width || y+diameter>height) {
counter++;
continue;
//to avoid reaching index numbers that array doesnt have
}
if(map[x][y]==tile) { //if it is the tile we are looking for
counter++; //we increase the counter
}
}
}
return counter;
}
Weird thing is it works as intented some part of the map,but works partly wrong or totally wrong on some parts of the map.
I literally checked every line of code but didnt really catch anything

So assuming diameter 1, one of the things I want to do is check is to my left and to my right.
Looking at this is starts to my left and then never checks to my right because it doesn't use
<=. Similar logic foryand above/below.OK, now if locx is 1 and I need to look to my left, then I need to took at tile 0, however this prevents that:
And similarly for other bounds, so I assume you want:
Additionally, we don't do anything to prevent us counting the tile we're looking around.
All together: