Files
farolero/lib/modelos/palabra.dart
ShanaiaBot de2c8ffa18 El Impostor v0.1 — app Flutter completa
Juego de deducción social para 3-20 jugadores.
Modo un solo móvil completamente funcional.
1000 palabras en 10 categorías.
Notas privadas, votación, adivinanza, revancha.
Material 3 dark theme.
Package: es.freetimelab.elimpostor
2026-04-04 00:50:04 +02:00

64 lines
1.9 KiB
Dart

import 'dart:convert';
import 'dart:math';
import 'package:flutter/services.dart';
/// Categorías disponibles en el banco de palabras
class BancoPalabras {
final Map<String, List<String>> categorias;
BancoPalabras(this.categorias);
static BancoPalabras? _instancia;
static Future<BancoPalabras> cargar() async {
if (_instancia != null) return _instancia!;
final jsonStr = await rootBundle.loadString('assets/palabras.json');
final data = json.decode(jsonStr) as Map<String, dynamic>;
final cats = data['categorias'] as Map<String, dynamic>;
final mapa = <String, List<String>>{};
for (final entrada in cats.entries) {
mapa[entrada.key] = List<String>.from(entrada.value);
}
_instancia = BancoPalabras(mapa);
return _instancia!;
}
List<String> get nombresCategorias => categorias.keys.toList();
/// Obtiene una palabra aleatoria de la categoría dada (o de todas si es null)
String palabraAleatoria(String? categoria) {
final rng = Random();
if (categoria == null || categoria == 'todas') {
final todasPalabras = categorias.values.expand((l) => l).toList();
return todasPalabras[rng.nextInt(todasPalabras.length)];
}
final lista = categorias[categoria]!;
return lista[rng.nextInt(lista.length)];
}
/// Devuelve la categoría a la que pertenece una palabra
String? categoriaDepalabra(String palabra) {
for (final entrada in categorias.entries) {
if (entrada.value.contains(palabra)) return entrada.key;
}
return null;
}
static String nombreBonitoCategoria(String clave) {
const nombres = {
'todas': 'Todas',
'animales': 'Animales',
'comida': 'Comida',
'paises': 'Países',
'deportes': 'Deportes',
'profesiones': 'Profesiones',
'objetos': 'Objetos',
'lugares': 'Lugares',
'peliculas': 'Películas',
'musica': 'Música',
'tecnologia': 'Tecnología',
};
return nombres[clave] ?? clave;
}
}