Class Main


public class Main extends Object
ESCAPE: LA HABITACION - Motor del juego (codigo base del profesor).

El juego completo son TRES habitaciones. Despiertas encerrado y debes escapar de cada una resolviendo su puzzle. La habitacion 1 ya funciona de punta a punta; las habitaciones 2 y 3 las construye el equipo programando: el motor ya llama a los metodos PLACEHOLDER que ustedes deben completar para poder llegar al final del juego.

Fuentes de verdad de cada habitacion N:

  • habitacionN.txt - la matriz VISUAL (el dibujo).
  • zonasN.txt - la matriz de MOVIMIENTO (que ES cada casilla).
  • objetosN.csv - nombre, arte y detalle de cada objeto.
  • arte/*.txt y musica/*.mid - compartidos.

PLACEHOLDERS vs TODOs: un PLACEHOLDER es un metodo que el juego ya llama pero cuyo cuerpo esta incompleto a proposito: es el espacio donde el equipo programa (busquen el banner PLACEHOLDER). Un // TODO equipo: es una tarea puntual dentro de un metodo que ya funciona. En VS Code se encuentran todos con Ctrl+Shift+F buscando TODO equipo o PLACEHOLDER.

Importante: cada equipo construye SU propia version: claves, habitaciones, arte, textos y melodias distintas. El trabajo se rige por el Codigo de Etica del curso (en el sitio): entreguen solo lo que puedan explicar.

Compilar y ejecutar: javac *.java y java Main. Documentacion: javadoc -d docs -charset UTF-8 *.java.

  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final int
    El ancho de las escenas y pantallas grandes, en caracteres.
    static final int
    El ancho interior del panel derecho, en caracteres.
    static int
    El ancho del mapa en caracteres; se calcula de la matriz visual.
    static String
    La clave de la puerta: la operacion aplicada al numero del cofre.
    static int
    La columna de la matriz donde esta parado el jugador.
    static int
    La dificultad elegida: 1 = facil, 2 = normal, 3 = dificil (PLACEHOLDER 2).
    static int
    La fila de la matriz donde esta parado el jugador.
    static int
    En que habitacion esta el jugador: el progreso del juego.
    static String[]
    El inventario del jugador: un arreglo de tamano fijo.
    static Scanner
    El lector de teclado unico de todo el juego.
    static String
    El mensaje que se muestra bajo el mapa en cada turno.
    static String
    Los simbolos de los objetos ya mirados de cerca (sin repetir).
    static String
    El nombre del jugador; lo pide configurarJugador() (PLACEHOLDER 2).
    static int
    El numero grabado en el cofre.
    static String[][]
    La tabla de objetosN.csv: [0] simbolo | [1] nombre | [2] archivo | [3] detalle.
    static int
    El indice (0 a 4) de la operacion sorteada para esta habitacion.
    static String[]
    Las 5 operaciones posibles del puzzle; la nota revela la sorteada.
    static int
    El modo elegido en seleccionarTipoJuego() (PLACEHOLDER 1); 1 = historia.
    static final int
    Cuantas habitaciones tiene el juego: la victoria esta tras la ultima.
    static int
    Cuantas casillas del inventario estan ocupadas.
    static char[][]
    La matriz VISUAL de la habitacion actual: lo que se VE (habitacionN.txt).
    static char[][]
    La matriz de MOVIMIENTO (zonasN.txt), del mismo tamano que la visual: que ES cada casilla ('.' piso, '#' solido, letra = objeto).
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    static void
    abrirEscena(String[] objeto)
    Abre la escena de un objeto del CSV y espera el ENTER.
    static boolean
    abrirPuerta(String[] objeto)
    LA PUERTA pide la clave del puzzle.
    static String
    El borde superior e inferior de las escenas.
    static void
    Encuentra la @ en la matriz visual: ahi arranca el jugador.
    static String[]
    buscarObjeto(char simbolo)
    Busca la fila del CSV cuyo simbolo coincide, o null si no existe.
    static void
    El ancho del mapa es el de la fila mas larga de la matriz visual.
    static String
    calcularClave(int operacion, int numero)
    Aplica la operacion sorteada al numero del cofre.
    static char[][]
    Convierte un archivo de texto en una matriz de caracteres.
    static boolean
    cargarMundo(int numero)
    Carga todos los datos de una habitacion y sortea su puzzle.
    static String[][]
    Lee un CSV de objetos (saltando el encabezado) a una matriz de String.
    static char
    casillaZona(int f, int c)
    La zona de una casilla; fuera de la matriz todo es solido.
    static String
    centrar(String texto, int ancho)
    Agrega espacios a la izquierda para centrar un texto en 'ancho'.
    static boolean
    PLACEHOLDER BONUS - HABITACIONES DE OTROS EQUIPOS (+10%).
    static void
    PLACEHOLDER 3 - EL ASCII ART DEL JUEGO.
    static void
    PLACEHOLDER 2 - LA TERMINAL INICIAL DEL JUGADOR.
    static String
    La pista que toca segun el estado del juego (tecla H).
    static void
    La pantalla principal: la habitacion (matriz visual con el @ del jugador superpuesto) a la izquierda y el panel a la derecha.
    static void
    EL EASTER EGG (tecla secreta X): el gancho ya esta conectado.
    static String[]
    enmarcar(String[] lineas)
    Mete lineas de texto en una caja de ancho fijo.
    static void
    Pausa la escena hasta que el jugador presione ENTER.
    static String
    filaVisual(int i)
    Una fila de la matriz visual como texto, con el jugador (@) encima.
    static void
    Guarda algo en el inventario si hay espacio y no esta repetido.
    static void
    Imprime un archivo de arte centrado como bloque (sin deformarlo).
    static String[]
    Lee un archivo de texto completo y retorna sus lineas, o null.
    static int
    Lee 1 o 2 validando la entrada.
    static void
    main(String[] args)
    El ciclo de vida del juego: configuracion inicial (los placeholders), carga de la habitacion 1 y el ciclo principal de comandos.
    static void
    mostrarEscena(String titulo, String archivo, String texto)
    Imprime una escena generica: titulo, arte grande y texto.
    static void
    La pantalla final del juego, con fanfarria y pausa para disfrutarla.
    static boolean
    mover(String comando)
    Intenta mover al jugador.
    static String
    El nombre en palabras de una tecla de movimiento.
    static String[]
    El panel cuando no hay objeto cerca: progreso, inventario y comandos.
    static String[]
    panelObjeto(String[] objeto)
    El panel con el preview (mini arte) del objeto y la pregunta.
    static String[]
    partirTexto(String texto, int ancho)
    Parte un texto largo en lineas de maximo 'ancho' caracteres, cortando por espacios para no romper las palabras.
    static boolean
    preguntarObjeto(char simbolo)
    El jugador choco con un objeto: se redibuja la pantalla con el preview en el panel y se pregunta que hacer.
    static void
    recordarMirado(char simbolo)
    Recuerda los objetos ya mirados (sin repetir) en una cadena.
    static String
    repetir(char c, int veces)
    Construye una cadena repitiendo un caracter 'veces' veces.
    static int
    PLACEHOLDER 1 - EL TIPO DE JUEGO.
    static boolean
    PLACEHOLDER 4 - LA NAVEGACION COMPLETA DEL JUEGO.
    static boolean
    Recorre el inventario buscando un objeto por su nombre.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • lector

      public static Scanner lector
      El lector de teclado unico de todo el juego.
    • visual

      public static char[][] visual
      La matriz VISUAL de la habitacion actual: lo que se VE (habitacionN.txt).
    • zonas

      public static char[][] zonas
      La matriz de MOVIMIENTO (zonasN.txt), del mismo tamano que la visual: que ES cada casilla ('.' piso, '#' solido, letra = objeto).
    • objetos

      public static String[][] objetos
      La tabla de objetosN.csv: [0] simbolo | [1] nombre | [2] archivo | [3] detalle.
    • habitacionActual

      public static int habitacionActual
      En que habitacion esta el jugador: el progreso del juego.
    • TOTAL_HABITACIONES

      public static final int TOTAL_HABITACIONES
      Cuantas habitaciones tiene el juego: la victoria esta tras la ultima.
      See Also:
    • nombreJugador

      public static String nombreJugador
      El nombre del jugador; lo pide configurarJugador() (PLACEHOLDER 2).
    • dificultad

      public static int dificultad
      La dificultad elegida: 1 = facil, 2 = normal, 3 = dificil (PLACEHOLDER 2).
    • tipoJuego

      public static int tipoJuego
      El modo elegido en seleccionarTipoJuego() (PLACEHOLDER 1); 1 = historia.
    • fila

      public static int fila
      La fila de la matriz donde esta parado el jugador.
    • columna

      public static int columna
      La columna de la matriz donde esta parado el jugador.
    • mensaje

      public static String mensaje
      El mensaje que se muestra bajo el mapa en cada turno.
    • mirados

      public static String mirados
      Los simbolos de los objetos ya mirados de cerca (sin repetir).
    • inventario

      public static String[] inventario
      El inventario del jugador: un arreglo de tamano fijo.
    • totalInventario

      public static int totalInventario
      Cuantas casillas del inventario estan ocupadas.
    • anchoMapa

      public static int anchoMapa
      El ancho del mapa en caracteres; se calcula de la matriz visual.
    • ANCHO_PANEL

      public static final int ANCHO_PANEL
      El ancho interior del panel derecho, en caracteres.
      See Also:
    • ANCHO_ESCENA

      public static final int ANCHO_ESCENA
      El ancho de las escenas y pantallas grandes, en caracteres.
      See Also:
    • numeroCofre

      public static int numeroCofre
      El numero grabado en el cofre. Se sortea al cargar cada habitacion (dos digitos, par y sin terminar en cero) para que la clave cambie en cada partida.
    • operaciones

      public static String[] operaciones
      Las 5 operaciones posibles del puzzle; la nota revela la sorteada.
    • operacionElegida

      public static int operacionElegida
      El indice (0 a 4) de la operacion sorteada para esta habitacion.
    • clave

      public static String clave
      La clave de la puerta: la operacion aplicada al numero del cofre.
  • Constructor Details

    • Main

      public Main()
  • Method Details

    • main

      public static void main(String[] args)
      El ciclo de vida del juego: configuracion inicial (los placeholders), carga de la habitacion 1 y el ciclo principal de comandos.
    • seleccionarTipoJuego

      public static int seleccionarTipoJuego()
      PLACEHOLDER 1 - EL TIPO DE JUEGO.

      Debe mostrar un menu inicial y leer la opcion del jugador (validada, como leerOpcion()). Modos sugeridos: 1 = HISTORIA (las 3 habitaciones), 2 = HABITACION UNICA (elegir cual y escapar solo de esa), 3 = CONTRARRELOJ (historia con movimientos limitados). El modo elegido se guarda en tipoJuego y el resto del motor debe respetarlo.

      Returns:
      el modo elegido por el jugador (por ahora siempre 1).
    • configurarJugador

      public static void configurarJugador()
      PLACEHOLDER 2 - LA TERMINAL INICIAL DEL JUGADOR.

      Debe configurar la partida conversando con el jugador: preguntar su nombre (guardarlo en nombreJugador y usarlo en los mensajes del juego), elegir la dificultad 1-3 (guardarla en dificultad) y aplicarla: por ejemplo en FACIL hay pistas ilimitadas, en NORMAL cuestan y en DIFICIL la puerta admite maximo 3 intentos de clave. Tambien pueden ofrecer aqui el estado inicial del sonido (M/E).

    • configurarArte

      public static void configurarArte()
      PLACEHOLDER 3 - EL ASCII ART DEL JUEGO.

      Debe configurar la identidad visual: un titulo propio del equipo (reemplacen arte/titulo.txt o elijan el archivo segun el tipo de juego o la dificultad), y la decoracion de cada habitacion (por ejemplo un arte distinto al entrar a la 2 y a la 3). Hoy solo imprime el titulo generico del profesor.

    • siguienteHabitacion

      public static boolean siguienteHabitacion()
      PLACEHOLDER 4 - LA NAVEGACION COMPLETA DEL JUEGO.

      Se llama cuando el jugador abre la puerta de una habitacion que NO es la ultima. Debe llevarlo a la siguiente: sumar 1 a habitacionActual, llamar cargarMundo(habitacionActual) con los archivos que ustedes crean (habitacion2.txt, zonas2.txt, objetos2.csv... y los de la 3), mostrar una transicion (arte + mensaje) y retornar false para que el ciclo siga jugando. El inventario se conserva entre habitaciones: usenlo para que un objeto de la habitacion 1 sirva en la 3.

      Hoy el pasillo esta "en obra": el juego termina aqui. Por eso, sin programar este metodo, ES IMPOSIBLE llegar al final del juego.

      Returns:
      true si el juego debe terminar; false para seguir jugando en la nueva habitacion.
    • conectarHabitacionExterna

      public static boolean conectarHabitacionExterna(int numero)
      PLACEHOLDER BONUS - HABITACIONES DE OTROS EQUIPOS (+10%).

      Como todas las habitaciones del salon usan el mismo formato (habitacionN.txt + zonasN.txt + objetosN.csv + su arte), es posible armar un juego GIGANTE conectando habitaciones de varios equipos. Solo queda indicado: si lo intentan, el plan es:

      1. Acordar con otro equipo el intercambio de la carpeta de una habitacion (sus 3 archivos + los arte/ que use).
      2. Copiar los archivos con un numero nuevo (ej. habitacion4.txt) y sus artes a arte/ sin pisar los propios.
      3. Llamar este metodo desde siguienteHabitacion() cuando el jugador cruce la ultima puerta propia, y subir TOTAL_HABITACIONES.
      4. Verificar que los simbolos y claves del otro equipo no choquen con los suyos (cada CSV trae los suyos, asi que basta cargarlo).
      Parameters:
      numero - el numero con el que se copiaron los archivos del otro equipo.
      Returns:
      true si la habitacion externa quedo cargada y lista para jugar.
    • cargarMundo

      public static boolean cargarMundo(int numero)
      Carga todos los datos de una habitacion y sortea su puzzle. Se usa para la habitacion 1 y debe reutilizarse para la 2 y la 3.
      Parameters:
      numero - el numero de la habitacion (sus archivos llevan el sufijo).
      Returns:
      true si todos los archivos cargaron bien.
    • calcularAnchoMapa

      public static void calcularAnchoMapa()
      El ancho del mapa es el de la fila mas larga de la matriz visual.
    • buscarInicio

      public static void buscarInicio()
      Encuentra la @ en la matriz visual: ahi arranca el jugador. Se borra del dibujo porque el @ se superpone al dibujar.
    • dibujarPantalla

      public static void dibujarPantalla(String[] panel)
      La pantalla principal: la habitacion (matriz visual con el @ del jugador superpuesto) a la izquierda y el panel a la derecha.
      Parameters:
      panel - las lineas del panel derecho (estado o preview).
    • filaVisual

      public static String filaVisual(int i)
      Una fila de la matriz visual como texto, con el jugador (@) encima.
    • panelEstado

      public static String[] panelEstado()
      El panel cuando no hay objeto cerca: progreso, inventario y comandos.
    • mover

      public static boolean mover(String comando)
      Intenta mover al jugador. La matriz de ZONAS decide que pasa: '.' piso (avanza), letra A-Z objeto (pregunta), otro solido (bloquea).
      Parameters:
      comando - W, A, S o D en mayuscula.
      Returns:
      true solo si el jugador escapo y el juego termina.
    • casillaZona

      public static char casillaZona(int f, int c)
      La zona de una casilla; fuera de la matriz todo es solido.
    • nombreDireccion

      public static String nombreDireccion(String comando)
      El nombre en palabras de una tecla de movimiento.
    • preguntarObjeto

      public static boolean preguntarObjeto(char simbolo)
      El jugador choco con un objeto: se redibuja la pantalla con el preview en el panel y se pregunta que hacer. Aqui viven los comportamientos especiales (la alfombra, el cofre y la nota son los moldes a imitar).
      Parameters:
      simbolo - la letra del objeto en la matriz de zonas.
      Returns:
      true si el objeto era la puerta final y el jugador escapo.
    • panelObjeto

      public static String[] panelObjeto(String[] objeto)
      El panel con el preview (mini arte) del objeto y la pregunta.
    • buscarObjeto

      public static String[] buscarObjeto(char simbolo)
      Busca la fila del CSV cuyo simbolo coincide, o null si no existe.
    • abrirEscena

      public static void abrirEscena(String[] objeto)
      Abre la escena de un objeto del CSV y espera el ENTER.
    • esperarEnter

      public static void esperarEnter()
      Pausa la escena hasta que el jugador presione ENTER.
    • mostrarEscena

      public static void mostrarEscena(String titulo, String archivo, String texto)
      Imprime una escena generica: titulo, arte grande y texto. Los comportamientos especiales la reutilizan con sus propios textos.
      Parameters:
      titulo - el nombre que encabeza la escena.
      archivo - el nombre base del arte (arte/archivo.txt).
      texto - el detalle, partido automaticamente en lineas.
    • abrirPuerta

      public static boolean abrirPuerta(String[] objeto)
      LA PUERTA pide la clave del puzzle. Si es la ultima habitacion el jugador gana; si no, el viaje continua en siguienteHabitacion().
      Parameters:
      objeto - la fila del CSV de la puerta.
      Returns:
      true si el juego termina.
    • mostrarVictoria

      public static void mostrarVictoria()
      La pantalla final del juego, con fanfarria y pausa para disfrutarla.
    • calcularClave

      public static String calcularClave(int operacion, int numero)
      Aplica la operacion sorteada al numero del cofre.
      Parameters:
      operacion - indice en el arreglo operaciones (0 a 4).
      numero - el numero grabado en el cofre.
      Returns:
      la clave resultante, como texto.
    • darPista

      public static String darPista()
      La pista que toca segun el estado del juego (tecla H). TODO equipo: pistas propias para las habitaciones 2 y 3, y limite de pistas segun la dificultad.
    • easterEgg

      public static void easterEgg()
      EL EASTER EGG (tecla secreta X): el gancho ya esta conectado. TODO equipo: programen aqui su secreto. Ideas: el modo desarrollador que imprime la matriz de zonas, un objeto oculto, un mensaje del creador del cuarto.
    • guardarObjeto

      public static void guardarObjeto(String nombre)
      Guarda algo en el inventario si hay espacio y no esta repetido.
    • tieneObjeto

      public static boolean tieneObjeto(String nombre)
      Recorre el inventario buscando un objeto por su nombre.
      Parameters:
      nombre - el nombre exacto guardado.
      Returns:
      true si el jugador lo tiene.
    • recordarMirado

      public static void recordarMirado(char simbolo)
      Recuerda los objetos ya mirados (sin repetir) en una cadena.
    • bordeEscena

      public static String bordeEscena()
      El borde superior e inferior de las escenas.
    • imprimirArte

      public static void imprimirArte(String ruta)
      Imprime un archivo de arte centrado como bloque (sin deformarlo).
    • enmarcar

      public static String[] enmarcar(String[] lineas)
      Mete lineas de texto en una caja de ancho fijo.
    • centrar

      public static String centrar(String texto, int ancho)
      Agrega espacios a la izquierda para centrar un texto en 'ancho'.
    • repetir

      public static String repetir(char c, int veces)
      Construye una cadena repitiendo un caracter 'veces' veces.
    • partirTexto

      public static String[] partirTexto(String texto, int ancho)
      Parte un texto largo en lineas de maximo 'ancho' caracteres, cortando por espacios para no romper las palabras.
    • leerOpcion

      public static int leerOpcion()
      Lee 1 o 2 validando la entrada. Nunca rompe el programa.
    • leerLineas

      public static String[] leerLineas(String ruta)
      Lee un archivo de texto completo y retorna sus lineas, o null.
    • cargarMatriz

      public static char[][] cargarMatriz(String ruta)
      Convierte un archivo de texto en una matriz de caracteres.
    • cargarObjetos

      public static String[][] cargarObjetos(String ruta)
      Lee un CSV de objetos (saltando el encabezado) a una matriz de String.