Added Deal 3 more cards button
This commit is contained in:
		| @@ -9,19 +9,93 @@ import Foundation | |||||||
| import SwiftUI | import SwiftUI | ||||||
|  |  | ||||||
| struct SetGame { | struct SetGame { | ||||||
|     private var deck: Array<Card> |     private(set) var cards: Array<Card> | ||||||
|     private(set) var cardsOnTable: Array<Card> |     private(set) var score: Int = 0 | ||||||
|  |      | ||||||
|  |      | ||||||
|  |      | ||||||
|  |     mutating func choose(_ card: Card) { | ||||||
|  |         if let chosenIndex = cards.firstIndex(where: {card.id == $0.id}), | ||||||
|  |            !cards[chosenIndex].isMatched, | ||||||
|  |            !cards[chosenIndex].isSelected, | ||||||
|  |            cards[chosenIndex].isOnTheTable | ||||||
|  |         { | ||||||
|  |             cards[chosenIndex].isSelected = true | ||||||
|  |             var chosenCards: Array<Card> = Array() | ||||||
|  |             for c in cards { | ||||||
|  |                 if c.isSelected { | ||||||
|  |                     chosenCards.append(c) | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             if chosenCards.count > 2 { | ||||||
|  |                 let chosenCard1 = chosenCards[0] | ||||||
|  |                 let chosenCard2 = chosenCards[1] | ||||||
|  |                 let chosenCard3 = chosenCards[2] | ||||||
|  |                  | ||||||
|  |                 let color = all3EqualOrAllDifferent(chosenCard1.color, chosenCard2.color, chosenCard3.color) | ||||||
|  |                 let shading = all3EqualOrAllDifferent(chosenCard1.shading, chosenCard2.shading, chosenCard3.shading) | ||||||
|  |                 let symbol = all3EqualOrAllDifferent(chosenCard1.symbol, chosenCard2.symbol, chosenCard3.symbol) | ||||||
|  |                 let numberOnCard = all3EqualOrAllDifferent(chosenCard1.numberOnCard, chosenCard2.numberOnCard, chosenCard3.numberOnCard) | ||||||
|  |                  | ||||||
|  |                  | ||||||
|  |                 if color && shading && symbol && numberOnCard { | ||||||
|  |                     cards[cards.firstIndex(where: {chosenCard1.id == $0.id})!].isMatched = true | ||||||
|  |                     cards[cards.firstIndex(where: {chosenCard2.id == $0.id})!].isMatched = true | ||||||
|  |                     cards[cards.firstIndex(where: {chosenCard3.id == $0.id})!].isMatched = true | ||||||
|  |                     score += 1 | ||||||
|  |                     if (cardsOnTheTable() < 12) { | ||||||
|  |                         addCardsToTable(3) | ||||||
|  |                     } | ||||||
|  |                 } else { | ||||||
|  |                     score -= 1 | ||||||
|  |                 } | ||||||
|  |                 cards[cards.firstIndex(where: {chosenCard1.id == $0.id})!].isSelected = false | ||||||
|  |                 cards[cards.firstIndex(where: {chosenCard2.id == $0.id})!].isSelected = false | ||||||
|  |                 cards[cards.firstIndex(where: {chosenCard3.id == $0.id})!].isSelected = false | ||||||
|  |                  | ||||||
|  |                  | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     func all3EqualOrAllDifferent<EquatableObject: Equatable>(_ first: EquatableObject, _ second: EquatableObject, _ third: EquatableObject) -> Bool { | ||||||
|  |         (first == second && first == third) || ((first != second && first != third) && second != third) | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     mutating func addCardsToTable(_ numberOfCards: Int) { | ||||||
|  |         print(cards.count, cardsOnTheTable()) | ||||||
|  |         let maxCards = cardsOnTheTable() + 3 | ||||||
|  |         var i = 0 | ||||||
|  |         while cardsOnTheTable() < maxCards && i < 81 { | ||||||
|  |             let card = cards[i] | ||||||
|  |             if (!card.isOnTheTable && !card.isMatched) { | ||||||
|  |                 cards[card.id].isOnTheTable = true | ||||||
|  |             } | ||||||
|  |             i += 1 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     func cardsOnTheTable() -> Int { | ||||||
|  |         var cardsOnTable = 0 | ||||||
|  |         for card in cards { | ||||||
|  |             if (card.isOnTheTable && !card.isMatched) { | ||||||
|  |                 cardsOnTable += 1 | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return cardsOnTable | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |  | ||||||
|      |      | ||||||
|     init() { |     init() { | ||||||
|         var deck = SetGame.createCards() |         var deck = SetGame.createCards() | ||||||
|         deck.shuffle() |         deck.shuffle() | ||||||
|         let cardsOnTable = Array(deck[0..<12]) |         for i in 0..<12 { | ||||||
|         deck.removeAll { card in |             deck[i].isOnTheTable = true | ||||||
|             cardsOnTable.contains { $0 == card } |  | ||||||
|         } |         } | ||||||
|         self.deck = deck |         self.cards = deck | ||||||
|         self.cardsOnTable = cardsOnTable |         print(cards.count) | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     private static func createCards() -> Array<SetGame.Card> { |     private static func createCards() -> Array<SetGame.Card> { | ||||||
| @@ -41,17 +115,11 @@ struct SetGame { | |||||||
|         } |         } | ||||||
|         return deck |         return deck | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |      | ||||||
|      |      | ||||||
|     mutating func newGame() { |  | ||||||
|         var deck = SetGame.createCards() |  | ||||||
|         deck.shuffle() |  | ||||||
|         let cardsOnTable = Array(deck[0..<12]) |  | ||||||
|         deck.removeAll { card in |  | ||||||
|             cardsOnTable.contains { $0 == card } |  | ||||||
|         } |  | ||||||
|         self.deck = deck |  | ||||||
|         self.cardsOnTable = cardsOnTable |  | ||||||
|     } |  | ||||||
|      |      | ||||||
|      |      | ||||||
|      |      | ||||||
| @@ -62,6 +130,7 @@ struct SetGame { | |||||||
|         var color: Color |         var color: Color | ||||||
|         var isMatched: Bool = false |         var isMatched: Bool = false | ||||||
|         var isSelected: Bool = false |         var isSelected: Bool = false | ||||||
|  |         var isOnTheTable: Bool = false | ||||||
|         var numberOnCard: Int |         var numberOnCard: Int | ||||||
|     } |     } | ||||||
|      |      | ||||||
|   | |||||||
| @@ -19,12 +19,30 @@ class SetGameModelView: ObservableObject { | |||||||
|     } |     } | ||||||
|      |      | ||||||
|     var cardsOnTable: Array<Card> { |     var cardsOnTable: Array<Card> { | ||||||
|         model.cardsOnTable |         var cardsOnTable: Array<Card> = Array() | ||||||
|  |         for card in model.cards { | ||||||
|  |             if (card.isOnTheTable && !card.isMatched) { | ||||||
|  |                 cardsOnTable.append(card) | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return cardsOnTable | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     func newGame() { |     func newGame() { | ||||||
|         self.model = SetGame() |         self.model = SetGame() | ||||||
|     } |     } | ||||||
|      |      | ||||||
|  |     func choose(_ card: Card) { | ||||||
|  |         self.model.choose(card) | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     var score: Int { | ||||||
|  |         model.score | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     func deal() { | ||||||
|  |         self.model.addCardsToTable(3) | ||||||
|  |     } | ||||||
|  |      | ||||||
|      |      | ||||||
| } | } | ||||||
|   | |||||||
| @@ -13,11 +13,20 @@ struct SetGameView: View { | |||||||
|     var body: some View { |     var body: some View { | ||||||
|         VStack { |         VStack { | ||||||
|             AspectVGrid(items: game.cardsOnTable, aspectRatio: 2/3) { card in |             AspectVGrid(items: game.cardsOnTable, aspectRatio: 2/3) { card in | ||||||
|                 CardView(card: card).foregroundColor(.red) |                 CardView(card: card).foregroundColor(.red).onTapGesture { | ||||||
|  |                     game.choose(card) | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|             Spacer() |             Spacer() | ||||||
|             Spacer() |             Spacer() | ||||||
|             Button(action: {game.newGame()}, label: {Text("New game").font(.largeTitle)}) |             VStack { | ||||||
|  |                 Button(action: {game.deal()}, label: { Text("Deal 3 more cards").font(.largeTitle) }) | ||||||
|  |                 HStack { | ||||||
|  |                     Button(action: {game.newGame()}, label: {Text("New game").font(.largeTitle)}).padding() | ||||||
|  |                     Spacer() | ||||||
|  |                     Text("\(game.score)").font(.largeTitle).bold() | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|      |      | ||||||
| @@ -30,6 +39,7 @@ struct CardView: View { | |||||||
|     var color: Color |     var color: Color | ||||||
|     var symbol: CardSymbol |     var symbol: CardSymbol | ||||||
|     var shading: CardShading |     var shading: CardShading | ||||||
|  |     var selectedGreen: Color = Color(hue: 0.355, saturation: 1.0, brightness: 1.0) | ||||||
|      |      | ||||||
|     init(card: SetGameModelView.Card) { |     init(card: SetGameModelView.Card) { | ||||||
|         self.card = card |         self.card = card | ||||||
| @@ -44,11 +54,13 @@ struct CardView: View { | |||||||
|             ZStack { |             ZStack { | ||||||
|                 let cardShape = RoundedRectangle(cornerRadius: 10) |                 let cardShape = RoundedRectangle(cornerRadius: 10) | ||||||
|                 cardShape.aspectRatio(2/3, contentMode: .fit) |                 cardShape.aspectRatio(2/3, contentMode: .fit) | ||||||
|                 cardShape.foregroundColor(.white) |                 if (card.isSelected) { | ||||||
|  |                     cardShape.foregroundColor(selectedGreen) | ||||||
|  |                 } else { | ||||||
|  |                     cardShape.foregroundColor(.white) | ||||||
|  |                 } | ||||||
|                 cardShape.strokeBorder(lineWidth: 5) |                 cardShape.strokeBorder(lineWidth: 5) | ||||||
|                  |                  | ||||||
|                 if (shading == CardShading.open) { |  | ||||||
|                 } |  | ||||||
|                 VStack { |                 VStack { | ||||||
|                     ForEach (0..<numberOfSymbols, id: \.self) { _ in |                     ForEach (0..<numberOfSymbols, id: \.self) { _ in | ||||||
|                         createShape().frame(height: geometry.size.height/4) |                         createShape().frame(height: geometry.size.height/4) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user