I'm attempting to recreate Minesweeper in flash for a project and I've gotten as far as placing mines and numbers. I can't seem to figure out the recursive algorithm for the expansion of clicking on a tile and clearing its neighbors. There are two arrays, _map holds the background + mines & numbers, _clickable map holds the tiles that sit on top of the background. So basically, what I'm asking for is help with recursion. If this isn't clear enough, I'll update the question with necessary information.
private function onClick(e:MouseEvent):void
{
trace("on Click");
var symbol = e.currentTarget;
var tempTileMask:TileMask = symbol;
var tempTile:Tile = _map[tempTileMask.yCoord][tempTileMask.xCoord]
if (tempTile.hasMine)
{
for (var i:int = _gridSize - 1; i >= 0; i--)
for (var j:int = _gridSize - 1; j >= 0; j--)
{
var temp:TileMask = _clickableMap[i][j];
removeChild(temp);
}
//explosion();
//gameOver();
}
if (tempTile.hasNumber)
{
removeChild(tempTileMask);
tempTile.cleared = true;
}
else
{
clearTiles(tempTile.xCoord, tempTile.yCoord);
}
}
This is the function I modified to clear mines
function clearTiles( x:int, y:int )
{
// Get an object that contains the tile information for the location
// we are checking
if(_map[y][x] != null)
{
var tempTile:Tile = _map[y][x];
var tempTileMask:TileMask = _clickableMap[y][x];
// Check if the location we are checking is out of the bounds of the
// playable area
trace(tempTile);
if ( tempTile.outOfBounds(x, y) )
{
return;
}
// If the tile has already been revealed then there is nothing to do
trace("before clearing");
if ( tempTile.cleared )
{
trace("clearing tile");
return;
}
// If the tile hasn't been revealed and it's an empty square we
// reveal the location then call this function again for each
// surrounding block
trace("before check for surrounding tiles");
if ( tempTile.hasNumber != true && tempTile.hasMine != true )
{
trace("check for surrounding tiles");
// Remove the mask hiding the tiles property
removeChild( tempTileMask );
// Set the tile as cleared
tempTile.cleared = true;
if(_map[tempTile.yCoord][tempTile.xCoord - 1] != null)
{
var tile1:Tile =_map[tempTile.yCoord][tempTile.xCoord - 1]
if(!tile1.cleared)
clearTiles( tempTile.xCoord - 1 , tempTile.yCoord ); //Check tile to the left
}
if(_map[tempTile.yCoord][tempTile.xCoord + 1] != null)
{
var tile2:Tile =_map[tempTile.yCoord][tempTile.xCoord + 1]
if(!tile2.cleared)
clearTiles( tempTile.xCoord + 1 , tempTile.yCoord ); //Check tile to the left
}
if(_map[tempTile.yCoord - 1][tempTile.xCoord] != null)
{
var tile3:Tile =_map[tempTile.yCoord - 1][tempTile.xCoord]
if(!tile3.cleared)
clearTiles( tempTile.xCoord, tempTile.yCoord - 1 ); //Check tile to the left
}
if(_map[tempTile.yCoord + 1][tempTile.xCoord] != null)
{
var tile4:Tile =_map[tempTile.yCoord + 1][tempTile.xCoord]
if(!tile4.cleared)
clearTiles( tempTile.xCoord, tempTile.yCoord + 1 ); //Check tile to the left
}
if(_map[tempTile.yCoord - 1][tempTile.xCoord - 1] != null)
{
var tile5:Tile =_map[tempTile.yCoord - 1][tempTile.xCoord - 1]
if(!tile5.cleared)
clearTiles( tempTile.xCoord - 1, tempTile.yCoord - 1 ); //Check tile to the left
}
if(_map[tempTile.yCoord + 1][tempTile.xCoord + 1] != null)
{
var tile6:Tile =_map[tempTile.yCoord + 1][tempTile.xCoord + 1]
if(!tile6.cleared)
clearTiles( tempTile.xCoord + 1, tempTile.yCoord + 1 ); //Check tile to the left
}
if(_map[tempTile.yCoord - 1][tempTile.xCoord + 1] != null)
{
var tile7:Tile =_map[tempTile.yCoord - 1][tempTile.xCoord + 1]
if(!tile7.cleared)
clearTiles( tempTile.xCoord + 1, tempTile.yCoord - 1 ); //Check tile to the left
}
if(_map[tempTile.yCoord + 1][tempTile.xCoord - 1] != null)
{
var tile8:Tile =_map[tempTile.yCoord + 1][tempTile.xCoord - 1]
if(!tile8.cleared)
clearTiles( tempTile.xCoord - 1, tempTile.yCoord + 1 ); //Check tile to the left
}
}
}
else
return;
}