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
64 lines
1.9 KiB
Dart
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;
|
|
}
|
|
}
|