Added Deal 3 more cards button
This commit is contained in:
@@ -9,19 +9,93 @@ import Foundation
|
||||
import SwiftUI
|
||||
|
||||
struct SetGame {
|
||||
private var deck: Array<Card>
|
||||
private(set) var cardsOnTable: Array<Card>
|
||||
private(set) var cards: 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() {
|
||||
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<SetGame.Card> {
|
||||
@@ -42,16 +116,10 @@ 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
|
||||
}
|
||||
|
||||
|
||||
@@ -19,12 +19,30 @@ class SetGameModelView: ObservableObject {
|
||||
}
|
||||
|
||||
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() {
|
||||
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 {
|
||||
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)
|
||||
if (card.isSelected) {
|
||||
cardShape.foregroundColor(selectedGreen)
|
||||
} else {
|
||||
cardShape.foregroundColor(.white)
|
||||
}
|
||||
cardShape.strokeBorder(lineWidth: 5)
|
||||
|
||||
if (shading == CardShading.open) {
|
||||
}
|
||||
VStack {
|
||||
ForEach (0..<numberOfSymbols, id: \.self) { _ in
|
||||
createShape().frame(height: geometry.size.height/4)
|
||||
|
||||
Reference in New Issue
Block a user