Sistema de dificultades hecho. Hay asperezas pero la base está

parent 4c5645cf
......@@ -8,8 +8,12 @@ class ListaDificultad extends ChangeNotifier {
Dificultad.normal,
Dificultad.dificil
];
int _indiceSeleccionado = 0;
List<Dificultad> get dificultades => List.unmodifiable(_dificultades);
int get length => _dificultades.length;
int get indiceSeleccionado => _indiceSeleccionado;
Dificultad get seleccionada => _dificultades[_indiceSeleccionado];
Dificultad get(int index) {
return _dificultades[index];
......@@ -29,4 +33,9 @@ class ListaDificultad extends ChangeNotifier {
_dificultades[indice] = nuevo;
notifyListeners();
}
void select(int indice) {
_indiceSeleccionado = indice;
notifyListeners();
}
}
\ No newline at end of file
......@@ -25,6 +25,10 @@ class PantallaDificultad extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: BackButton(onPressed: () {
Dificultad seleccionada = Provider.of<ListaDificultad>(context, listen: false).seleccionada;
Navigator.maybePop(context, seleccionada);
}),
title: const Text("Selecciona dificultad"),
),
body: construirListaDificultad(),
......
......@@ -4,6 +4,7 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:peponator/modelo/dificultad.dart';
import 'package:peponator/modelo/listaDificultad.dart';
import 'package:peponator/modelo/peponator_record.dart';
import 'package:peponator/modelo/pista.dart';
import 'package:peponator/paginas/paginas.dart';
......@@ -13,15 +14,14 @@ import 'dart:math';
import 'package:peponator/widgets/teclado_numerico.dart';
import 'package:peponator/widgets/tu_mensaje.dart';
import 'package:provider/provider.dart';
// TODO: PantallaJuego debería introducirse en una vista PageStorage para almacenar el estado del scrollController
class PantallaJuego extends StatefulWidget {
final bool fromHome;
final Dificultad dificultad;
const PantallaJuego({super.key, required this.fromHome,
required this.dificultad});
const PantallaJuego({super.key, required this.fromHome});
@override
State<PantallaJuego> createState() => _PantallaJuegoState();
......@@ -37,19 +37,19 @@ class _PantallaJuegoState extends State<PantallaJuego>
double animatedValue = 0.0;
bool _updateMaximum = false;
late Dificultad dificultad;
late int limiteInferior;
late int limiteSuperior;
late int numeroAdivinar;
late final int maxIntentos;
int? numeroEscogido;
late int maxIntentos;
late int intentos;
List<Widget> mensajes = [];
List<Pista> pistas = [];
late int limiteInferior;
late int limiteSuperior;
late bool manoDerecha = true;
int? numeroEscogido;
late int intentos;
List<Pista> pistas = [];
late bool mostrarPistas;
late bool todasPistasBien;
late bool porDesbloquear;
......@@ -66,13 +66,13 @@ class _PantallaJuegoState extends State<PantallaJuego>
late final File recordsFile;
List<PeponatorRecord>? records;
@override
void initState() {
super.initState();
_loadRecords();
maxIntentos = widget.dificultad.maxIntentos;
ListaDificultad dificultades = context.read<ListaDificultad>();
dificultad = dificultades.seleccionada;
recordTextController.addListener(() =>
setState(() {
......@@ -100,9 +100,9 @@ class _PantallaJuegoState extends State<PantallaJuego>
pistas.clear();
limiteInferior = 1;
limiteSuperior = widget.dificultad.limite;
numeroAdivinar = widget.dificultad.generarNumero();
limiteSuperior = dificultad.limite;
numeroAdivinar = dificultad.generarNumero();
maxIntentos = dificultad.maxIntentos;
intentos = 0;
for(int i = 0; i < ClasePista.values.length && i < ((maxIntentos-1)/5).floor(); i++){
......@@ -142,6 +142,23 @@ class _PantallaJuegoState extends State<PantallaJuego>
});
}
void _cambiarDificultadPausa() async {
Dificultad? nuevaDificultad = await
Navigator.push<Dificultad>(
context,
MaterialPageRoute(
builder: (BuildContext context) => PantallaDificultad()
)
);
if (nuevaDificultad != null && dificultad != nuevaDificultad) {
setState(() {
dificultad = nuevaDificultad;
_nuevaPartida();
});
}
}
@override
void dispose() {
textController.dispose();
......@@ -198,7 +215,7 @@ class _PantallaJuegoState extends State<PantallaJuego>
_nuevaPartida();
break;
case OpcionPausa.cambiarDificultad:
// TODO: Handle this case.
_cambiarDificultadPausa();
break;
case OpcionPausa.salir:
// TODO: Handle this case.
......
......@@ -12,22 +12,20 @@ class PeponatorApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: Escribir en preferencias los ajustes por defecto (presumo el modo Fácil)
return MaterialApp(
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.cyan),
brightness: Brightness.light,
useMaterial3: true
),
darkTheme: ThemeData.dark(),
themeMode: ThemeMode.system,
home: MultiProvider(
// TODO: Al implementar los preferencias habrá que leer de memoria
return MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => ListaDificultad()),
],
child: PantallaJuego(fromHome: true, dificultad: Dificultad.facil),
)
child: MaterialApp(
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.cyan),
brightness: Brightness.light,
useMaterial3: true
),
darkTheme: ThemeData.dark(),
themeMode: ThemeMode.system,
home: PantallaJuego(fromHome: true),
),
);
}
}
......@@ -24,7 +24,7 @@ class _DificultadDialogState extends State<DificultadDialog> {
text: widget.dificultad?.maxIntentos.toString()
);
TextEditingController nombreController = TextEditingController(
text: widget.dificultad?.toString()
text: widget.dificultad?.nombre
);
return SimpleDialog(
......
......@@ -4,6 +4,7 @@ import 'package:peponator/modelo/modelo.dart';
import 'package:peponator/widgets/dificultad_dialog.dart';
// TODO: HACER QUE SEA MENOS FEO
// TODO: MARCAR DIFICULTAD SELECCIONADA
class DificultadWidget extends StatelessWidget {
final int indice;
......@@ -13,39 +14,47 @@ class DificultadWidget extends StatelessWidget {
Widget build(BuildContext context) {
ListaDificultad listaDificultad = Provider.of(context, listen: false);
Dificultad dificultad = listaDificultad.get(indice);
bool seleccionado = indice == listaDificultad.indiceSeleccionado;
return GestureDetector(
onTap: () async {
Dificultad? cambiado = await
showDialog<Dificultad>(
context: context,
builder: (context) => DificultadDialog(dificultad: dificultad,)
);
if (cambiado != null && context.mounted) {
listaDificultad.update(indice, cambiado);
}
},
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
const SizedBox(width: 8,),
Text(
dificultad.nombre,
style: Theme.of(context).textTheme.titleLarge,
),
],
),
Text("Intentos: ${dificultad.maxIntentos}"),
Row(
children: [
Text("1 - ${dificultad.limite}"),
const SizedBox(width: 8,),
],
),
],
return Container(
decoration: seleccionado
? BoxDecoration(border: Border.all(color: Colors.red))
: null,
child: GestureDetector(
onTap: () => listaDificultad.select(indice),
onLongPress: () async {
Dificultad? cambiado = await
showDialog<Dificultad>(
context: context,
builder: (context) => DificultadDialog(dificultad: dificultad,)
);
if (cambiado != null && context.mounted) {
listaDificultad.update(indice, cambiado);
}
},
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
const SizedBox(width: 8, height: 16,),
Text(
dificultad.nombre,
style: Theme.of(context).textTheme.titleLarge,
),
],
),
Text("Intentos: ${dificultad.maxIntentos}"),
Row(
children: [
Text("1 - ${dificultad.limite}"),
const SizedBox(width: 8, height: 16,),
],
),
],
),
),
);
}
}
}
\ No newline at end of file
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