modify files

This commit is contained in:
2025-07-21 19:23:17 +08:00
parent 01a5ae0042
commit 04ad512bcc
9 changed files with 38807 additions and 230 deletions

View File

@ -175,83 +175,31 @@ class WordPuzzleViewModel: ObservableObject {
@Published var showToast = false
@Published var toastFlag = false
@Published var toastMessage = ""
@Published var toastColor = Color.green
private var timer: Timer?
private var allWords: Set<String> = ["WORD", "HAVE", "SWIFT", "CODE"] //
private var wordList: [String] = []
private var allWords: Set<String> = []
private var submittedWords: Set<String> = []
private let generator = PuzzleGenerator()
init() {
loadWordList()
generateNewPuzzle()
}
///
private func loadWordList() {
if let url = Bundle.main.url(forResource: "wordlist", withExtension: "txt") {
do {
let content = try String(contentsOf: url)
wordList = content
.components(separatedBy: .newlines)
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines).uppercased() }
.filter { !$0.isEmpty }
} catch {
logger.warning("Failed to load word list: \(error)")
}
} else {
logger.warning("wordlist.txt not found!")
}
logger.info("load wordlist. total words: \(wordList.count)")
}
///
///
func generateNewPuzzle() {
if wordList.isEmpty {
logger.warning("Word list is empty")
wordList = ["WORD", "HAVE", "SWIFT", "CODE"] //
}
var chosenWords: Set<String> = []
var uniqueLetters: Set<Character> = []
while (uniqueLetters.count < 16 && chosenWords.count < 6) || chosenWords.count < 4 {
if let word = wordList.randomElement() {
chosenWords.insert(word)
uniqueLetters.formUnion(word)
}
}
allWords = chosenWords
// uniqueLetters 16
var selectedLetters = Array(uniqueLetters)
let alphabet = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
while selectedLetters.count < 16 {
let randomLetter = alphabet.randomElement()!
if !selectedLetters.contains(randomLetter) {
selectedLetters.append(randomLetter)
}
}
//
let shuffledLetters = selectedLetters.shuffled()
letters = Array(repeating: Array(repeating: "", count: 4), count: 4)
for i in 0..<4 {
for j in 0..<4 {
letters[i][j] = String(shuffledLetters[i * 4 + j])
}
}
let (words, grid) = generator.generatePuzzle()
allWords = words
letters = grid
guessedWords = 0
selectedPositions.removeAll()
timeRemaining = 60
//shuffleCount = 0
logger.info("New puzzle generated with words: \(allWords) and letters: \(shuffledLetters)")
submittedWords.removeAll()
logger.info("New puzzle with words: \(allWords)")
}
func startTimer() {
stopTimer()
timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
@ -275,22 +223,32 @@ class WordPuzzleViewModel: ObservableObject {
guard !word.isEmpty else { return }
if timeRemaining <= 0 {
showToast(message: "Time's up!", succ: false)
showToast(message: "Time's up! Shuffle for new game.", succ: false)
return
}
if allWords.contains(word) {
if word.count < 3 {
showToast(message: "At least three words.", succ: false)
return
}
if submittedWords.contains(word) {
showToast(message: "Already submitted!", succ: false)
return
}
if generator.validate(word: word) {
guessedWords += 1
submittedWords.insert(word) //
showToast(message: "Correct!", succ: true)
} else {
showToast(message: "Please try again", succ: false)
}
if guessedWords >= 4 {
//stopTimer()
dailyWins += 1
showToast(message: "Congratulations! \nStart next puzzle...", succ: true)
generateNewPuzzle() //
showToast(message: "Congratulations! Next puzzle...", succ: true)
generateNewPuzzle()
}
}
@ -302,14 +260,11 @@ class WordPuzzleViewModel: ObservableObject {
shuffleCount += 1
generateNewPuzzle()
startTimer()
}
private func selectedWord() -> String {
var result = ""
for pos in selectedPositions {
result += letters[pos.row][pos.col]
}
return result
selectedPositions.map { letters[$0.row][$0.col] }.joined()
}
private func showToast(message: String, succ: Bool) {