2016-08-08 3 views
1

Работа с простой карточной игрой для изучения программирования Swift и IOS. Для этой функции будет работать следующий код:Swift - «псевдоним» экземпляр объекта

func dealCards() { 

    for _ in 0...9 { 

     player1.cardDealt(deck.getNextCard()) 
     player2.cardDealt(deck.getNextCard())  
    } 
} 

Однако, я хотел бы повернуть дилера. Я знаю, что я мог бы дублировать цикл внутри если/других блоков, но я предпочел бы сделать что-то вроде этого:

func dealCards() { 

    // Dealer is considered position 2 
    if player1.isDealer() { 
     let pos1 = player2 
     let pos2 = player1 
    } 
    else { 
     let pos1 = player1 
     let pos2 = player2 
    } 
    for _ in 0...9 { 
     pos1.cardDealt(deck.getNextCard()) 
     pos2.cardDealt(deck.getNextCard()) 
    } 
} 

Я уверен, что это просто, но я не могу показаться, чтобы выяснить, как псевдоним мой игрок пытается использовать их таким образом.

ответ

2

Проблема с вашим кодом заключается в том, что вы определяете pos1 и pos2 внутри каждого оператора if, и из-за этого эти значения не могут быть получены извне этих операторов. Вы должны сначала определить их вне операторов, а затем установить их значения внутри. Вы могли бы даже изначально определить их как player1 и player2 соответственно, и обменять их значения if player1.isDealer().

Вот как это будет выглядеть в конце:

func dealCards() { 
    let pos1 = player1 
    let pos2 = player2 

    // Dealer is considered position 2 
    if player1.isDealer() { 
     pos1 = player2 
     pos2 = player1 
    } 

    for _ in 0...9 { 
     pos1.cardDealt(deck.getNextCard()) 
     pos2.cardDealt(deck.getNextCard()) 
    } 
} 

более компактный способ сделать это было бы поменять местами значения с помощью кортежей и тройной оператор:

func dealCards() { 

    // Dealer is considered position 2 
    let (pos1, pos2) = player1.isDealer() ? (player2, player1) : (player1, player2) 
    //If player1 is the dealer, swap pos1 and pos2 
    for _ in 0...9 { 
     pos1.cardDealt(deck.getNextCard()) 
     pos2.cardDealt(deck.getNextCard()) 
    } 
} 
+0

kabiroberai - Многие благодаря! – user1658921

+0

@ user1658921 Добро пожаловать :) Просто fyi, я обновил свой первый вариант, чтобы он был более компактным и понятным, устраняя необходимость в предложении 'else'. – kabiroberai

2

Положите игроков в массив, и сделать петлю обернуть вокруг, как это:

let players = [player1, player2, player3, ...] 
var startFrom = 0 // Set to 1 to start from player2, 2 to start from player3, etc. 
for _ in 0...9 { 
    for i in 0..<players.count { 
     players[(startFrom + i) % players.count].cardDealt(deck.getNextCard()) 
    } 
} 

Переменная startFrom содержит индекс первого игрока, чтобы получить карту. Playerd получает свои карты в том же порядке, обертывая их в позиции players.count.

Смежные вопросы