From 85fb6a1bc9ad5fa64629c21bf0abf911ff4328ca Mon Sep 17 00:00:00 2001 From: oliverhnat Date: Mon, 10 Apr 2023 20:38:12 +0200 Subject: [PATCH] Added Deal 3 more cards button --- Set/SetGame.swift | 103 +++++++++++++++++++++++++++++++------ Set/SetGameModelView.swift | 20 ++++++- Set/SetGameView.swift | 22 ++++++-- 3 files changed, 122 insertions(+), 23 deletions(-) diff --git a/Set/SetGame.swift b/Set/SetGame.swift index d6030b0..6c6afa0 100644 --- a/Set/SetGame.swift +++ b/Set/SetGame.swift @@ -9,19 +9,93 @@ import Foundation import SwiftUI struct SetGame { - private var deck: Array - private(set) var cardsOnTable: Array + private(set) var cards: Array + 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 = 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(_ 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() { var deck = SetGame.createCards() deck.shuffle() - let cardsOnTable = Array(deck[0..<12]) - deck.removeAll { card in - cardsOnTable.contains { $0 == card } + for i in 0..<12 { + deck[i].isOnTheTable = true } - self.deck = deck - self.cardsOnTable = cardsOnTable + self.cards = deck + print(cards.count) } private static func createCards() -> Array { @@ -41,17 +115,11 @@ struct SetGame { } 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 isMatched: Bool = false var isSelected: Bool = false + var isOnTheTable: Bool = false var numberOnCard: Int } diff --git a/Set/SetGameModelView.swift b/Set/SetGameModelView.swift index 9c85264..06a37d4 100644 --- a/Set/SetGameModelView.swift +++ b/Set/SetGameModelView.swift @@ -19,12 +19,30 @@ class SetGameModelView: ObservableObject { } var cardsOnTable: Array { - model.cardsOnTable + var cardsOnTable: Array = Array() + for card in model.cards { + if (card.isOnTheTable && !card.isMatched) { + cardsOnTable.append(card) + } + } + return cardsOnTable } func newGame() { self.model = SetGame() } + func choose(_ card: Card) { + self.model.choose(card) + } + + var score: Int { + model.score + } + + func deal() { + self.model.addCardsToTable(3) + } + } diff --git a/Set/SetGameView.swift b/Set/SetGameView.swift index a49685a..a70dc51 100644 --- a/Set/SetGameView.swift +++ b/Set/SetGameView.swift @@ -13,11 +13,20 @@ struct SetGameView: View { var body: some View { VStack { 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() - 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 symbol: CardSymbol var shading: CardShading + var selectedGreen: Color = Color(hue: 0.355, saturation: 1.0, brightness: 1.0) init(card: SetGameModelView.Card) { self.card = card @@ -44,11 +54,13 @@ struct CardView: View { ZStack { let cardShape = RoundedRectangle(cornerRadius: 10) cardShape.aspectRatio(2/3, contentMode: .fit) - cardShape.foregroundColor(.white) + if (card.isSelected) { + cardShape.foregroundColor(selectedGreen) + } else { + cardShape.foregroundColor(.white) + } cardShape.strokeBorder(lineWidth: 5) - if (shading == CardShading.open) { - } VStack { ForEach (0..