This is how I was able to accomplish finding connected tiles and highlight specific tiles :
//reset all flags
reset_connectedToSource_flags();
//find connected tiles
for(int pos=11;pos<89;pos++)
{
Tile tile = getTile(pos);
//check only route Tiles as background tiles need not be checked
if(!tile.isBackground)
{
isConnected(pos);
}
}
//Find connected to source Tiles
for(int i=0;i<no_of_Sources;i++)
isConnectedToSource(BaseLevel.Sources[i]);
//highlight connectedToSource Tiles
highlightRoutes();
// Function resets all flags indicating connected or connectedtoSource to false
public void reset_connectedToSource_flags(){
Tile tile=null;
for(int pos=11;pos<89;pos++)
{
tile = getTile(pos);
//check only route Tiles as background tiles need not be checked
if(!tile.isBackground)
{
tile.connectedToSource = false;
tile.checked = false;
}
}
}
//Function to detect which tiles are connected to each other
boolean isConnected(int position)
{
connected = false;
Tile currentTile = getTile(position);
Tile topTile,nextTile,prevTile,downTile;
if(currentTile.isFlag_top()){
topTile = currentTile.topLink;
if(topTile!= null){
if(currentTile.contains(Tile.top,topTile.getState()))
{
//Checks if top tile's state matches with the allowed top tile states
currentTile.top_connected = true;
connected = true;
}
else currentTile.top_connected = false;
}
}
else{
//As flag_top of current tile is false , set its top_connected flag to false.
currentTile.top_connected = false;
}
if(currentTile.isFlag_down()){
downTile = currentTile.downLink;
if(downTile!= null){
if(currentTile.contains(Tile.down,downTile.getState()))
{
currentTile.down_connected = true;
connected = true;
}
else currentTile.down_connected = false;
}
}
else{
currentTile.down_connected = false;
}
if(currentTile.isFlag_prev()){
prevTile = currentTile.prevLink;
if(prevTile!= null){
if(currentTile.contains(Tile.prev,prevTile.getState()))
{
currentTile.prev_connected = true;
connected = true;
}
else currentTile.prev_connected = false;
}
}
else{
currentTile.prev_connected = false;
}
if(currentTile.isFlag_next()){
nextTile = currentTile.nextLink;
if(nextTile!= null){
if(currentTile.contains(Tile.next,nextTile.getState()))
{
currentTile.next_connected = true;
connected = true;
}
else currentTile.next_connected = false;
}
}
else{
currentTile.next_connected = false;
}
currentTile.connected = connected;
return connected;
}
//Function which identifies from all connected tiles, which all are connected to source
public boolean isConnectedToSource(int currentPos){
boolean connected = false;
boolean fork_result = false;
Tile curTile = getTile(currentPos);
Tile nextTile=null,prevTile=null,downTile=null,topTile=null;
if(curTile.checked == false) curTile.checked = true;
if(curTile.isHacker){
System.out.println("####### Your network is being Hacked!! Disconnect Now!! ###########");
return false;
}
//cur.top_CONNECTED
if(curTile.top_connected){
connected = true;
topTile = curTile.topLink;
if(!topTile.checked){
//check if top isConnectedToSource
topTile.to_source_go_down = true;
topTile.connectedToSource = true;
int topPos = topTile.getPos();
boolean result = isConnectedToSource(topPos);
if(result){
if(curTile.isFork == true || curTile.isDevice== true){
fork_result = result;
}
else {
return true;
}
}
}
}//end cur.top_CONNECTED
//cur.down_CONNECTED
if(curTile.down_connected){
connected = true;
downTile = curTile.downLink;
if(!downTile.checked){
//check if down isConnectedToSource
downTile.to_source_go_down = true;
downTile.connectedToSource = true;
int downPos = downTile.getPos();
boolean result = isConnectedToSource(downPos);
if(result){
if(curTile.isFork == true || curTile.isDevice== true){
fork_result = result;
}
else {
return true;
}
}
}
}//end cur.down_CONNECTED
//cur.next_CONNECTED
if(curTile.next_connected){
connected = true;
nextTile = curTile.nextLink;
if(!nextTile.checked){
//check if next isConnectedToSource
nextTile.to_source_go_down = true;
nextTile.connectedToSource = true;
int nextPos = nextTile.getPos();
boolean result = isConnectedToSource(nextPos);
if(result){
if(curTile.isFork == true || curTile.isDevice== true){
fork_result = result;
}
else {
return true;
}
}
}
}//end cur.next_CONNECTED
//cur.prev_CONNECTED
if(curTile.prev_connected){
connected = true;
prevTile = curTile.prevLink;
if(!prevTile.checked){
//check if prev isConnectedToSource
prevTile.to_source_go_down = true;
prevTile.connectedToSource = true;
int prevPos = prevTile.getPos();
boolean result = isConnectedToSource(prevPos);
if(result){
if(curTile.isFork == true || curTile.isDevice== true){
fork_result = result;
}
else {
return true;
}
}
}
}//end cur.prev_CONNECTED
if(!curTile.isFork || !curTile.isDevice) return connected;
else return fork_result;
}
// Function to highlight all tiles which are connectedToSource
void highlightRoutes(){
Tile currentTile = null;
int highlightedState = 0;
int unHighlightedState = 0;
for(int pos=11;pos<89;pos++)
{
Tile tile = getTile(pos);
//check only route Tiles as background tiles need not be checked
if(!tile.isBackground)
{
currentTile = tile;
int state =currentTile.getState();
if(currentTile.connectedToSource){
highlightedState = getHighlightedState(state);
currentTile.setState(highlightedState);
}
else{
unHighlightedState = getUnHighlightedState(state);
currentTile.setState(unHighlightedState);
}
}
}
}