{"id":34549466,"url":"https://github.com/686f6c61/laberintos-python","last_synced_at":"2026-05-19T16:32:34.127Z","repository":{"id":329316245,"uuid":"1103920903","full_name":"686f6c61/laberintos-python","owner":"686f6c61","description":"Juego de laberintos generados proceduralmente con algoritmo DFS modificado en Python y Pygame","archived":false,"fork":false,"pushed_at":"2026-02-12T19:24:06.000Z","size":58,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-12T21:38:53.923Z","etag":null,"topics":["algorithm","dfs","game","maze","maze-generator","procedural-generation","pygame","python"],"latest_commit_sha":null,"homepage":"https://github.com/686f6c61/laberintos-python/releases/tag/v0.2","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/686f6c61.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-25T14:08:28.000Z","updated_at":"2026-02-12T18:50:19.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/686f6c61/laberintos-python","commit_stats":null,"previous_names":["686f6c61/laberintos-python"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/686f6c61/laberintos-python","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/686f6c61%2Flaberintos-python","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/686f6c61%2Flaberintos-python/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/686f6c61%2Flaberintos-python/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/686f6c61%2Flaberintos-python/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/686f6c61","download_url":"https://codeload.github.com/686f6c61/laberintos-python/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/686f6c61%2Flaberintos-python/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33224586,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-19T15:49:41.270Z","status":"ssl_error","status_checked_at":"2026-05-19T15:49:22.917Z","response_time":58,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algorithm","dfs","game","maze","maze-generator","procedural-generation","pygame","python"],"created_at":"2025-12-24T07:45:39.297Z","updated_at":"2026-05-19T16:32:34.121Z","avatar_url":"https://github.com/686f6c61.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GENERADOR DE LABERINTOS\n\n\u003cdiv align=\"center\"\u003e\n\n![Laberinto](/laberinto/assets/laberinto.png)\n\n[![Python](https://img.shields.io/badge/Python_3.8+-3776AB?style=for-the-badge\u0026logo=python\u0026logoColor=white)](https://www.python.org/)\n[![Pygame](https://img.shields.io/badge/Pygame_2.5+-2C2D72?style=for-the-badge\u0026logo=pygame\u0026logoColor=white)](https://www.pygame.org/)\n[![NumPy](https://img.shields.io/badge/NumPy_1.24+-013243?style=for-the-badge\u0026logo=numpy\u0026logoColor=white)](https://numpy.org/)\n[![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)](LICENSE)\n[![Tests](https://img.shields.io/badge/Tests-91_passed-success?style=for-the-badge)]()\n\n**Juego de laberintos generados proceduralmente con algoritmo DFS modificado**\n\n[Instalacion](#instalacion) •\n[Como Jugar](#como-jugar) •\n[Arquitectura](#arquitectura) •\n[Contribuir](#contribuir)\n\n\u003c/div\u003e\n\n---\n\n## TABLA DE CONTENIDOS\n\n- [Descripcion](#descripcion)\n- [Caracteristicas](#caracteristicas)\n- [Instalacion](#instalacion)\n- [Ejecucion](#ejecucion)\n- [Como Jugar](#como-jugar)\n- [Niveles de Dificultad](#niveles-de-dificultad)\n- [Arquitectura](#arquitectura)\n- [Algoritmo de Generacion](#algoritmo-de-generacion)\n- [Estructura del Proyecto](#estructura-del-proyecto)\n- [API Reference](#api-reference)\n- [Tests](#tests)\n- [Contribuir](#contribuir)\n- [Changelog](#changelog)\n- [Licencia](#licencia)\n\n---\n\n## DESCRIPCION\n\nGenerador de laberintos es un juego desarrollado en Python que crea laberintos unicos en cada partida mediante generacion procedural. El jugador debe navegar desde el punto de inicio hasta la meta antes de que se agote el tiempo.\n\n### POR QUE ESTE PROYECTO?\n\n- **Educativo**: Implementacion practica de algoritmos de grafos (DFS, BFS)\n- **Modular**: Arquitectura limpia siguiendo principios SOLID\n- **Documentado**: Codigo exhaustivamente comentado para la comunidad dev\n- **Testeado**: 91 tests unitarios con pytest\n\n---\n\n## CARACTERISTICAS\n\n| Caracteristica | Descripcion |\n|----------------|-------------|\n| **Generacion Procedural** | Algoritmo DFS modificado que garantiza laberintos siempre resolubles |\n| **5 Niveles de Dificultad** | Desde 15x15 hasta 55x55 celdas con complejidad progresiva |\n| **Sistema de Camara** | Seguimiento suave del jugador con interpolacion lineal |\n| **Indicador de Meta** | Flecha direccional cuando la meta no es visible |\n| **Pausa** | Sistema de pausa con tecla P que congela el temporizador |\n| **Responsive** | Tamano de celda dinamico que se adapta a cualquier dificultad |\n\n---\n\n## INSTALACION\n\n### REQUISITOS PREVIOS\n\n- Python 3.8 o superior\n- pip (gestor de paquetes de Python)\n- Git\n\n### INSTALACION RAPIDA\n\n```bash\n# Clonar el repositorio\ngit clone https://github.com/686f6c61/generador-laberintos-python.git\ncd generador-laberintos-python\n\n# Opcion 1: Ejecutar directamente (crea entorno virtual automaticamente)\n./run.sh\n\n# Opcion 2: Instalacion manual\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -r requirements.txt\n```\n\n### DEPENDENCIAS\n\n```txt\npygame\u003e=2.5.0    # Motor grafico y manejo de eventos\nnumpy\u003e=1.24.0    # Matrices optimizadas para el laberinto\n```\n\n---\n\n## EJECUCION\n\n```bash\n# Metodo recomendado (gestiona entorno virtual automaticamente)\n./run.sh\n\n# Ejecucion directa\npython3 src/main.py\n\n# Ejecutar tests\npython3 -m pytest tests/ -v\n```\n\n---\n\n## COMO JUGAR\n\n### CONTROLES\n\n| Tecla | Accion |\n|-------|--------|\n| `↑` `↓` `←` `→` | Mover personaje |\n| `P` | Pausar / Reanudar |\n| `Boton Menu` | Volver al menu principal |\n\n### OBJETIVO\n\n1. **Inicio**: Circulo rojo - punto de partida\n2. **Meta**: Circulo verde - destino final\n3. **Jugador**: Circulo azul - tu personaje\n4. Llega a la meta antes de que el tiempo se agote\n\n### INTERFAZ\n\n```\n┌─────────────────────────────────────────┐\n│  Tiempo: 00:45    Distancia: 12 celdas  │  ← Panel Superior\n├─────────────────────────────────────────┤\n│                                         │\n│           ████████████████              │\n│           █              █              │\n│           █  ██████  ██  █              │\n│           █  █    █   █  █              │\n│           █  █ ●  ████   █              │  ← Area de Juego\n│           █  █         █ █              │\n│           █  ███████████ █              │\n│           █              █              │\n│           ████████████████              │\n│                                         │\n├─────────────────────────────────────────┤\n│  [Menu]              v0.2  686f6c61     │  ← Panel Inferior\n└─────────────────────────────────────────┘\n```\n\n---\n\n## NIVELES DE DIFICULTAD\n\n| Nivel | Tamano | Celdas | Complejidad | Densidad | Tiempo |\n|-------|--------|--------|-------------|----------|--------|\n| Facil | 15×15 | 225 | 0.5 | 0.5 | 2 min |\n| Normal | 25×25 | 625 | 0.6 | 0.6 | 3 min |\n| Dificil | 35×35 | 1,225 | 0.7 | 0.7 | 4 min |\n| Muy Dificil | 45×45 | 2,025 | 0.8 | 0.8 | 5 min |\n| Extremo | 55×55 | 3,025 | 0.9 | 0.9 | 6 min |\n\n\u003e **Nota**: El tamano de celda se calcula dinamicamente para que el laberinto siempre quepa en la ventana (800x600 - paneles HUD).\n\n---\n\n## ARQUITECTURA\n\n### DIAGRAMA DE COMPONENTES\n\n```mermaid\ngraph TB\n    subgraph \"Capa de Presentacion\"\n        A[main.py\u003cbr/\u003ePunto de entrada]\n        B[pantalla.py\u003cbr/\u003eRenderizado UI]\n    end\n\n    subgraph \"Capa de Logica\"\n        C[laberinto.py\u003cbr/\u003eGeneracion DFS]\n        D[personaje.py\u003cbr/\u003eControl jugador]\n    end\n\n    subgraph \"Capa de Datos\"\n        E[config.py\u003cbr/\u003eConfiguracion]\n        F[helpers.py\u003cbr/\u003eUtilidades]\n    end\n\n    A --\u003e B\n    A --\u003e C\n    A --\u003e D\n    B --\u003e C\n    B --\u003e D\n    B --\u003e F\n    C --\u003e E\n    C --\u003e F\n    D --\u003e C\n    D --\u003e E\n    D --\u003e F\n```\n\n### MAQUINA DE ESTADOS\n\n```mermaid\nstateDiagram-v2\n    [*] --\u003e MENU_PRINCIPAL\n\n    MENU_PRINCIPAL --\u003e DIFICULTAD: Seleccionar dificultad\n    MENU_PRINCIPAL --\u003e JUGANDO: Jugar\n    MENU_PRINCIPAL --\u003e [*]: Salir\n\n    DIFICULTAD --\u003e MENU_PRINCIPAL: Volver / Seleccionar\n\n    JUGANDO --\u003e PAUSADO: Tecla P\n    JUGANDO --\u003e MENU_PRINCIPAL: Boton Menu\n    JUGANDO --\u003e VICTORIA: Llegar a meta\n    JUGANDO --\u003e DERROTA: Tiempo agotado\n\n    PAUSADO --\u003e JUGANDO: Tecla P\n\n    VICTORIA --\u003e MENU_PRINCIPAL: Volver\n    DERROTA --\u003e MENU_PRINCIPAL: Volver\n```\n\n### FLUJO DEL GAME LOOP\n\n```mermaid\nflowchart LR\n    A[Eventos] --\u003e B[Actualizar]\n    B --\u003e C[Renderizar]\n    C --\u003e D[Display Flip]\n    D --\u003e E[Tick 60 FPS]\n    E --\u003e A\n```\n\n---\n\n## ALGORITMO DE GENERACION\n\n### DFS MODIFICADO\n\nEl laberinto se genera usando **Depth-First Search** con modificaciones para crear laberintos mas interesantes:\n\n```mermaid\nflowchart TD\n    A[Iniciar matriz\u003cbr/\u003ellena de paredes] --\u003e B[Elegir celda inicial\u003cbr/\u003ealeatoria]\n    B --\u003e C[Marcar como visitada]\n    C --\u003e D{Hay vecinos\u003cbr/\u003eno visitados?}\n    D --\u003e|Si| E[Elegir vecino aleatorio]\n    E --\u003e F[Derribar pared entre celdas]\n    F --\u003e G[Push a pila]\n    G --\u003e C\n    D --\u003e|No| H{Pila vacia?}\n    H --\u003e|No| I[Pop de pila]\n    I --\u003e C\n    H --\u003e|Si| J[Agregar bifurcaciones\u003cbr/\u003esegun complejidad]\n    J --\u003e K[Crear ciclos\u003cbr/\u003esegun densidad]\n    K --\u003e L[Verificar solvibilidad\u003cbr/\u003econ BFS]\n    L --\u003e M[Laberinto completo]\n```\n\n### ESTRUCTURA DE DATOS\n\n```python\n# Matriz NumPy optimizada (uint8 = 8x menos memoria que int64)\nself.matriz = np.zeros((filas, columnas), dtype=np.uint8)\n\n# Valores de celda\n0 = Camino (transitable)\n1 = Pared (bloqueada)\n```\n\n### PARAMETROS DE GENERACION\n\n| Parametro | Rango | Efecto |\n|-----------|-------|--------|\n| `complejidad` | 0.0 - 1.0 | Cantidad de bifurcaciones y caminos alternativos |\n| `densidad` | 0.0 - 1.0 | Cantidad de paredes adicionales y callejones sin salida |\n\n---\n\n## ESTRUCTURA DEL PROYECTO\n\n```\ngenerador-laberintos-python/\n│\n├── src/                          # Codigo fuente principal\n│   ├── main.py                   # Punto de entrada, game loop\n│   │\n│   ├── configuracion/\n│   │   ├── __init__.py\n│   │   └── config.py             # Constantes, colores, dificultades\n│   │\n│   ├── generador/\n│   │   ├── __init__.py\n│   │   └── laberinto.py          # Clase Laberinto, algoritmo DFS\n│   │\n│   ├── jugador/\n│   │   ├── __init__.py\n│   │   └── personaje.py          # Clase Jugador, movimiento, colisiones\n│   │\n│   ├── renderizador/\n│   │   ├── __init__.py\n│   │   └── pantalla.py           # Menus, HUD, PantallaJuego\n│   │\n│   └── utilidades/\n│       ├── __init__.py\n│       └── helpers.py            # Temporizador, funciones auxiliares\n│\n├── tests/                        # Tests unitarios (91 tests)\n│   ├── __init__.py\n│   ├── test_config.py            # Tests de configuracion\n│   ├── test_helpers.py           # Tests de utilidades\n│   └── test_laberinto.py         # Tests de generacion\n│\n├── assets/                       # Recursos graficos\n│   └── laberinto.png\n│\n├── requirements.txt              # Dependencias Python\n├── run.sh                        # Script de ejecucion\n├── LICENSE                       # Licencia MIT\n└── README.md                     # Este archivo\n```\n\n---\n\n## API REFERENCE\n\n### CLASE LABERINTO\n\n```python\nfrom generador.laberinto import Laberinto\n\n# Crear laberinto personalizado\nlaberinto = Laberinto(\n    filas=25,           # Numero de filas\n    columnas=25,        # Numero de columnas\n    complejidad=0.6,    # Factor de complejidad (0-1)\n    densidad=0.6,       # Factor de densidad (0-1)\n    tamano_celda=30     # Pixeles por celda (opcional)\n)\n\n# Propiedades\nlaberinto.inicio        # Tupla (fila, columna) del inicio\nlaberinto.meta          # Tupla (fila, columna) de la meta\nlaberinto.matriz        # Matriz NumPy del laberinto\nlaberinto.ancho         # Ancho total en pixeles\nlaberinto.alto          # Alto total en pixeles\n\n# Metodos\nlaberinto.es_pared(fila, columna)  # bool: Es pared?\nlaberinto.es_meta(fila, columna)   # bool: Es la meta?\nlaberinto.dibujar(superficie)      # Renderizar en pygame.Surface\n```\n\n### CLASE JUGADOR\n\n```python\nfrom jugador.personaje import Jugador\n\njugador = Jugador(laberinto)\n\n# Propiedades\njugador.posicion    # Tupla (x, y) en pixeles\njugador.celda       # Tupla (fila, columna)\n\n# Metodos\njugador.manejar_evento(evento)  # Procesar input\njugador.actualizar()            # Actualizar posicion\njugador.dibujar(superficie)     # Renderizar\njugador.reiniciar()             # Volver al inicio\njugador.ha_llegado_meta()       # bool: Victoria?\n```\n\n### CLASE TEMPORIZADOR\n\n```python\nfrom utilidades.helpers import Temporizador\n\ntemp = Temporizador(tiempo_limite=180)  # 3 minutos\n\ntemp.obtener_tiempo_transcurrido()  # Segundos jugados\ntemp.obtener_tiempo_restante()      # Segundos restantes (o None)\ntemp.ha_terminado()                 # bool: Tiempo agotado?\ntemp.pausar()                       # Pausar contador\ntemp.reanudar()                     # Reanudar contador\ntemp.reiniciar(nuevo_limite)        # Reiniciar con nuevo tiempo\n```\n\n---\n\n## TESTS\n\n### EJECUTAR TESTS\n\n```bash\n# Todos los tests\npython3 -m pytest tests/ -v\n\n# Con cobertura\npython3 -m pytest tests/ --cov=src --cov-report=html\n\n# Tests especificos\npython3 -m pytest tests/test_laberinto.py -v\npython3 -m pytest tests/test_helpers.py -v\npython3 -m pytest tests/test_config.py -v\n```\n\n### COBERTURA DE TESTS\n\n| Modulo | Tests | Cobertura |\n|--------|-------|-----------|\n| `config.py` | 34 | Configuracion, colores, dificultades |\n| `helpers.py` | 26 | Temporizador, formateo, interpolacion |\n| `laberinto.py` | 31 | Generacion, solvibilidad, metodos |\n| **Total** | **91** | **100% passed** |\n\n### EJEMPLO DE TEST\n\n```python\ndef test_laberinto_tiene_solucion():\n    \"\"\"Verificar que todo laberinto generado es resoluble.\"\"\"\n    for _ in range(10):\n        laberinto = Laberinto(25, 25, 0.7, 0.7)\n        assert laberinto._hay_camino(laberinto.inicio, laberinto.meta)\n```\n\n---\n\n## CONTRIBUIR\n\n### COMO CONTRIBUIR\n\n1. **Fork** del repositorio\n2. Crear **branch** para tu feature (`git checkout -b feature/nueva-funcionalidad`)\n3. **Commit** de cambios (`git commit -m 'Add: nueva funcionalidad'`)\n4. **Push** al branch (`git push origin feature/nueva-funcionalidad`)\n5. Abrir **Pull Request**\n\n### GUIA DE ESTILO\n\n- Seguir [PEP 8](https://pep8.org/) para codigo Python\n- Docstrings en formato Google para todas las funciones publicas\n- Tests unitarios para nuevas funcionalidades\n- Commits en formato: `Add:`, `Fix:`, `Update:`, `Remove:`\n\n---\n\n## CHANGELOG\n\n### VERSION 0.2 (NOVIEMBRE 2025)\n\n**Nuevas Caracteristicas**\n- Sistema de pausa con tecla P\n- Tamano de celda dinamico segun dificultad\n- 91 tests unitarios con pytest\n- Documentacion exhaustiva del codigo\n\n**Mejoras**\n- Optimizacion de memoria: matriz uint8 (8x menos memoria)\n- Cache de fuentes para mejor rendimiento\n- Estados del juego con Enum (type-safe)\n- Constantes extraidas a configuracion\n\n**Correcciones**\n- HUD ya no se superpone al laberinto\n- Laberinto siempre cabe en la ventana\n- Indicador de meta respeta los paneles\n\n### VERSION 0.1 (ABRIL 2025)\n\n- Lanzamiento inicial\n- Generacion de laberintos con DFS\n- 5 niveles de dificultad\n- Interfaz grafica con Pygame\n\n---\n\n## LICENCIA\n\nEste proyecto esta disponible bajo la licencia MIT para uso educativo y personal.\n\n```\nMIT License\n\nCopyright (c) 2025 686f6c61\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software...\n```\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**Desarrollado con** :heart: **por [686f6c61](https://github.com/686f6c61)**\n\nSi este proyecto te resulta util, considera darle una :star:\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F686f6c61%2Flaberintos-python","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F686f6c61%2Flaberintos-python","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F686f6c61%2Flaberintos-python/lists"}