Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用switch语句根据布尔值的选择进行分支:Objective-C_Objective C_Random_Boolean_Switch Statement - Fatal编程技术网

使用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.