Added Deal 3 more cards button

This commit is contained in:
2023-04-10 20:38:12 +02:00
parent 5665c75030
commit 85fb6a1bc9
3 changed files with 122 additions and 23 deletions

View File

@@ -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> {
@@ -42,16 +116,10 @@ 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
} }

View File

@@ -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)
}
} }

View File

@@ -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)