-
-
Save florentinobenedictus/548fa36353d5c5ca2122e3bde10cf147 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.example.unscramble.ui | |
import androidx.lifecycle.ViewModel | |
import kotlinx.coroutines.flow.MutableStateFlow | |
import kotlinx.coroutines.flow.StateFlow | |
import kotlinx.coroutines.flow.asStateFlow | |
import com.example.unscramble.data.allWords | |
import androidx.compose.runtime.mutableStateOf | |
import androidx.compose.runtime.getValue | |
import androidx.compose.runtime.setValue | |
import com.example.unscramble.data.MAX_NO_OF_WORDS | |
import com.example.unscramble.data.SCORE_INCREASE | |
import kotlinx.coroutines.flow.update | |
class GameViewModel : ViewModel() { | |
// Game UI state | |
private val _uiState = MutableStateFlow(GameUiState()) | |
val uiState: StateFlow<GameUiState> = _uiState.asStateFlow() | |
var userGuess by mutableStateOf("") | |
private set | |
private lateinit var currentWord: String | |
// Set of words used in the game | |
private var usedWords: MutableSet<String> = mutableSetOf() | |
fun skipWord() { | |
updateGameState(_uiState.value.score) | |
// Reset user guess | |
updateUserGuess("") | |
} | |
private fun updateGameState(updatedScore: Int) { | |
if (usedWords.size == MAX_NO_OF_WORDS){ | |
//Last round in the game, update isGameOver to true, don't pick a new word | |
_uiState.update { currentState -> | |
currentState.copy( | |
isGuessedWordWrong = false, | |
score = updatedScore, | |
isGameOver = true | |
) | |
} | |
} else{ | |
// Normal round in the game | |
_uiState.update { currentState -> | |
currentState.copy( | |
isGuessedWordWrong = false, | |
currentScrambledWord = pickRandomWordAndShuffle(), | |
currentWordCount = currentState.currentWordCount.inc(), | |
score = updatedScore | |
) | |
} | |
} | |
} | |
fun checkUserGuess() { | |
if (userGuess.equals(currentWord, ignoreCase = true)) { | |
// User's guess is correct, increase the score | |
// and call updateGameState() to prepare the game for next round | |
val updatedScore = _uiState.value.score.plus(SCORE_INCREASE) | |
updateGameState(updatedScore) | |
} else { | |
// User's guess is wrong, show an error | |
_uiState.update { currentState -> | |
currentState.copy(isGuessedWordWrong = true) | |
} | |
} | |
// Reset user guess | |
updateUserGuess("") | |
} | |
fun updateUserGuess(guessedWord: String){ | |
userGuess = guessedWord | |
} | |
private fun pickRandomWordAndShuffle(): String { | |
// Continue picking up a new random word until you get one that hasn't been used before | |
currentWord = allWords.random() | |
if (usedWords.contains(currentWord)) { | |
return pickRandomWordAndShuffle() | |
} else { | |
usedWords.add(currentWord) | |
return shuffleCurrentWord(currentWord) | |
} | |
} | |
private fun shuffleCurrentWord(word: String): String { | |
val tempWord = word.toCharArray() | |
// Scramble the word | |
tempWord.shuffle() | |
while (String(tempWord).equals(word)) { | |
tempWord.shuffle() | |
} | |
return String(tempWord) | |
} | |
fun resetGame() { | |
usedWords.clear() | |
_uiState.value = GameUiState(currentScrambledWord = pickRandomWordAndShuffle()) | |
} | |
init { | |
resetGame() | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment