我正试图在闪存中为一个项目重新创建扫雷者,我已经到了放置地雷和数字的程度。我似乎想不出用于扩展点击磁贴并清除其邻居的递归算法。有两个数组,_map保存背景+矿山和数字,_clickable地图保存位于背景顶部的瓦片。所以基本上,我请求的是递归的帮助。如果这不够清楚,我会用必要的信息更新问题。
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);
}
}这是我为清除地雷而修改的函数
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;
}发布于 2014-04-19 11:40:51
如果我搞错了actionscript语法,请原谅。我就是喜欢递归函数,所以我不得不回答这个问题。我将使用我能收集到的最准确的注释粘贴代码。如果你有什么问题,请提出来。我相信你可以将你需要的任何东西转换成适当的函数调用、属性引用等。
// Function to check if a tile is an empty space and then call
// itself for the surrounding tiles
function clearTiles( x:int, y:int ):void
{
// Check if the location we are checking is out of the bounds of the
// playable area
if ( outOfBounds( x, y ) )
{
return;
}
// Get an object that contains the tile information for the location
// we are checking
var tempTile:Tile = _map[x][y];
// If the tile has already been revealed then there is nothing to do
if ( tempTile.cleared )
{
return;
}
// If the tile is a number then reveal it and return without checking
// surrounding tiles
var tempTileMask:DisplayObject = getTileMask(x,y);
// since we're no longer in the click handler context, we need
// to initialize the variable with something [TODO]
if ( tempTile.hasNumber )
{
removeChild( tempTileMask );
tempTile.cleared = true;
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
if ( tempTile.isEmpty )
{
// Remove the mask hiding the tiles property
removeChild( tempTileMask );
// Set the tile as cleared
tempTile.cleared = true;
clearTiles( tempTile.x - 1 , tempTile.y ); //Check tile to the left
clearTiles( tempTile.x + 1 , tempTile.y ); //Check tile to the right
clearTiles( tempTile.x , tempTile.y - 1 ); //Check tile above
clearTiles( tempTile.x , tempTile.y + 1 ); //Check tile below
}
}您必须创建一个outOfBounds()函数来检查正在检查的X和Y是否大于当前的游戏板。看起来你引用_gridSize作为一个静态数字,所以我假设你所有的游戏面板都是正方形的(例如: 4x4,9x9,120x120)。在这种情况下,您可以使用如下代码:
function outOfBounds( int x, int y )
{
if ( x < 0 )
{
return true;
}
if ( y < 0 )
{
return true;
}
if ( x > _gridSize - 1 )
{
return true;
}
if ( y > _gridSize -1 )
{
return true;
}
return false;
}https://stackoverflow.com/questions/23165398
复制相似问题