我正在寻找一种更好的方法来创建距离起点一定距离的点数组。途中可能会有障碍,这是无法逾越的。
x x x o x x x x
x x o o o x x x
x o o o o o x x
o o o A o o o x
x o B B o o x x
x x x x o x x x
x x x x x x x x
x - 空 // A - 开始 // B - 障碍 // o - 距离 >= 3
所以我目前的实现使用递归,基本上在每个方向搜索,直到达到 3 的距离。它看起来像这样:
- (NSArray *) findTiles:(CGPoint)position for:(int)area;
{
// Holding array
NSMutableArray *array = [NSMutableArray array];
CGPoint p = ccp(position.x - 1, position.y);
if ( [self isValidTile:p] && area != 0 )
if ( ![self isOccupiedTile:p] )
[array addObjectsFromArray: [self findMoveTiles:p for:area - 1]];
p = ccp(position.x, position.y - 1);
if ( [self isValidTile:p] && area != 0 )
if ( ![self isOccupiedTile:p] )
[array addObjectsFromArray: [self findMoveTiles:p for:area - 1]];
p = ccp(position.x + 1, position.y);
if ( [self isValidTile:p] && area != 0 )
if ( ![self isOccupiedTile:p] )
[array addObjectsFromArray: [self findMoveTiles:p for:area - 1]];
p = ccp(position.x, position.y + 1);
if ( [self isValidTile:p] && area != 0 )
if ( ![self isOccupiedTile:p] )
[array addObjectsFromArray: [self findMoveTiles:p for:area - 1]];
// Add ourself only if we are empty
if ( [self isValidTile:position] && ![self isOccupiedTile:position])
if ( ![array containsObject:[NSValue valueWithCGPoint:position]] )
[array addObject:[NSValue valueWithCGPoint:position]];
return [NSArray arrayWithArray:array];
}
有没有人有更快的方法来做到这一点?这很好用,但在大面积上会变得非常慢。此外,返回的数组有许多重复的坐标,因为 containsObject: 似乎不起作用。
PS - 不确定图形算法是否适用于此处(我会说它适用)