Commit 4c5645cf by Rafa Castillo Passols

Merge para conectar la dificultad con el juego

parents 20142c9c d13b5051
......@@ -15,16 +15,28 @@ class Dificultad {
final int _limite;
final int _maxIntentos;
final String _nombre;
const Dificultad({required limite, required maxIntentos}):
_limite = limite, _maxIntentos = maxIntentos;
const Dificultad({required limite, required maxIntentos, required nombre}):
_limite = limite, _maxIntentos = maxIntentos, _nombre = nombre;
int get limite => _limite;
int get maxIntentos => _maxIntentos;
String get nombre => _nombre;
static const Dificultad facil = Dificultad(limite: 100, maxIntentos: 7+1);
static const Dificultad normal = Dificultad(limite: 500, maxIntentos: 9+1);
static const Dificultad dificil = Dificultad(limite: 1000, maxIntentos: 10+1);
static final Dificultad facil = Dificultad(
limite: 100,
maxIntentos: 7+1,
nombre: "Fácil");
static final Dificultad normal = Dificultad(
limite: 500,
maxIntentos: 9+1,
nombre: "Normal"
);
static final Dificultad dificil = Dificultad(
limite: 1000,
maxIntentos: 10+1,
nombre: "Dificil"
);
int generarNumero() => Random().nextInt(limite) + 1;
int generarPuntuacion(int intentos) => (maxIntentos-intentos)*100;
......
import 'package:flutter/material.dart';
import 'package:peponator/modelo/dificultad.dart';
// TODO: CARGAR LAS DIFICULTADES CARGADAS EN MEMORIA
class ListaDificultad extends ChangeNotifier {
final _dificultades = <Dificultad>[
Dificultad.facil,
Dificultad.normal,
Dificultad.dificil
];
List<Dificultad> get dificultades => List.unmodifiable(_dificultades);
int get length => _dificultades.length;
Dificultad get(int index) {
return _dificultades[index];
}
void add(Dificultad dificultad) {
_dificultades.add(dificultad);
notifyListeners();
}
void delete(int indice) {
_dificultades.removeAt(indice);
notifyListeners();
}
void update(int indice, Dificultad nuevo) {
_dificultades[indice] = nuevo;
notifyListeners();
}
}
\ No newline at end of file
export 'pista.dart';
export 'peponator_record.dart';
export 'dificultad.dart';
export 'partida.dart';
\ No newline at end of file
export 'partida.dart';
export 'listaDificultad.dart';
\ No newline at end of file
export 'pantalla_juego.dart';
export 'pantalla_records.dart';
\ No newline at end of file
export 'pantalla_records.dart';
export 'pantalla_dificultad.dart';
\ No newline at end of file
import 'package:flutter/material.dart';
import 'package:peponator/modelo/modelo.dart';
import 'package:peponator/widgets/widgets.dart';
import 'package:provider/provider.dart';
class PantallaDificultad extends StatelessWidget {
const PantallaDificultad({super.key});
Widget construirListaDificultad() {
return Consumer<ListaDificultad>(
builder: (context, manager, child) {
return SafeArea(
child: ListView.separated(
itemBuilder: (context, index) {
return DificultadWidget(indice: index,);
},
separatorBuilder: (context, index) => const SizedBox(height: 8),
itemCount: manager.length)
);
}
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Selecciona dificultad"),
),
body: construirListaDificultad(),
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.add),
onPressed: () async {
Dificultad? nuevo = await
showDialog<Dificultad>(
context: context,
builder: (context) => DificultadDialog()
);
if (nuevo != null && context.mounted) {
Provider.of<ListaDificultad>(context, listen: false).add(nuevo);
}
}
),
);
}
}
import 'package:flutter/material.dart';
import 'package:peponator/modelo/modelo.dart';
import 'package:peponator/modelo/dificultad.dart';
import 'package:peponator/modelo/listaDificultad.dart';
import 'package:provider/provider.dart';
import 'package:peponator/paginas/paginas.dart';
import 'package:peponator/paginas/pantalla_dificultad.dart';
import 'package:peponator/paginas/pantalla_juego.dart';
class PeponatorApp extends StatelessWidget {
......@@ -18,7 +21,13 @@ class PeponatorApp extends StatelessWidget {
),
darkTheme: ThemeData.dark(),
themeMode: ThemeMode.system,
home: PantallaJuego(key: key, fromHome: true, dificultad: Dificultad.facil,)
home: MultiProvider(
// TODO: Al implementar los preferencias habrá que leer de memoria
providers: [
ChangeNotifierProvider(create: (context) => ListaDificultad()),
],
child: PantallaJuego(fromHome: true, dificultad: Dificultad.facil),
)
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:peponator/modelo/dificultad.dart';
class DificultadDialog extends StatefulWidget {
final Dificultad? dificultad;
const DificultadDialog({super.key, this.dificultad});
@override
State<DificultadDialog> createState() => _DificultadDialogState();
}
// TODO: HACER QUE 'HECHO' SE DESABILITE CUANDO CAMPOS VACIOS
// TODO: MEJORAR EL ASPECTO
// TODO: CAMBIAR PARA USAR IDIOMA
class _DificultadDialogState extends State<DificultadDialog> {
@override
Widget build(BuildContext context) {
TextEditingController limiteController = TextEditingController(
text: widget.dificultad?.limite.toString()
);
TextEditingController intentosController = TextEditingController(
text: widget.dificultad?.maxIntentos.toString()
);
TextEditingController nombreController = TextEditingController(
text: widget.dificultad?.toString()
);
return SimpleDialog(
title: Text(
widget.dificultad != null
? "Editar dificultad"
: "Añadir dificultad"
),
children: [
SimpleDialogOption(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("Limite superior"),
TextField(
controller: limiteController,
keyboardType: TextInputType.number,
inputFormatters: [FilteringTextInputFormatter.digitsOnly],
),
const SizedBox(height: 16,),
Text("Número de intentos"),
TextField(
controller: intentosController,
keyboardType: TextInputType.number,
inputFormatters: [FilteringTextInputFormatter.digitsOnly],
),
const SizedBox(height: 16,),
Text("Nombre"),
TextField(controller: nombreController),
],
),
),
SimpleDialogOption(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SimpleDialogOption(
onPressed: () {
Navigator.pop(context,
Dificultad(
limite: int.parse(limiteController.text),
maxIntentos: int.parse(intentosController.text),
nombre: nombreController.text,
)
);
},
child: Text("Hecho"),
),
SimpleDialogOption(
onPressed: () => Navigator.pop(context),
child: Text("Cancelar"),
)
],
),
)
],
);
}
}
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:peponator/modelo/modelo.dart';
import 'package:peponator/widgets/dificultad_dialog.dart';
// TODO: HACER QUE SEA MENOS FEO
class DificultadWidget extends StatelessWidget {
final int indice;
const DificultadWidget({super.key, required this.indice});
@override
Widget build(BuildContext context) {
ListaDificultad listaDificultad = Provider.of(context, listen: false);
Dificultad dificultad = listaDificultad.get(indice);
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,),
],
),
],
),
);
}
}
......@@ -2,4 +2,6 @@ export 'tu_mensaje.dart';
export 'peponator_mensaje.dart';
export 'pista_widget.dart';
export 'teclado_numerico.dart';
export 'pantalla_pausa.dart';
\ No newline at end of file
export 'pantalla_pausa.dart';
export 'dificultad_dialog.dart';
export 'widget_dificultad.dart';
\ No newline at end of file
......@@ -36,6 +36,8 @@ dependencies:
cupertino_icons: ^1.0.8
shared_preferences: ^2.5.3
path_provider: ^2.1.5
provider: ^6.1.5
uuid: ^4.5.1
dev_dependencies:
flutter_test:
......
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