diff --git a/app/src/main/java/fr/univpau/queezer/data/Track.kt b/app/src/main/java/fr/univpau/queezer/data/Track.kt index c40c52d..f514864 100644 --- a/app/src/main/java/fr/univpau/queezer/data/Track.kt +++ b/app/src/main/java/fr/univpau/queezer/data/Track.kt @@ -9,7 +9,7 @@ data class Track( data class Input( val value: String, - val answer: Answer = Answer.UNKNOWN + var answer: Answer = Answer.UNKNOWN ) enum class Answer { diff --git a/app/src/main/java/fr/univpau/queezer/manager/GameManager.kt b/app/src/main/java/fr/univpau/queezer/manager/GameManager.kt index b835c07..58df34c 100644 --- a/app/src/main/java/fr/univpau/queezer/manager/GameManager.kt +++ b/app/src/main/java/fr/univpau/queezer/manager/GameManager.kt @@ -2,17 +2,87 @@ package fr.univpau.queezer.manager import android.media.MediaPlayer import android.util.Log +import fr.univpau.queezer.data.Answer +import fr.univpau.queezer.data.GameMode import fr.univpau.queezer.data.Settings import fr.univpau.queezer.data.Track +import java.util.Locale -class GameManager(var settings: Settings, val tracks: List) { +class GameManager() { private var mediaPlayer: MediaPlayer = MediaPlayer() val countDownManager = CountdownManager(30000L, onFinish = ::nextTrack) + var settings: Settings = Settings() + var tracks: List = emptyList() + var currentTrackIndex: Int = 0; var score = 0 + constructor(settings: Settings, tracks: List) : this() { + this.settings = settings + this.tracks = tracks + + for (track in tracks) { + if (settings.gameMode == GameMode.TITLE) { + track.title.answer = Answer.INCORRECT + } + if (settings.gameMode == GameMode.ARTIST) { + track.artist.answer = Answer.INCORRECT + } + if (settings.gameMode == GameMode.ALL) { + track.title.answer = Answer.INCORRECT + track.artist.answer = Answer.INCORRECT + } + } + } + + fun checkTitleAnswer(currentTrack: Track?, answerTitle: String) { + if (currentTrack == null) return; + + Log.i("GameManager", "Current track: ${currentTrack.title.value}") + Log.i("GameManager", "Answer: $answerTitle") + + var simpleTitleAnswer = formatString(answerTitle) + var simpleTitle = formatString(currentTrack.title.value) + + if (simpleTitle.equals(simpleTitleAnswer, ignoreCase = true)) { + currentTrack.title.answer = Answer.CORRECT + score++ + } else { + currentTrack.title.answer = Answer.INCORRECT + } + } + + fun checkArtistAnswer(currentTrack: Track?, answerArtist: String) { + if (currentTrack == null) return; + + Log.i("GameManager", "Current track: ${currentTrack.artist.value}") + Log.i("GameManager", "Answer: $answerArtist") + + var simpleArtistAnswer = formatString(answerArtist) + var simpleArtist = formatString(currentTrack.artist.value) + + if (simpleArtist.equals(simpleArtistAnswer, ignoreCase = true)) { + currentTrack.artist.answer = Answer.CORRECT + score++ + } else { + currentTrack.artist.answer = Answer.INCORRECT + } + } + + fun formatString(input: String): String { + return input + .trim() + .toLowerCase(Locale.ROOT) + .removeSurrounding("(", ")") + .removeSurrounding("[", "]") + .removeSurrounding("{", "}") + .removeSurrounding("\"", "\"") + .replace("[^a-zA-Z0-9]".toRegex(), "") + .trim() + } + fun getCurrentTrack(): Track? { if (tracks.isEmpty()) return null; return tracks[currentTrackIndex] @@ -27,13 +97,13 @@ class GameManager(var settings: Settings, val tracks: List) { mediaPlayer.release() - if (currentTrackIndex >= tracks.size - 1) { - return; // TODO vérifier avant meme de lancer la partie si le nombre de titres est suffisant - } + if (currentTrackIndex >= tracks.size - 1) { + return; // TODO vérifier avant meme de lancer la partie si le nombre de titres est suffisant + } - if (currentTrackIndex >= settings.numberOfTitles!! - 1) { - return; - } + if (currentTrackIndex >= settings.numberOfTitles!! - 1) { + return; + } currentTrackIndex++ diff --git a/app/src/main/java/fr/univpau/queezer/screen/GameScreen.kt b/app/src/main/java/fr/univpau/queezer/screen/GameScreen.kt index 664e317..2a35232 100644 --- a/app/src/main/java/fr/univpau/queezer/screen/GameScreen.kt +++ b/app/src/main/java/fr/univpau/queezer/screen/GameScreen.kt @@ -23,6 +23,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.blur import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.input.KeyboardType @@ -33,6 +34,7 @@ import fr.univpau.queezer.R import fr.univpau.queezer.data.Settings import fr.univpau.queezer.manager.loadSettings import coil.compose.AsyncImage +import fr.univpau.queezer.data.Answer import fr.univpau.queezer.manager.GameManager import fr.univpau.queezer.manager.fetchAndFormatPlaylist @@ -54,7 +56,8 @@ fun GameScreen(navController: NavHostController) { } // État de l'utilisateur et des éléments du jeu - val userInput = remember { mutableStateOf("") } + val titleInput = remember { mutableStateOf("") } + val artistInput = remember { mutableStateOf("") } // Affichage de l'interface Column( @@ -74,38 +77,67 @@ fun GameScreen(navController: NavHostController) { Text("Score : ${gameManager.score}", fontSize = 24.sp) Text("Temps restant : ${gameManager.countDownManager.timeLeft}sec", fontSize = 20.sp) - AsyncImage( - model = currentTrack!!.album, - contentDescription = "Image from URL", - modifier = Modifier - .width(200.dp) - .height(200.dp), - contentScale = ContentScale.Crop - ) + if (currentTrack!!.title.answer == Answer.CORRECT && currentTrack!!.artist.answer == Answer.UNKNOWN + || currentTrack!!.title.answer == Answer.UNKNOWN && currentTrack!!.artist.answer == Answer.CORRECT + || currentTrack!!.title.answer == Answer.CORRECT && currentTrack!!.artist.answer == Answer.CORRECT) { + AsyncImage( + model = currentTrack!!.album, + contentDescription = "Image from URL", + modifier = Modifier + .width(200.dp) + .height(200.dp) + , + contentScale = ContentScale.Crop + ) + } else { + AsyncImage( + model = currentTrack!!.album, + contentDescription = "Image from URL", + modifier = Modifier + .width(200.dp) + .height(200.dp) + .blur(50.dp) + , + contentScale = ContentScale.Crop + ) + } - Text("Titre : ${currentTrack!!.title.value}", fontSize = 20.sp) - Text("Artiste : ${currentTrack!!.artist.value}", fontSize = 20.sp) - - // Champ de texte pour entrer la proposition - TextField( - value = userInput.value, - onValueChange = { userInput.value = it }, - label = { Text("Titre / Artiste") }, - keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Text), - modifier = Modifier.fillMaxWidth() - ) - - // Bouton Valider la réponse - Button( - onClick = { - userInput.value = "" // Réinitialiser le champ de texte + Row { + if (currentTrack!!.title.answer == Answer.CORRECT || currentTrack!!.title.answer == Answer.UNKNOWN) { + Text("Titre : ${currentTrack!!.title.value}", fontSize = 20.sp) + } else { + TextField( + value = titleInput.value, + onValueChange = { + titleInput.value = it; + gameManager.checkTitleAnswer(currentTrack, titleInput.value) + }, + label = { Text("Titre") }, + keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Text), + modifier = Modifier.fillMaxWidth() + ) } - ) { Text(context.resources.getString(R.string.submit)) } + } + + Row { + if (currentTrack!!.artist.answer == Answer.CORRECT || currentTrack!!.artist.answer == Answer.UNKNOWN) { + Text("Artiste : ${currentTrack!!.artist.value}", fontSize = 20.sp) + } else { + TextField( + value = artistInput.value, + onValueChange = { artistInput.value = it; gameManager.checkArtistAnswer(currentTrack, artistInput.value) }, + label = { Text("Artiste") }, + keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Text), + modifier = Modifier.fillMaxWidth() + ) + } + } Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) { Button( onClick = { - userInput.value = "" // Réinitialiser le champ de texte + titleInput.value = "" + artistInput.value = "" gameManager.nextTrack() currentTrack = gameManager.getCurrentTrack() },