SoliCards-iOS-iPadOS-MacOS/SoliCards/GameEngine/AutoCompleter.swift
idev2025 de0da01f25 feat: SoliCards v1.2.0 — native SwiftUI solitaire for iOS, iPadOS, macOS
Complete native rewrite of the web-based SoliCards game as a SwiftUI
multiplatform app targeting iOS 17+, iPadOS 17+, and macOS 14+.

Three solitaire variants (Klondike, Spider, FreeCell) with full game
rules, drag & drop, smart zoom layout, 6 themes, 4 difficulty levels,
SwiftData persistence, VoiceOver accessibility, and 57 unit tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 08:26:14 -04:00

39 lines
1.5 KiB
Swift

import Foundation
enum AutoCompleter {
/// Finds the next card that can be auto-moved to a foundation.
/// Returns the source location and foundation index, or nil if no move is available.
static func findNextAutoMove(state: GameSnapshot, rules: GameRules) -> (from: CardLocation, to: CardLocation)? {
// Check waste pile
if let topWaste = state.waste.last {
for (i, foundation) in state.foundations.enumerated() {
if MoveValidator.canPlaceOnFoundation(topWaste, topCard: foundation.last) {
return (.waste, .foundation(i))
}
}
}
// Check free cells
for (cellIndex, cell) in state.freeCells.enumerated() {
guard let card = cell else { continue }
for (i, foundation) in state.foundations.enumerated() {
if MoveValidator.canPlaceOnFoundation(card, topCard: foundation.last) {
return (.freeCell(cellIndex), .foundation(i))
}
}
}
// Check tableau tops
for (tabIndex, tableau) in state.tableaus.enumerated() {
guard let topCard = tableau.last, topCard.isFaceUp else { continue }
for (i, foundation) in state.foundations.enumerated() {
if MoveValidator.canPlaceOnFoundation(topCard, topCard: foundation.last) {
return (.tableau(tabIndex), .foundation(i))
}
}
}
return nil
}
}