mirror of
https://github.com/LucasVbr/Queezer.git
synced 2026-05-13 17:11:55 +00:00
feat: Auto check music
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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<Track>) {
|
||||
class GameManager() {
|
||||
|
||||
private var mediaPlayer: MediaPlayer = MediaPlayer()
|
||||
val countDownManager = CountdownManager(30000L, onFinish = ::nextTrack)
|
||||
|
||||
var settings: Settings = Settings()
|
||||
var tracks: List<Track> = emptyList()
|
||||
|
||||
var currentTrackIndex: Int = 0;
|
||||
var score = 0
|
||||
|
||||
constructor(settings: Settings, tracks: List<Track>) : 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]
|
||||
|
||||
@@ -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)
|
||||
|
||||
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),
|
||||
.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
|
||||
)
|
||||
}
|
||||
|
||||
Row {
|
||||
if (currentTrack!!.title.answer == Answer.CORRECT || currentTrack!!.title.answer == Answer.UNKNOWN) {
|
||||
Text("Titre : ${currentTrack!!.title.value}", fontSize = 20.sp)
|
||||
Text("Artiste : ${currentTrack!!.artist.value}", fontSize = 20.sp)
|
||||
|
||||
// Champ de texte pour entrer la proposition
|
||||
} else {
|
||||
TextField(
|
||||
value = userInput.value,
|
||||
onValueChange = { userInput.value = it },
|
||||
label = { Text("Titre / Artiste") },
|
||||
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()
|
||||
)
|
||||
|
||||
// Bouton Valider la réponse
|
||||
Button(
|
||||
onClick = {
|
||||
userInput.value = "" // Réinitialiser le champ de texte
|
||||
}
|
||||
) { 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()
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user