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(
|
data class Input(
|
||||||
val value: String,
|
val value: String,
|
||||||
val answer: Answer = Answer.UNKNOWN
|
var answer: Answer = Answer.UNKNOWN
|
||||||
)
|
)
|
||||||
|
|
||||||
enum class Answer {
|
enum class Answer {
|
||||||
|
|||||||
@@ -2,17 +2,87 @@ package fr.univpau.queezer.manager
|
|||||||
|
|
||||||
import android.media.MediaPlayer
|
import android.media.MediaPlayer
|
||||||
import android.util.Log
|
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.Settings
|
||||||
import fr.univpau.queezer.data.Track
|
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()
|
private var mediaPlayer: MediaPlayer = MediaPlayer()
|
||||||
val countDownManager = CountdownManager(30000L, onFinish = ::nextTrack)
|
val countDownManager = CountdownManager(30000L, onFinish = ::nextTrack)
|
||||||
|
|
||||||
|
var settings: Settings = Settings()
|
||||||
|
var tracks: List<Track> = emptyList()
|
||||||
|
|
||||||
var currentTrackIndex: Int = 0;
|
var currentTrackIndex: Int = 0;
|
||||||
var score = 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? {
|
fun getCurrentTrack(): Track? {
|
||||||
if (tracks.isEmpty()) return null;
|
if (tracks.isEmpty()) return null;
|
||||||
return tracks[currentTrackIndex]
|
return tracks[currentTrackIndex]
|
||||||
@@ -27,13 +97,13 @@ class GameManager(var settings: Settings, val tracks: List<Track>) {
|
|||||||
mediaPlayer.release()
|
mediaPlayer.release()
|
||||||
|
|
||||||
|
|
||||||
if (currentTrackIndex >= tracks.size - 1) {
|
if (currentTrackIndex >= tracks.size - 1) {
|
||||||
return; // TODO vérifier avant meme de lancer la partie si le nombre de titres est suffisant
|
return; // TODO vérifier avant meme de lancer la partie si le nombre de titres est suffisant
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentTrackIndex >= settings.numberOfTitles!! - 1) {
|
if (currentTrackIndex >= settings.numberOfTitles!! - 1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
currentTrackIndex++
|
currentTrackIndex++
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import androidx.compose.runtime.remember
|
|||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.draw.blur
|
||||||
import androidx.compose.ui.layout.ContentScale
|
import androidx.compose.ui.layout.ContentScale
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.text.input.KeyboardType
|
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.data.Settings
|
||||||
import fr.univpau.queezer.manager.loadSettings
|
import fr.univpau.queezer.manager.loadSettings
|
||||||
import coil.compose.AsyncImage
|
import coil.compose.AsyncImage
|
||||||
|
import fr.univpau.queezer.data.Answer
|
||||||
import fr.univpau.queezer.manager.GameManager
|
import fr.univpau.queezer.manager.GameManager
|
||||||
import fr.univpau.queezer.manager.fetchAndFormatPlaylist
|
import fr.univpau.queezer.manager.fetchAndFormatPlaylist
|
||||||
|
|
||||||
@@ -54,7 +56,8 @@ fun GameScreen(navController: NavHostController) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// État de l'utilisateur et des éléments du jeu
|
// É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
|
// Affichage de l'interface
|
||||||
Column(
|
Column(
|
||||||
@@ -74,38 +77,67 @@ fun GameScreen(navController: NavHostController) {
|
|||||||
Text("Score : ${gameManager.score}", fontSize = 24.sp)
|
Text("Score : ${gameManager.score}", fontSize = 24.sp)
|
||||||
Text("Temps restant : ${gameManager.countDownManager.timeLeft}sec", fontSize = 20.sp)
|
Text("Temps restant : ${gameManager.countDownManager.timeLeft}sec", fontSize = 20.sp)
|
||||||
|
|
||||||
AsyncImage(
|
if (currentTrack!!.title.answer == Answer.CORRECT && currentTrack!!.artist.answer == Answer.UNKNOWN
|
||||||
model = currentTrack!!.album,
|
|| currentTrack!!.title.answer == Answer.UNKNOWN && currentTrack!!.artist.answer == Answer.CORRECT
|
||||||
contentDescription = "Image from URL",
|
|| currentTrack!!.title.answer == Answer.CORRECT && currentTrack!!.artist.answer == Answer.CORRECT) {
|
||||||
modifier = Modifier
|
AsyncImage(
|
||||||
.width(200.dp)
|
model = currentTrack!!.album,
|
||||||
.height(200.dp),
|
contentDescription = "Image from URL",
|
||||||
contentScale = ContentScale.Crop
|
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)
|
Row {
|
||||||
Text("Artiste : ${currentTrack!!.artist.value}", fontSize = 20.sp)
|
if (currentTrack!!.title.answer == Answer.CORRECT || currentTrack!!.title.answer == Answer.UNKNOWN) {
|
||||||
|
Text("Titre : ${currentTrack!!.title.value}", fontSize = 20.sp)
|
||||||
// Champ de texte pour entrer la proposition
|
} else {
|
||||||
TextField(
|
TextField(
|
||||||
value = userInput.value,
|
value = titleInput.value,
|
||||||
onValueChange = { userInput.value = it },
|
onValueChange = {
|
||||||
label = { Text("Titre / Artiste") },
|
titleInput.value = it;
|
||||||
keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Text),
|
gameManager.checkTitleAnswer(currentTrack, titleInput.value)
|
||||||
modifier = Modifier.fillMaxWidth()
|
},
|
||||||
)
|
label = { Text("Titre") },
|
||||||
|
keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Text),
|
||||||
// Bouton Valider la réponse
|
modifier = Modifier.fillMaxWidth()
|
||||||
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) {
|
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
|
||||||
Button(
|
Button(
|
||||||
onClick = {
|
onClick = {
|
||||||
userInput.value = "" // Réinitialiser le champ de texte
|
titleInput.value = ""
|
||||||
|
artistInput.value = ""
|
||||||
gameManager.nextTrack()
|
gameManager.nextTrack()
|
||||||
currentTrack = gameManager.getCurrentTrack()
|
currentTrack = gameManager.getCurrentTrack()
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user