// // WordPuzzleView.swift // AIGrammar // // Created by oscar on 2025/7/16. // import SwiftUI import AVFoundation struct WordPuzzleGameView: View { @State private var letters: [[String]] = [] @State private var selectedLetters: [(Int, Int)] = [] @State private var foundWords: [String] = [] @State private var score: Int = 0 @State private var remainingTime = 60 @State private var isGameOver = false @GestureState private var dragLocation: CGPoint? = nil @State private var audioPlayer: AVAudioPlayer? let validWords = ["WORD", "GAME", "PUZZLE", "MET", "ME", "GO"] let gridSize = 4 let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect() init() { var chars = Array("WORDPUZZLEGAMETO").map { String($0) } chars.shuffle() _letters = State(initialValue: stride(from: 0, to: chars.count, by: gridSize).map { Array(chars[$0..<$0+gridSize]) }) } var body: some View { VStack { Text("Time: \(remainingTime)s Score: \(score)") .font(.headline) if isGameOver { Text("Game Over!") .font(.largeTitle) .foregroundColor(.red) } else { VStack(spacing: 4) { ForEach(0.. 0 { remainingTime -= 1 } else { isGameOver = true timer.upstream.connect().cancel() } } } /// 点击选择 private func handleSelect(row: Int, col: Int) { if !selectedLetters.contains(where: { $0 == (row, col) }) { selectedLetters.append((row, col)) } } /// 拖动选择 private func selectLetter(at point: CGPoint?) { guard let point = point else { return } for row in 0..