2017-10-29 2 views
0

私は4人のプレイヤーのためのカードゲームをしています。これらのプレイヤーオブジェクトを単純なIDで辞書に保存します。 1、2、3、4。次に、スタートプレイヤーをランダムに決めます。辞書を繰り返してプレイヤーの位置を決定します

ゲームビューでは、4人のプレーヤーが画面の異なる領域に割り当てられています。現在のデバイスのプレーヤーは、常に画面の下部にあるプレーヤーであり、次は画面に残り、3番目は上部にあり、4番目は右側にあります。

プレーヤーのプレイヤーがプレーヤー辞書のID 3のプレーヤーであるとします。選手のスクリーンへの配置は、 1(上)、2(右)、3(下)および4(左)。それらは、辞書の中での位置に応じて時計回りに配置されます。

私はこの位置を決定するコードを持っています。はっきりする。ボトム= 1、左= 2、トップ= 3、右= 4。

func determinePlayerPositions() { 
    var playerPositionsCount = 0 

    for i in 1...gamePlayers.count { 
     let player = gamePlayers[i] 

     if player?.playerID == playerOfThisDeviceId { 
      playerOfThisDevice = i 
      playerPositions[1] = playerOfThisDevice 
      playerPositionsCount += 1 

      if playerOfThisDevice == gamePlayers.count && playerPositionsCount != gamePlayers.count { 

       for i in 1...gamePlayers.count-1 { 

        playerPositions[i] = i 
        playerPositionsCount += 1 
       } 
      } 

      if playerOfThisDevice < gamePlayers.count && playerPositionsCount != gamePlayers.count { 

       for i in playerOfThisDevice+1...gamePlayers.count { 
        playerPositions[i] = i 
        playerPositionsCount += 1 
       } 

       if playerPositionsCount != gamePlayers.count { 
        for i in 1...playerPositionsCount { 
         playerPositions[i] = i 
        } 

        playerPositionsCount = 0 
       } 
      } 
     } 
    } 

    setLabelTexts() 

} 

ボトムプレイヤーはゲームをプレイする4つの異なるデバイスで異なります。

だから私の質問です。より効率的なポジションの決定方法があります。これは単純なタスクのための多くのコードのようです。

ありがとうございます!

答えて

1

現在のプレーヤーを最初の要素にするために、プレーヤーの配列を現在のプレーヤーで分割することができます。

[1, 2, 3, 4] -> [3, 4, 1, 2] // where current player has ID 3 

このように配置すると、プレーヤーのインデックスが位置インデックスにマッピングされます。

enum Position: Int { 
    case bottom = 1 
    case left = 2 
    case top = 3 
    case right = 4 
} 

struct Player { 
    let id: Int 
} 

struct Game { 
    let current: Player 
    let players: [Player] 

    func position(of player: Player) -> Position? { 

     let slices = players.split(whereSeparator: { $0.id == current.id }) 
     let ordered = [current] + slices.last! + slices.first! 
     let index = ordered.index(where: { $0.id == player.id }) 

     return index.flatMap { Position(rawValue: $0 + 1) } 
    } 
} 

let game = Game(
    current: Player(id: 3), 
    players: [ 
     Player(id: 1), 
     Player(id: 2), 
     Player(id: 3), 
     Player(id: 4) 
    ] 
) 

print(game.position(of: Player(id: 3))) 
+0

これは私が必要としていたものです。ありがとう! – Niels

関連する問題