Original Post
I''m making a game called collapse. I''m almost done. This algorithm checks the blocks at x and y positions on my playing surface and sees if its neighbours are its colour and then if the next neighbours are the same colour and so forth. It also keeps track how many neighbours it has of its colour in a line. I''m sure someone of you must have played this game before. Anyways I know recurrsion is bad but it is the best algorithm I can come up with. Does anyone know anything better than this?
int Surface::Scan_Block_Neighbours(int x, int y, int colour)
{
if(Surface::line[y].Get_Block_Colour(x) == colour && !Surface::line[y].blocks[x].is_Selected())
{
Surface::line[y].blocks[x].Select();
if(x == 0 && y == 0)
{
return (1 + Surface::Scan_Block_Neighbours(x + 1, y, colour) + Surface::Scan_Block_Neighbours(x, y + 1, colour));
}
else if(x == 0 && y == 11)
{
return (1 + Surface::Scan_Block_Neighbours(x + 1, y, colour) + Surface::Scan_Block_Neighbours(x, y - 1, colour));
}
else if(x == 9 && y == 0)
{
return(1 + Surface::Scan_Block_Neighbours(x - 1, y, colour) + Surface::Scan_Block_Neighbours(x, y + 1, colour));
}
else if(x == 9 && y == 11)
{
return(1 + Surface::Scan_Block_Neighbours(x - 1, y, colour) + Surface::Scan_Block_Neighbours(x, y - 1, colour));
}
else if(x == 0)
{
return(1 + Surface::Scan_Block_Neighbours(x + 1, y, colour) + Surface::Scan_Block_Neighbours(x, y + 1, colour) + Surface::Scan_Block_Neighbours(x, y - 1, colour));
}
else if(x == 9)
{
return(1 + Surface::Scan_Block_Neighbours(x - 1, y, colour) + Surface::Scan_Block_Neighbours(x, y + 1, colour) + Surface::Scan_Block_Neighbours(x, y - 1, colour));
}
else if(y == 0)
{
return(1 + Surface::Scan_Block_Neighbours(x + 1, y, colour) + Surface::Scan_Block_Neighbours(x - 1, y, colour) + Surface::Scan_Block_Neighbours(x, y + 1, colour));
}
else if(y == 11)
{
return(1 + Surface::Scan_Block_Neighbours(x + 1, y, colour) + Surface::Scan_Block_Neighbours(x - 1, y, colour) + Surface::Scan_Block_Neighbours(x, y - 1, colour));
}
else
{
return(1 + Surface::Scan_Block_Neighbours(x + 1, y, colour) + Surface::Scan_Block_Neighbours(x - 1, y, colour) + Surface::Scan_Block_Neighbours(x, y + 1, colour) + Surface::Scan_Block_Neighbours(x, y-1, colour));
}
}
else
return (0);
}