创建随机生成器,不再重复生成的最后一个on swift(xcode)

时间:2015-08-11 20:15:31

标签: ios swift arc4random

大家好我已经尝试创建一个游戏几周但是我无法创建一个随机播放新功能的功能,而无需重播之前播放的相同功能

我一直在使用以下脚本生成随机播放功能。

func playgame(){   
var randomgen = arc4random % 6                   
switch(randomgen){             
case 0:          
 game1()        
break      
case 1:   
 game2()   
break  
case 2:    
 game3()  
 break  
case 3:  
 game4()  
break  
case 4:   
 game5()  
 break  
case 5:   
 game6()   
 break   
default:    
 break     
  }    

当玩家按下按钮时,该功能再次运行,产生随机游戏功能 如何在不生成相同游戏的情况下生成随机游戏 例如:如果生成了game1()并按下下一个游戏按钮,我想从其他5个游戏中生成一个随机游戏。这个想法是能够无限期地玩六场比赛。

2 个答案:

答案 0 :(得分:1)

我建议制作所有游戏的NSArray,然后从NSArray索引中随机选择一个游戏,移除随机游戏,以便下次它会随机选择NSArray中剩余的任何游戏。

这是确保不会重复的唯一方法。 您可以通过使用种子版本来控制随机数发生器,但这只会为您提供使其可重复的选项。

通过制作NSArray类别可以轻松实现:

- (id) randomARC4Element
{
    if(self.count > 0)
    {
        return [self objectAtIndex:[self randomIntBetweenMin:0 andMax:self.count-1]];
    }

    return nil;
}

- (int)randomIntBetweenMin:(int)minValue andMax:(int)maxValue
{
    return (int)(minValue + [self randomFloat] * (maxValue - minValue));
}

- (float)randomFloat
{
    return (float) arc4random() / UINT_MAX;
}

播放完所有游戏后,您只需重新创建阵列即可。

如果你想让游戏随机化只是确保只有最后一个不重复,我建议保留最后的随机元素,创建所有元素的NSArray,删除最后一个随机元素并随机化这样一个数组中的任何元素 - 这只是一次随机迭代后的保证结果。

答案 1 :(得分:0)

制作一个循环以检查上一场比赛。

var lastGame = -1

func playGame() {

    var randomgen = 0

    repeat {
        randomgen = arc4random % 6
    } while (randomgen == lastGame)

    lastGame = randomgen

    switch randomgen {
        case 1: game1()
        case 2: game2()    
        /* ... */
        default:
    }
}  

在某些情况下避免无限循环场景。但是,当lastGame超过你的游戏数量时,还需要改进

var lastGame = -1

func playGame() {

    var randomgen = 0
    var counter = 0
    let limit = 10

    repeat {
        randomgen = arc4random % 6
        counter++
    } while (randomgen == lastGame && counter < limit)

    if counter == limit {
        randomgen = lastGame + 1
    }

    lastGame = randomgen

    switch randomgen {
        case 1: game1()
        case 2: game2()    
        /* ... */
        default:
    }
}