使用switch语句根据布尔值的选择进行分支:Objective-C
我有这个方法:使用switch语句根据布尔值的选择进行分支:Objective-C,objective-c,random,boolean,switch-statement,Objective C,Random,Boolean,Switch Statement,我有这个方法: -(void) setRandomConnectionForFloorTile:(Tile *)ft andConnectionTile:(Tile *)ct { BOOL ftLeftConnection = [ft leftConnection]; BOOL ftTopConnection = [ft topConnection]; BOOL ftRightConnection = [ft rightConnection]; BOOL ftBo
-(void) setRandomConnectionForFloorTile:(Tile *)ft andConnectionTile:(Tile *)ct
{
BOOL ftLeftConnection = [ft leftConnection];
BOOL ftTopConnection = [ft topConnection];
BOOL ftRightConnection = [ft rightConnection];
BOOL ftBottomConnection = [ft bottomConnection];
switch (arc4random() %4 + 1)
{
case 1:
if ([_toBuild returnTileOfType:@"FloorTile" atPosition:CGPointMake([ft screenPosition].x - [[ft sprite] size].width, [ft screenPosition].y)])
{
[self setRandomConnectionForFloorTile:ft andConnectionTile:ct];
}
else
{
[ct setScreenPosition:CGPointMake([ft screenPosition].x - [[ft sprite] size].width, [ft screenPosition].y)];
[[_toBuild tiles] addObject:ct];
}
break;
case 2:
if ([_toBuild returnTileOfType:@"FloorTile" atPosition:CGPointMake([ft screenPosition].x, [ft screenPosition].y + [[ft sprite] size].height)])
{
[self setRandomConnectionForFloorTile:ft andConnectionTile:ct];
}
else
{
[ct setScreenPosition:CGPointMake([ft screenPosition].x, [ft screenPosition].y + [[ft sprite] size].height)];
[[_toBuild tiles] addObject:ct];
}
break;
case 3:
if ([_toBuild returnTileOfType:@"FloorTile" atPosition:CGPointMake([ft screenPosition].x + [[ft sprite] size].width, [ft screenPosition].y)])
{
[self setRandomConnectionForFloorTile:ft andConnectionTile:ct];
}
else
{
[ct setScreenPosition:CGPointMake([ft screenPosition].x + [[ft sprite] size].width, [ft screenPosition].y)];
[[_toBuild tiles] addObject:ct];
}
break;
case 4:
if ([_toBuild returnTileOfType:@"FloorTile" atPosition:CGPointMake([ft screenPosition].x, [ft screenPosition].y - [[ft sprite] size].height)])
{
[self setRandomConnectionForFloorTile:ft andConnectionTile:ct];
}
else
{
[ct setScreenPosition:CGPointMake([ft screenPosition].x, [ft screenPosition].y - [[ft sprite] size].height)];
[[_toBuild tiles] addObject:ct];
}
break;
}
}
如您所见,此代码产生的问题是不必要的重复和对系统资源的需求
基本上,我在开始的时候声明了四个布尔值,这决定了磁贴可以连接到哪一侧。所以,当ftLeftConnection为false且仅为false时,它可能会在其左侧立即放置一个磁贴
我想创建一个switch语句或其他形式的方法,这将使我能够仅对那些为false的布尔值执行随机情况。如果我有信息告诉我那里已经有一个磁贴,那么尝试将一个磁贴连接到另一个磁贴的直接右侧是没有意义的
鲁本
这假设至少有一个可能的方向。您可以使用数组并仅将true boolean保存到其中。然后使用arc4random%array.Count+1代替arc4random%4+1。
enum {
Left = 0,
Up,
Right,
Down
};
int valid_directions[] = {0,0,0,0};
int num_valid_directions = 0;
BOOL established_directions[] = {ftLeftConnection, ftTopConnection, ftRightConnection, ftBottomConnection};
for( int i = 0; i < 4; i++ ){
if( !established_directions[i] ){
valid_directions[num_valid_directions++] = i;
}
}
int chosen_direction = valid_directions[arc4random_uniform(num_valid_directions)];
switch( chosen_direction ){
case Left:
// etc.