2017-10-18 62 views
0

可以说你犯了个游戏,这个游戏已经在程序上由用户在他的世界里创造菜单基于种子斯威夫特3

输入的种子产生的地形和这个种子生成一组的随机值只有在种子发生变化时才会改变的值

例如,假设您想要获得随机的一组整数以在for循环中生成,并从数组中随机抽取,整数集每次都保持相同,每次运行for-loop时,以相同的顺序从阵列中选择相同的项目,直到您更改种子为止

一个怎么会在我的代码迅速

实现这一这里我可以得到地形产卵的,但它不会产生相同的每一次这正是我试图得到它做

override func didMove(to view: SKView) { 

    let tile1 = SKTileDefinition(texture: SKTexture(imageNamed: "stone") ,size: CGSize(width: 64, height: 64)) 
    let tile2 = SKTileDefinition(texture: SKTexture(imageNamed: "water") ,size: CGSize(width: 64, height: 64)) 
    let tile3 = SKTileDefinition(texture: SKTexture(imageNamed: "sand") ,size: CGSize(width: 64, height: 64)) 
    let tile4 = SKTileDefinition(texture: SKTexture(imageNamed: "grass") ,size: CGSize(width: 64, height: 64)) 

    let tileGroup1 = SKTileGroup(tileDefinition: tile1) 
    let tileGroup2 = SKTileGroup(tileDefinition: tile2) 
    let tileGroup3 = SKTileGroup(tileDefinition: tile3) 
    let tileGroup4 = SKTileGroup(tileDefinition: tile4) 
    let tileGroup5 = SKTileGroup(tileDefinition: tile4) 
    let tileGroup6 = SKTileGroup(tileDefinition: tile4) 

    let tileSet = SKTileSet(tileGroups: [tileGroup1,tileGroup2,tileGroup3,tileGroup4,tileGroup5,tileGroup6]) 

    let columns = 5 
    let rows = 5 

    let tileSize = CGSize(width: 64, height: 64) 

    //this is another GKNoise class called Noise 
    let noise = Noise() 
    let noiseMap = GKNoiseMap(noise, size: vector_double2(10.0,10.0), origin: vector_double2(0.0,0.0), sampleCount: vector_int2(100), seamless: true) 
    //this is another SKTileMapNode Class called TileMap and a class func called tileMapNodes 
    let tileMap = TileMap.tileMapNodes(tileSet: tileSet, columns: columns, rows: rows, tileSize: tileSize, from: noiseMap, tileTypeNoiseMapThresholds: [(-1.0 as NSNumber),(+1.0 as NSNumber)]) 

    tileMapNode = tileMap.first! 

    let seed = Int 

    for column in 0 ..< tileMapNode.numberOfColumns { 
     for row in 0 ..< tileMapNode.numberOfRows { 
      let rand = Int(arc4random_uniform(UInt32(tileSet.tileGroups.count))) 
      print(rand) 
      let tile = tileMapNode.tileSet.tileGroups[rand] 
      tileMapNode.setTileGroup(tile, forColumn: column, row: row) 
     } 
    } 
+0

你写了一些代码吗?请张贴它 - 然后我们可以给你一些提示 – AlexWoe89

+0

看看这个答案。它提供您需要的种子行为。 https://stackoverflow.com/a/38679898/1630618 – vacawama

回答

1

如果您想根据特定的种子使用,以产生一个随机值:srand48drand48

函数srand允许您指定的种子:

srand48(230) 

然后drand48会给你一个双0和1之间:

let doubleValue = drand48() 
你的情况

所以,如果你想在0和9之间的诠释,你可以这样做:

srand48(230) 
    print("Random number: \(1 + Int((drand48() * 8) + 0.5))") 
    print("Random number: \(1 + Int((drand48() * 8) + 0.5))") 
    print("Random number: \(1 + Int((drand48() * 8) + 0.5))") 

它将给你3张伪随机数,直到你改变了种子

这里是应用于新问题drand48

let seed = srand48(230) 

for column in 0 ..< tileMapNode.numberOfColumns { 
    for row in 0 ..< tileMapNode.numberOfRows { 
     let rand = Int(Double(tileSet.tileGroups.count) * drand48() - 0.5) 
     print(rand) 
     let tile = tileMapNode.tileSet.tileGroups[rand] 
     tileMapNode.setTileGroup(tile, forColumn: column, row: row) 
    } 
} 
+0

不错!非常感谢!是否有无论如何让它在for循环中生成一个随机数,我可以用它从数组中随机抽取数据? –

+0

我需要它一次又一次地生成相同的数字,直到我更改种子,因为代码正在计算列/行并随机设置从数组中随机抽取的纹理 –

+0

也给出了一个错误'推断'种子'的常量'种子'有类型'虚空',这可能是意想不到的'如何解决? –