Un juego de rol social donde:
- Un jugador es el LOBO (infiltrado, mata de noche)
- El resto son ALDEANOS (intentan votar al lobo durante el día)
- El lobo tiene que disimular y mentir
- Los aldeanos tienen que deducir quién es el lobo
- Turnos alternos: NOCHE (lobo mata) → DÍA (aldeanos votan)
Este proyecto integra:
- Enum: Roles (LOBO, ALDEANO)
- ArrayList: Gestión de jugadores
- Estados: Fases del juego (NOCHE, DÍA, FIN)
- Secretos: El lobo sabe su identidad, otros no
- Votaciones: Lógica de eliminación
- Random: Asignar roles y elegir muertes
- Menú interactivo: Acciones por turno
Rol (Enum)
├─ LOBO
└─ ALDEANO
Jugador
├─ nombre (String)
├─ rol (Rol)
├─ vivo (boolean)
└─ métodos: getRol(), getInfo(), morir()
Juego
├─ jugadores: ArrayList<Jugador>
├─ turnoActual: int
├─ fase: String (NOCHE/DÍA/FIN)
└─ métodos:
├─ asignarRoles()
├─ turnoNoche()
├─ turnoDía()
├─ votarJugador()
├─ verificarGanador()
└─ mostrarJugadores()
Main
└─ menú: setup, turnos, acciones
Crea un enum con 2 valores:
public enum Rol {
LOBO,
ALDEANO
}Muy simple, pero fundamental para diferenciar tipos.
Atributos:
nombre(String)rol(Rol)vivo(boolean) - inicialmente true
Métodos:
getRol()→ retorna rolgetNombre()→ retorna nombreisVivo()→ retorna vivomorir()→ pone vivo = falsegetInfo()→ retorna "Nombre (VIVO/MUERTO)" sin mostrar rol si está vivo- Ejemplo: "Juan (vivo)" si está vivo
- Ejemplo: "María (muerta) - era ALDEANO" si está muerta
Atributos:
jugadores(ArrayList)turnoActual(int) - comienza en 1fase(String) - "NOCHE", "DÍA", "FIN"random(Random)lobo(Jugador) - referencia al lobo
Constructor:
- Inicializa ArrayList vacío
- turnoActual = 1
- fase = "NOCHE"
Método agregarJugador(String nombre):
- Crea Jugador y agrega a ArrayList
- Imprime "✅ Jugador {nombre} unido"
Método asignarRoles():
Lógica:
- Valida que haya al menos 3 jugadores
- Elige índice aleatorio para el lobo:
random.nextInt(jugadores.size()) - Asigna ese jugador como LOBO, resto como ALDEANO
- Guarda referencia en
this.lobo
public void asignarRoles() {
if (jugadores.size() < 3) {
System.out.println("❌ Se necesitan al menos 3 jugadores");
return;
}
int indiceLoboPredeterminado = random.nextInt(jugadores.size());
for (int i = 0; i < jugadores.size(); i++) {
if (i == indiceLoboPredeterminado) {
jugadores.get(i).asignarRol(Rol.LOBO);
this.lobo = jugadores.get(i);
} else {
jugadores.get(i).asignarRol(Rol.ALDEANO);
}
}
System.out.println("✅ Roles asignados secretamente");
}Método turnoNoche():
- Imprime "🌙 === TURNO " + turnoActual + " - NOCHE ==="
- Imprime "🐺 El lobo despierta en secreto..."
- Solo el lobo ve esto:
- Muestra lista de aldeanos vivos (sin números, solo nombres)
- Pide: "¿A quién quieres matar? (nombre completo)"
- Busca el jugador elegido:
- Si no existe o ya está muerto: aviso
- Si es el lobo mismo: no puede
- Si existe y es aldeano vivo: lo mata
- Llama
lobo.matar(nombre) - Avanza a turno DÍA
Método turnoDía():
- Imprime "☀️ === TURNO " + turnoActual + " - DÍA ==="
- Revela la muerte:
- Si hay muerto: "💀 {nombre} fue asesinado por la noche. Era {rol}"
- Si no: "🙏 La aldea despierta en paz"
- Muestra vivos (para toda la aldea):
mostrarJugadoresVivos() - Debate y votación:
- Cada jugador vivo vota por alguien (incluido el lobo)
- Imprime: "{nombre} vota por: {votado}"
- Cuenta votos y expulsa al más votado:
- Si hay empate: expulsa al primero del empate
- Revela su rol: "{expulsado} era {rol}"
public void votarJugador(Scanner scanner) {
for (int i = 0; i < jugadores.size(); i++) {
Jugador j = jugadores.get(i);
if (!j.isVivo()) continue;
System.out.print(j.getNombre() + ", ¿a quién votas? ");
String votado = scanner.nextLine();
// Busca al votado
for (Jugador jVotado : jugadores) {
if (jVotado.getNombre().equalsIgnoreCase(votado) && jVotado.isVivo()) {
// Cuenta voto
// ...
break;
}
}
}
}Método verificarGanador() retorna String:
Condiciones:
- Ganan Aldeanos: No hay lobos vivos
- Retorna: "ALDEANOS"
- Ganan Lobos: Lobos ≥ Aldeanos vivos
- Retorna: "LOBOS"
- Sigue el juego: Retorna null
Método mostrarJugadoresVivos():
- Imprime: "👥 Jugadores vivos:"
- Lista cada uno: "{nombre}"
- Sin revelar rol
Método mostrarTodosConRoles() (para final):
- Imprime todos: "{nombre} - {rol}"
Menú principal:
🐺 === LoboGAME ===
1. Crear jugadores
2. Ver jugadores
3. Iniciar juego
4. Salir
Cuando Iniciar juego:
- Llama
asignarRoles() - Loop de turnos:
Mientras fase != "FIN": - turnoNoche() - verificarGanador() → si gana alguien, fase = "FIN" - turnosDía() - verificarGanador() → si gana alguien, fase = "FIN" - turnoActual++ - Muestra ganador y todos los roles
🐺 === LoboGAME ===
1. Crear jugadores
...
Elige: 1
Nombre: Juan
✅ Jugador Juan unido
Nombre: María
✅ Jugador María unido
Nombre: Pedro
✅ Jugador Pedro unido
Elige: 3
✅ Roles asignados secretamente
🌙 === TURNO 1 - NOCHE ===
🐺 El lobo despierta...
[Solo el lobo ve:] Eres el LOBO
Aldeanos disponibles: María, Pedro
¿A quién quieres matar? María
☀️ === TURNO 1 - DÍA ===
💀 María fue asesinada. Era ALDEANO
👥 Jugadores vivos: Juan, Pedro
Juan, ¿a quién votas? Pedro
Pedro, ¿a quién votas? Juan
📊 Votos: Juan=1, Pedro=1 (empate)
❌ Pedro fue expulsado. Era LOBO
🎉 ¡¡¡ALDEANOS GANAN!!!
Resultados finales:
- Juan: ALDEANO ✅
- María: ALDEANO (asesinado)
- Pedro: LOBO (expulsado)
- Secreto: El lobo sabe su rol, los aldeanos no
- Al morir: Se revela el rol de quien muere
- Enum: Usa
Rol.LOBOyRol.ALDEANO - CaseSensitive: Los nombres sí importan (usa
.equalsIgnoreCase()) - Validación: No puedes votar por muertos ni por ti mismo (opcional)
| Concepto | Dónde | Por qué |
|---|---|---|
| Enum | Rol | Valores fijos (LOBO/ALDEANO) |
| ArrayList | jugadores | Lista dinámica |
| Random | asignarRoles() | Elegir lobo aleatoriamente |
| Boolean | vivo | Estado de jugador |
| Scanner | Menú, votaciones | Input del usuario |
| Bucles | Turnos, votaciones | Repetir acciones |
| Condicionales | Verificar ganador | Lógica de victoria |
¡Ahora abre los archivos en PLANTILLAS/ y resuelve! 🐺