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