Hecho la puntuación algo más compleja

parent c5ede89b
...@@ -7,12 +7,7 @@ import 'dart:math'; ...@@ -7,12 +7,7 @@ import 'dart:math';
/// ///
/// Dado un número de intentos, conseguir adivinar un número en una /// Dado un número de intentos, conseguir adivinar un número en una
/// dificultad mayor debería de dar una puntuación mayor. /// dificultad mayor debería de dar una puntuación mayor.
///
/// La penalización por tener pistas debería de ser mayor cuanto
/// mayor sea la dificultad.
class Dificultad { class Dificultad {
// TODO: SISTEMA PARA CALCULAR PUNTUACIÓN. Pensar en log2(limite)
final int _limite; final int _limite;
final int _maxIntentos; final int _maxIntentos;
final String _nombre; final String _nombre;
...@@ -58,7 +53,17 @@ class Dificultad { ...@@ -58,7 +53,17 @@ class Dificultad {
); );
int generarNumero() => Random().nextInt(limite) + 1; int generarNumero() => Random().nextInt(limite) + 1;
int generarPuntuacion(int intentos) => (maxIntentos-intentos)*100; int generarPuntuacion(int intentos) {
// Si adivinas en menos de estos intentos es suerte
final intentosMinimos = log(limite) / log(2); // log2(limite)
// Cuanto más difícil más puntos
final coeficienteDificultad = (intentosMinimos + 2)/_maxIntentos;
// En cuantos menos uses intentos mejor
final coeficienteResultado = (_maxIntentos + intentosMinimos + 3) / (_maxIntentos + intentos);
final resultado = coeficienteDificultad * coeficienteResultado * 10;
// Para que el resultado acabe siempre en 0
return resultado.round()*10;
}
factory Dificultad.copia(Dificultad otro) { factory Dificultad.copia(Dificultad otro) {
return Dificultad( return Dificultad(
...@@ -67,6 +72,7 @@ class Dificultad { ...@@ -67,6 +72,7 @@ class Dificultad {
nombre: otro.nombre nombre: otro.nombre
); );
} }
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
if (other is! Dificultad) { if (other is! Dificultad) {
......
...@@ -141,15 +141,19 @@ class _PantallaJuegoState extends State<PantallaJuego> ...@@ -141,15 +141,19 @@ class _PantallaJuegoState extends State<PantallaJuego>
jugador = ""; jugador = "";
} }
void _cambiarDificultadPausa() async { Future<Dificultad?> _cambiarDificultad() async {
Dificultad prev = Dificultad.copia(dificultad); return await
Dificultad? nueva = await
Navigator.push<Dificultad>( Navigator.push<Dificultad>(
context, context,
MaterialPageRoute( MaterialPageRoute(
builder: (BuildContext context) => PantallaDificultad() builder: (BuildContext context) => PantallaDificultad()
) )
); );
}
void _cambiarDificultadPausa() async {
Dificultad prev = Dificultad.copia(dificultad);
Dificultad? nueva = await _cambiarDificultad();
if (nueva != null && prev != nueva) { if (nueva != null && prev != nueva) {
setState(() { setState(() {
dificultad = nueva; dificultad = nueva;
...@@ -158,6 +162,13 @@ class _PantallaJuegoState extends State<PantallaJuego> ...@@ -158,6 +162,13 @@ class _PantallaJuegoState extends State<PantallaJuego>
} }
} }
void _cambiarDificultadFin() async {
Dificultad? nueva = await _cambiarDificultad();
if (nueva != null) {
dificultad = nueva;
}
}
@override @override
void dispose() { void dispose() {
textController.dispose(); textController.dispose();
...@@ -847,8 +858,7 @@ class _PantallaJuegoState extends State<PantallaJuego> ...@@ -847,8 +858,7 @@ class _PantallaJuegoState extends State<PantallaJuego>
}; };
break; break;
case OpcionesFinPartida.cambiarDificultad: case OpcionesFinPartida.cambiarDificultad:
// TODO: Handle this case. onPressed = _cambiarDificultadFin;
onPressed = () { };
break; break;
case OpcionesFinPartida.salir: case OpcionesFinPartida.salir:
// TODO: Handle this case. // TODO: Handle this case.
...@@ -997,7 +1007,7 @@ class _PantallaJuegoState extends State<PantallaJuego> ...@@ -997,7 +1007,7 @@ class _PantallaJuegoState extends State<PantallaJuego>
void _escribirRespuesta() async { void _escribirRespuesta() async {
await Future.delayed(Duration(milliseconds: 600)); await Future.delayed(Duration(milliseconds: 600));
setState(() { setState(() {
// TODO: Construir respuesta de Peponator
if(numeroEscogido! < numeroAdivinar){ if(numeroEscogido! < numeroAdivinar){
limiteInferior = numeroEscogido! + 1; limiteInferior = numeroEscogido! + 1;
_updateMaximum = false; _updateMaximum = false;
...@@ -1008,9 +1018,7 @@ class _PantallaJuegoState extends State<PantallaJuego> ...@@ -1008,9 +1018,7 @@ class _PantallaJuegoState extends State<PantallaJuego>
} }
if(numeroEscogido! == numeroAdivinar){ if(numeroEscogido! == numeroAdivinar){
victoria = true; victoria = true;
puntuacion = dificultad.generarPuntuacion(intentos);
// TODO: Calcular puntuación
puntuacion = 1500;
if(records != null){ if(records != null){
posicion = records!.length; posicion = records!.length;
...@@ -1020,6 +1028,7 @@ class _PantallaJuegoState extends State<PantallaJuego> ...@@ -1020,6 +1028,7 @@ class _PantallaJuegoState extends State<PantallaJuego>
} }
} }
// TODO: Construir respuesta de Peponator
mensajes.add(PeponatorMensaje(message: "¡Hola! Estoy pensando en un número del $limiteInferior al $limiteSuperior. ¿Te crees capaz de adivinarlo?")); mensajes.add(PeponatorMensaje(message: "¡Hola! Estoy pensando en un número del $limiteInferior al $limiteSuperior. ¿Te crees capaz de adivinarlo?"));
numeroEscogido = null; numeroEscogido = null;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment