Hecho la puntuación algo más compleja

parent c5ede89b
......@@ -7,12 +7,7 @@ import 'dart:math';
///
/// Dado un número de intentos, conseguir adivinar un número en una
/// 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 {
// TODO: SISTEMA PARA CALCULAR PUNTUACIÓN. Pensar en log2(limite)
final int _limite;
final int _maxIntentos;
final String _nombre;
......@@ -58,7 +53,17 @@ class Dificultad {
);
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) {
return Dificultad(
......@@ -67,6 +72,7 @@ class Dificultad {
nombre: otro.nombre
);
}
@override
bool operator ==(Object other) {
if (other is! Dificultad) {
......
......@@ -141,15 +141,19 @@ class _PantallaJuegoState extends State<PantallaJuego>
jugador = "";
}
void _cambiarDificultadPausa() async {
Dificultad prev = Dificultad.copia(dificultad);
Dificultad? nueva = await
Future<Dificultad?> _cambiarDificultad() async {
return await
Navigator.push<Dificultad>(
context,
MaterialPageRoute(
builder: (BuildContext context) => PantallaDificultad()
)
context,
MaterialPageRoute(
builder: (BuildContext context) => PantallaDificultad()
)
);
}
void _cambiarDificultadPausa() async {
Dificultad prev = Dificultad.copia(dificultad);
Dificultad? nueva = await _cambiarDificultad();
if (nueva != null && prev != nueva) {
setState(() {
dificultad = nueva;
......@@ -158,6 +162,13 @@ class _PantallaJuegoState extends State<PantallaJuego>
}
}
void _cambiarDificultadFin() async {
Dificultad? nueva = await _cambiarDificultad();
if (nueva != null) {
dificultad = nueva;
}
}
@override
void dispose() {
textController.dispose();
......@@ -847,8 +858,7 @@ class _PantallaJuegoState extends State<PantallaJuego>
};
break;
case OpcionesFinPartida.cambiarDificultad:
// TODO: Handle this case.
onPressed = () { };
onPressed = _cambiarDificultadFin;
break;
case OpcionesFinPartida.salir:
// TODO: Handle this case.
......@@ -997,7 +1007,7 @@ class _PantallaJuegoState extends State<PantallaJuego>
void _escribirRespuesta() async {
await Future.delayed(Duration(milliseconds: 600));
setState(() {
// TODO: Construir respuesta de Peponator
if(numeroEscogido! < numeroAdivinar){
limiteInferior = numeroEscogido! + 1;
_updateMaximum = false;
......@@ -1008,9 +1018,7 @@ class _PantallaJuegoState extends State<PantallaJuego>
}
if(numeroEscogido! == numeroAdivinar){
victoria = true;
// TODO: Calcular puntuación
puntuacion = 1500;
puntuacion = dificultad.generarPuntuacion(intentos);
if(records != null){
posicion = records!.length;
......@@ -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?"));
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