{"id":88156,"date":"2026-05-22T18:03:12","date_gmt":"2026-05-22T23:03:12","guid":{"rendered":"https:\/\/niixer.com\/?p=88156"},"modified":"2026-05-22T18:03:13","modified_gmt":"2026-05-22T23:03:13","slug":"desarrollo-cyberguardian-videojuego-2d-ciberseguridad-python-pygame","status":"publish","type":"post","link":"https:\/\/niixer.com\/index.php\/2026\/05\/22\/desarrollo-cyberguardian-videojuego-2d-ciberseguridad-python-pygame\/","title":{"rendered":"CyberGuardian, un videojuego 2D de ciberseguridad con Python y Pygame"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\"><\/h2>\n\n\n\n<p>El desarrollo de videojuegos puede utilizarse como una estrategia educativa para explicar conceptos t\u00e9cnicos de una forma m\u00e1s din\u00e1mica e interactiva. Con ese prop\u00f3sito se desarroll\u00f3 <strong>CyberGuardian: Amenaza Xenon<\/strong>, un videojuego 2D de plataformas creado con <strong>Python<\/strong> y <strong>Pygame<\/strong>, orientado a reforzar conceptos b\u00e1sicos de ciberseguridad.<\/p>\n\n\n\n<p>El proyecto combina movimiento lateral, salto, enemigos, plataformas, m\u00fasica, fondos con efecto parallax, retos interactivos y pantallas narrativas. El jugador controla a <strong>Cyber<\/strong>, un personaje que debe avanzar por tres niveles, evitar drones enemigos e interactuar con terminales para resolver desaf\u00edos relacionados con phishing, contrase\u00f1as seguras y autenticaci\u00f3n en dos pasos.<\/p>\n\n\n\n<p>Este art\u00edculo documenta el proceso de desarrollo como evidencia paso a paso, desde la creaci\u00f3n del proyecto en el entorno de desarrollo hasta la generaci\u00f3n del ejecutable final.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>El objetivo principal fue construir un videojuego 2D educativo que permitiera explicar conceptos de ciberseguridad mediante una experiencia jugable.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Apertura del proyecto en IntelliJ IDEA<\/h2>\n\n\n\n<p>El primer paso fue abrir el entorno de desarrollo. Para este proyecto se utiliz\u00f3 un entorno compatible con Python, como <strong>IntelliJ IDEA<\/strong> con soporte para Python o <strong>PyCharm<\/strong>.<\/p>\n\n\n\n<p>Desde el IDE se abri\u00f3 el proyecto principal donde se trabajaron los archivos del videojuego. El proyecto se organiz\u00f3 en una carpeta base llamada <code>pythonProject<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"657\" height=\"882\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/1_resultado.webp\" alt=\"\" class=\"wp-image-88229\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/1_resultado.webp 657w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/1_resultado-223x300.webp 223w\" sizes=\"auto, (max-width: 657px) 100vw, 657px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Creaci\u00f3n de la estructura de carpetas<\/h2>\n\n\n\n<p>Despu\u00e9s de abrir el proyecto, se organiz\u00f3 la estructura general de carpetas para separar correctamente el c\u00f3digo fuente, los recursos gr\u00e1ficos, la m\u00fasica y la documentaci\u00f3n.<\/p>\n\n\n\n<p>La estructura base qued\u00f3 organizada de la siguiente manera:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pythonProject\/<br>\u2502<br>\u251c\u2500\u2500 main_menu.py<br>\u251c\u2500\u2500 nivel1.py<br>\u251c\u2500\u2500 nivel2.py<br>\u251c\u2500\u2500 nivel3.py<br>\u2502<br>\u251c\u2500\u2500 assets\/<br>\u2502   \u251c\u2500\u2500 Musica\/<br>\u2502   \u2514\u2500\u2500 sprites\/<br>\u2502       \u251c\u2500\u2500 Atlas\/<br>\u2502       \u251c\u2500\u2500 Cyber\/<br>\u2502       \u251c\u2500\u2500 Lana\/<br>\u2502       \u251c\u2500\u2500 Xenon\/<br>\u2502       \u2514\u2500\u2500 Fondos\/<br>\u2502<br>\u251c\u2500\u2500 requirements.txt<br>\u251c\u2500\u2500 README.md<br>\u2514\u2500\u2500 .gitignore<\/code><\/pre>\n\n\n\n<p>Esta organizaci\u00f3n permiti\u00f3 trabajar de forma m\u00e1s clara. Cada archivo principal cumple una funci\u00f3n espec\u00edfica: <code>main_menu.py<\/code> controla la pantalla inicial, mientras que <code>nivel1.py<\/code>, <code>nivel2.py<\/code> y <code>nivel3.py<\/code> contienen la l\u00f3gica de cada nivel.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"648\" height=\"198\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/2_resultado.webp\" alt=\"\" class=\"wp-image-88230\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/2_resultado.webp 648w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/2_resultado-300x92.webp 300w\" sizes=\"auto, (max-width: 648px) 100vw, 648px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Creaci\u00f3n de carpetas para m\u00fasica, assets y componentes<\/h2>\n\n\n\n<p>Dentro del proyecto se cre\u00f3 una carpeta llamada <code>assets<\/code>, destinada a almacenar todos los recursos utilizados por el juego.<\/p>\n\n\n\n<p>La carpeta <code>assets<\/code> se dividi\u00f3 principalmente en:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>assets\/<br>\u251c\u2500\u2500 Musica\/<br>\u2514\u2500\u2500 sprites\/<\/code><\/pre>\n\n\n\n<p>En <code>Musica<\/code> se almacenaron los archivos de audio del men\u00fa y de los niveles:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>assets\/Musica\/<br>\u251c\u2500\u2500 Manu.mp3<br>\u251c\u2500\u2500 Nivel1.mp3<br>\u251c\u2500\u2500 Nivel2.mp3<br>\u2514\u2500\u2500 Nivel3.mp3<\/code><\/pre>\n\n\n\n<p>En <code>sprites<\/code> se almacenaron los personajes y fondos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>assets\/sprites\/<br>\u251c\u2500\u2500 Atlas\/<br>\u251c\u2500\u2500 Cyber\/<br>\u251c\u2500\u2500 Lana\/<br>\u251c\u2500\u2500 Xenon\/<br>\u2514\u2500\u2500 Fondos\/<\/code><\/pre>\n\n\n\n<p>Esta separaci\u00f3n fue importante para que el c\u00f3digo pudiera cargar los recursos de manera ordenada y para evitar mezclar im\u00e1genes, m\u00fasica y scripts en una misma ubicaci\u00f3n.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"518\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/3_resultado.webp\" alt=\"\" class=\"wp-image-88231\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/3_resultado.webp 640w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/3_resultado-300x243.webp 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Creaci\u00f3n de los sprites de cada personaje<\/h2>\n\n\n\n<p>Para darle identidad visual al juego se definieron varios personajes principales.<\/p>\n\n\n\n<p>El protagonista es <strong>Cyber<\/strong>, un personaje con capucha, gafas oscuras y ojos en forma de X. Sus im\u00e1genes fueron organizadas como frames de animaci\u00f3n.<\/p>\n\n\n\n<p>La carpeta del personaje Cyber qued\u00f3 compuesta por archivos similares a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>assets\/sprites\/Cyber\/<br>\u251c\u2500\u2500 frame_1.png<br>\u251c\u2500\u2500 frame_2.png<br>\u251c\u2500\u2500 frame_3.png<br>\u251c\u2500\u2500 frame_4.png<br>\u2514\u2500\u2500 ...<\/code><\/pre>\n\n\n\n<p>Tambi\u00e9n se utilizaron otros personajes dentro de la narrativa:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Atlas<\/strong>, como apoyo o figura de comando.<\/li>\n\n\n\n<li><strong>Lana<\/strong>, como aliada dentro de la historia.<\/li>\n\n\n\n<li><strong>Xenon<\/strong>, como villano principal.<\/li>\n\n\n\n<li><strong>Drones<\/strong>, como enemigos dentro de los niveles.<\/li>\n<\/ul>\n\n\n\n<p>En el c\u00f3digo, los sprites de Cyber se cargan desde la carpeta correspondiente y se escalan para ser utilizados dentro del juego:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def load_frames(self, folder):<br>    frames = &#91;]<br><br>    image_names = &#91;<br>        img_name for img_name in os.listdir(folder)<br>        if img_name.lower().endswith(\".png\")<br>    ]<br><br>    image_names.sort()<br><br>    for img_name in image_names:<br>        path = os.path.join(folder, img_name)<br>        img = pygame.image.load(path).convert_alpha()<br>        img = pygame.transform.smoothscale(img, (64, 64))<br>        frames.append(img)<br><br>    return frames<\/code><\/pre>\n\n\n\n<p>Esto permiti\u00f3 animar al personaje cambiando entre distintos frames durante el movimiento.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"549\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/4.1_resultado-1024x549.webp\" alt=\"\" class=\"wp-image-88232\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/4.1_resultado-1024x549.webp 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/4.1_resultado-300x161.webp 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/4.1_resultado-768x412.webp 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/4.1_resultado.webp 1283w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Creaci\u00f3n de los fondos del juego<\/h2>\n\n\n\n<p>El juego utiliza diferentes fondos para el men\u00fa y para cada nivel. Estos fondos ayudan a reforzar la est\u00e9tica digital y cyber del proyecto.<\/p>\n\n\n\n<p>La estructura de fondos qued\u00f3 organizada as\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>assets\/sprites\/Fondos\/<br>\u251c\u2500\u2500 menu1.png<br>\u251c\u2500\u2500 menu2.png<br>\u251c\u2500\u2500 Nivel1\/<br>\u2502   \u251c\u2500\u2500 CAPA1.png<br>\u2502   \u2514\u2500\u2500 CAPA2.png<br>\u251c\u2500\u2500 Nivel2\/<br>\u2502   \u251c\u2500\u2500 CAPA1.png<br>\u2502   \u2514\u2500\u2500 CAPA2.png<br>\u2514\u2500\u2500 Nivel3\/<br>    \u251c\u2500\u2500 CAPA1.png<br>    \u2514\u2500\u2500 CAPA2.png<\/code><\/pre>\n\n\n\n<p>Para los niveles se utilizaron dos capas por escenario, lo cual permiti\u00f3 crear un efecto parallax. Este efecto genera sensaci\u00f3n de profundidad al mover las capas del fondo a velocidades diferentes.<\/p>\n\n\n\n<p>La clase encargada de dibujar el fondo fue:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class ParallaxBackground:<br>    def __init__(self, capa1_path, capa2_path):<br>        self.capa1 = pygame.image.load(capa1_path).convert_alpha()<br>        self.capa2 = pygame.image.load(capa2_path).convert_alpha()<br><br>        self.capa1 = pygame.transform.scale(self.capa1, (WIDTH, HEIGHT))<br>        self.capa2 = pygame.transform.scale(self.capa2, (WIDTH, HEIGHT))<br><br>    def draw(self, screen, player_y):<br>        offset1 = int(player_y * 0.05)<br>        offset2 = int(player_y * 0.15)<br><br>        y1 = -offset1 % HEIGHT<br>        y2 = -offset2 % HEIGHT<br><br>        screen.blit(self.capa1, (0, y1 - HEIGHT))<br>        screen.blit(self.capa1, (0, y1))<br><br>        screen.blit(self.capa2, (0, y2 - HEIGHT))<br>        screen.blit(self.capa2, (0, y2))<\/code><\/pre>\n\n\n\n<p>Gracias a esto, los niveles no se ven planos, sino que tienen una sensaci\u00f3n visual m\u00e1s din\u00e1mica.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1011\" height=\"697\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/5.3_resultado.webp\" alt=\"\" class=\"wp-image-88233\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/5.3_resultado.webp 1011w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/5.3_resultado-300x207.webp 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/5.3_resultado-768x529.webp 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/5.3_resultado-130x90.webp 130w\" sizes=\"auto, (max-width: 1011px) 100vw, 1011px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Selecci\u00f3n de m\u00fasica para cada nivel<\/h2>\n\n\n\n<p>La m\u00fasica fue organizada seg\u00fan la pantalla o nivel donde se reproduce.<\/p>\n\n\n\n<p>Los archivos seleccionados fueron:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Manu.mp3   \u2192 men\u00fa principal<br>Nivel1.mp3 \u2192 nivel 1<br>Nivel2.mp3 \u2192 nivel 2<br>Nivel3.mp3 \u2192 nivel 3<\/code><\/pre>\n\n\n\n<p>En cada nivel se carga la pista correspondiente usando <code>pygame.mixer.music<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pygame.mixer.music.load(\"assets\/Musica\/Nivel1.mp3\")<br>pygame.mixer.music.set_volume(0.5)<br>pygame.mixer.music.play(-1)<\/code><\/pre>\n\n\n\n<p>El par\u00e1metro <code>-1<\/code> indica que la m\u00fasica se reproduce en bucle mientras el jugador permanece en esa pantalla o nivel.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"466\" height=\"303\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/6_resultado.webp\" alt=\"\" class=\"wp-image-88234\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/6_resultado.webp 466w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/6_resultado-300x195.webp 300w\" sizes=\"auto, (max-width: 466px) 100vw, 466px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Creaci\u00f3n de la pantalla inicial<\/h2>\n\n\n\n<p>La pantalla inicial se desarroll\u00f3 en el archivo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>main_menu.py<\/code><\/pre>\n\n\n\n<p>Esta pantalla contiene el nombre del juego, el fondo principal, la m\u00fasica del men\u00fa y los botones de navegaci\u00f3n.<\/p>\n\n\n\n<p>El t\u00edtulo visual definido fue:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CyberGuardian: Amenaza Xenon<\/code><\/pre>\n\n\n\n<p>La pantalla principal incluye los botones:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Iniciar misi\u00f3n.<\/li>\n\n\n\n<li>Controles.<\/li>\n\n\n\n<li>Cr\u00e9ditos.<\/li>\n\n\n\n<li>Salir.<\/li>\n<\/ul>\n\n\n\n<p>El fondo principal se carga desde:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>assets\/sprites\/Fondos\/menu1.png<\/code><\/pre>\n\n\n\n<p>El men\u00fa fue mejorado con un panel central transl\u00facido, botones estilo ne\u00f3n y una presentaci\u00f3n visual acorde con la tem\u00e1tica del juego.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"607\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/8_resultado-1024x607.webp\" alt=\"\" class=\"wp-image-88237\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/8_resultado-1024x607.webp 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/8_resultado-300x178.webp 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/8_resultado-768x455.webp 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/8_resultado-1536x911.webp 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/8_resultado.webp 1597w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Creaci\u00f3n de la pantalla de controles<\/h2>\n\n\n\n<p>La pantalla de controles permite al jugador conocer las teclas necesarias antes de iniciar la partida.<\/p>\n\n\n\n<p>Los controles principales son:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>A \/ D        Moverse<br>W \/ SPACE    Saltar<br>E            Interactuar con terminales<br>1 \/ 2 \/ 3    Responder retos<br>ESC          Volver<\/code><\/pre>\n\n\n\n<p>Durante el desarrollo se detect\u00f3 que algunos caracteres de flechas se mostraban como cuadros. Para evitar ese problema, las flechas fueron dibujadas directamente con figuras geom\u00e9tricas en Pygame.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def draw_arrow_key(surface, direction, x, y):<br>    key_rect = pygame.Rect(x, y, 70, 55)<br><br>    pygame.draw.rect(surface, (7, 32, 48), key_rect, border_radius=12)<br>    pygame.draw.rect(surface, CYAN, key_rect, width=2, border_radius=12)<br><br>    cx, cy = key_rect.center<br><br>    if direction == \"left\":<br>        points = &#91;(cx + 14, cy - 15), (cx - 15, cy), (cx + 14, cy + 15)]<br>    elif direction == \"right\":<br>        points = &#91;(cx - 14, cy - 15), (cx + 15, cy), (cx - 14, cy + 15)]<br>    elif direction == \"up\":<br>        points = &#91;(cx, cy - 17), (cx - 16, cy + 12), (cx + 16, cy + 12)]<br><br>    pygame.draw.polygon(surface, WHITE, points)<\/code><\/pre>\n\n\n\n<p>Esto permiti\u00f3 que la pantalla de controles se viera m\u00e1s limpia y compatible con diferentes equipos.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"593\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/9_resultado-1024x593.webp\" alt=\"\" class=\"wp-image-88238\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/9_resultado-1024x593.webp 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/9_resultado-300x174.webp 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/9_resultado-768x445.webp 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/9_resultado-1536x890.webp 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/9_resultado.webp 1661w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">Creaci\u00f3n de niveles en la jerarqu\u00eda del proyecto<\/h2>\n\n\n\n<p>Aunque Pygame no maneja una jerarqu\u00eda visual como Unity, el proyecto se organiz\u00f3 mediante archivos separados para cada nivel.<\/p>\n\n\n\n<p>Los archivos principales fueron:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nivel1.py<br>nivel2.py<br>nivel3.py<\/code><\/pre>\n\n\n\n<p>Cada nivel contiene:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Fondo.<\/li>\n\n\n\n<li>M\u00fasica.<\/li>\n\n\n\n<li>Plataformas.<\/li>\n\n\n\n<li>Enemigos.<\/li>\n\n\n\n<li>Terminal.<\/li>\n\n\n\n<li>Puerta.<\/li>\n\n\n\n<li>Reto.<\/li>\n\n\n\n<li>HUD.<\/li>\n\n\n\n<li>Pantalla de finalizaci\u00f3n.<\/li>\n<\/ul>\n\n\n\n<p>Esta separaci\u00f3n facilita la lectura del c\u00f3digo y permite modificar un nivel sin afectar directamente los dem\u00e1s.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"518\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/3_resultado-1.webp\" alt=\"\" class=\"wp-image-88242\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/3_resultado-1.webp 640w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/3_resultado-1-300x243.webp 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Implementaci\u00f3n del jugador<\/h2>\n\n\n\n<p>El jugador se implement\u00f3 mediante una clase <code>Player<\/code>, encargada de controlar el movimiento, la gravedad, las colisiones, la animaci\u00f3n y el da\u00f1o recibido.<\/p>\n\n\n\n<p>El movimiento se controla con el teclado:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def handle_input(self):<br>    keys = pygame.key.get_pressed()<br>    self.vel_x = 0<br><br>    if keys&#91;pygame.K_a] or keys&#91;pygame.K_LEFT]:<br>        self.vel_x = -self.speed<br>        self.facing_right = False<br><br>    if keys&#91;pygame.K_d] or keys&#91;pygame.K_RIGHT]:<br>        self.vel_x = self.speed<br>        self.facing_right = True<br><br>    if (keys&#91;pygame.K_w] or keys&#91;pygame.K_SPACE] or keys&#91;pygame.K_UP]) and self.on_ground:<br>        self.vel_y = self.jump_power<\/code><\/pre>\n\n\n\n<p>La gravedad se aplica en cada actualizaci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def apply_gravity(self):<br>    self.vel_y += 0.5<br><br>    if self.vel_y &gt; 12:<br>        self.vel_y = 12<\/code><\/pre>\n\n\n\n<p>Gracias a esta l\u00f3gica, Cyber puede desplazarse, saltar y caer de forma natural sobre las plataformas.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"556\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/10_resultado-1-1024x556.webp\" alt=\"\" class=\"wp-image-88243\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/10_resultado-1-1024x556.webp 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/10_resultado-1-300x163.webp 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/10_resultado-1-768x417.webp 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/10_resultado-1-1536x835.webp 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/10_resultado-1.webp 1616w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Implementaci\u00f3n de plataformas y colisiones<\/h2>\n\n\n\n<p>Los niveles est\u00e1n construidos con plataformas. Cada plataforma se representa como un sprite con un rect\u00e1ngulo de colisi\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Platform(pygame.sprite.Sprite):<br>    def __init__(self, x, y, w, h):<br>        super().__init__()<br>        self.image = pygame.Surface((w, h), pygame.SRCALPHA)<br>        self.image.fill((25, 25, 38))<br>        pygame.draw.rect(self.image, (0, 180, 255), (0, 0, w, 3))<br>        self.rect = self.image.get_rect(topleft=(x, y))<\/code><\/pre>\n\n\n\n<p>Las plataformas se agregan a un grupo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>plats = pygame.sprite.Group()<br>plats.add(Platform(0, HEIGHT - 40, WIDTH, 40))<\/code><\/pre>\n\n\n\n<p>El jugador detecta colisiones con las plataformas para no atravesarlas y para poder saltar correctamente.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Implementaci\u00f3n de enemigos<\/h2>\n\n\n\n<p>Los enemigos del juego son drones que patrullan de un lado a otro. Si el jugador entra en contacto con un drone, pierde una vida.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Drone(pygame.sprite.Sprite):<br>    def __init__(self, x1, x2, y):<br>        super().__init__()<br>        self.x1, self.x2 = x1, x2<br>        self.rect = self.image.get_rect(midbottom=(x1, y))<br>        self.speed = 2<br>        self.dir = 1<br><br>    def update(self, player):<br>        self.rect.x += self.speed * self.dir<br><br>        if self.rect.x &lt; self.x1:<br>            self.rect.x = self.x1<br>            self.dir = 1<br><br>        if self.rect.x &gt; self.x2:<br>            self.rect.x = self.x2<br>            self.dir = -1<br><br>        if self.rect.colliderect(player.rect):<br>            player.take_damage(1)<\/code><\/pre>\n\n\n\n<p>Esta mec\u00e1nica agrega dificultad al juego y obliga al jugador a controlar mejor sus movimientos.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"592\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/11_resultado-1024x592.webp\" alt=\"\" class=\"wp-image-88244\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/11_resultado-1024x592.webp 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/11_resultado-300x173.webp 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/11_resultado-768x444.webp 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/11_resultado-1536x888.webp 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/11_resultado.webp 1597w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Mejora del HUD del juego<\/h2>\n\n\n\n<p>Inicialmente, la informaci\u00f3n del juego se mostraba con texto plano, como:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Vidas: 3<br>A\/D moverse | W\/SPACE saltar | E interactuar<\/code><\/pre>\n\n\n\n<p>Despu\u00e9s se mejor\u00f3 el HUD para hacerlo m\u00e1s presentable. Se reemplaz\u00f3 el texto por paneles compactos y corazones para representar las vidas.<\/p>\n\n\n\n<p>El HUD final muestra:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Vidas con corazones.<\/li>\n\n\n\n<li>Objetivo del nivel.<\/li>\n\n\n\n<li>Paneles transl\u00facidos.<\/li>\n\n\n\n<li>Colores acordes con la est\u00e9tica cyber.<\/li>\n<\/ul>\n\n\n\n<p>Los corazones se dibujaron con figuras de Pygame:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def draw_heart(surface, x, y, size=8, filled=True):<br>    color = RED if filled else (55, 60, 70)<br><br>    r = size<br><br>    pygame.draw.circle(surface, color, (x + r, y + r), r)<br>    pygame.draw.circle(surface, color, (x + r * 3, y + r), r)<br><br>    points = &#91;<br>        (x, y + r),<br>        (x + r * 2, y + r * 4),<br>        (x + r * 4, y + r),<br>    ]<br><br>    pygame.draw.polygon(surface, color, points)<\/code><\/pre>\n\n\n\n<p>Esta mejora permiti\u00f3 que la interfaz del juego se viera m\u00e1s profesional y menos cargada.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"575\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/12_resultado-1024x575.webp\" alt=\"\" class=\"wp-image-88247\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/12_resultado-1024x575.webp 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/12_resultado-300x168.webp 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/12_resultado-768x431.webp 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/12_resultado-1536x863.webp 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/12_resultado.webp 1606w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Fin del juego<\/h2>\n\n\n\n<p>Despu\u00e9s de completar el tercer nivel, se muestra la pantalla final del juego con Xenon. Esta pantalla representa el cierre de la historia y la culminaci\u00f3n del recorrido educativo.<\/p>\n\n\n\n<p>El jugador puede finalizar el juego usando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ENTER<br>ESC<br>Bot\u00f3n Finalizar Juego<\/code><\/pre>\n\n\n\n<p>La pantalla final refuerza la narrativa del proyecto y muestra que Cyber logr\u00f3 superar las trampas de Xenon.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"607\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/13_resultado-1024x607.webp\" alt=\"\" class=\"wp-image-88248\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/13_resultado-1024x607.webp 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/13_resultado-300x178.webp 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/13_resultado-768x456.webp 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/13_resultado-1536x911.webp 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/13_resultado.webp 1593w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Instalaci\u00f3n de PyInstaller<\/h2>\n\n\n\n<p>Para generar el ejecutable del juego se utiliz\u00f3 <strong>PyInstaller<\/strong>. Esta herramienta permite empaquetar el proyecto Python como una aplicaci\u00f3n ejecutable de Windows.<\/p>\n\n\n\n<p>Primero se instal\u00f3 PyInstaller con:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pip install pyinstaller<\/code><\/pre>\n\n\n\n<p>Tambi\u00e9n puede instalarse usando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python -m pip install pyinstaller<\/code><\/pre>\n\n\n\n<p>Adem\u00e1s, el archivo <code>requirements.txt<\/code> puede incluir:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pygame<br>pyinstaller<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"348\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/14_resultado-1024x348.webp\" alt=\"\" class=\"wp-image-88249\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/14_resultado-1024x348.webp 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/14_resultado-300x102.webp 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/14_resultado-768x261.webp 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/14_resultado-1536x522.webp 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/14_resultado.webp 1817w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Generaci\u00f3n del ejecutable<\/h2>\n\n\n\n<p>Antes de generar el ejecutable, se prob\u00f3 el juego desde Python con:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python main_menu.py<\/code><\/pre>\n\n\n\n<p>Luego se ejecut\u00f3 el comando de PyInstaller:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python -m PyInstaller --noconfirm --clean --windowed --name CyberGuardian --add-data \"assets;assets\" main_menu.py<\/code><\/pre>\n\n\n\n<p>Este comando genera la carpeta:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>dist\/CyberGuardian\/<\/code><\/pre>\n\n\n\n<p>Dentro de esa carpeta se encuentra el archivo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CyberGuardian.exe<\/code><\/pre>\n\n\n\n<p>Para distribuir el juego, se recomienda comprimir toda la carpeta <code>dist\/CyberGuardian<\/code>, ya que el ejecutable necesita los archivos internos generados por PyInstaller.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"88\" data-id=\"88250\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/15_resultado-1024x88.webp\" alt=\"\" class=\"wp-image-88250\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/15_resultado-1024x88.webp 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/15_resultado-300x26.webp 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/15_resultado-768x66.webp 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/15_resultado-1536x132.webp 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/15_resultado.webp 1771w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Resultado final<\/h2>\n\n\n\n<p>El resultado fue un videojuego 2D educativo llamado <strong>CyberGuardian:<\/strong> , desarrollado con Python y Pygame.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>CyberGuardian demuestra c\u00f3mo un videojuego puede convertirse en una herramienta educativa para reforzar conceptos de ciberseguridad de forma interactiva y visual.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Cr\u00e9ditos Finales<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Autores<\/strong>: Eduar Ferney Rodriguez Lopez<\/li>\n\n\n\n<li><strong>Editor:\u00a0<\/strong>Carlos Iv\u00e1n Pinz\u00f3n Romero<\/li>\n\n\n\n<li><strong>C\u00f3digo:<\/strong> UCCG-10<\/li>\n\n\n\n<li><strong>Universidad:<\/strong>\u00a0<a href=\"https:\/\/www.ucentral.edu.co\/\">Universidad Central<\/a><\/li>\n<\/ul>\n\n\n\n<p>Repositorio de GITHUB https:\/\/github.com\/eduar277\/cyberguardian-pygame.git<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Referencias<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\"><\/h2>\n\n\n\n<p>OpenAI. (2023). <em>DALL\u00b7E 3<\/em>. <a href=\"https:\/\/openai.com\/index\/dall-e-3\/?utm_source=chatgpt.com\">https:\/\/openai.com\/index\/dall-e-3\/<\/a><\/p>\n\n\n\n<p>OpenAI. (s. f.). <em>DALL\u00b7E 3 model<\/em>. OpenAI API Documentation. <a href=\"https:\/\/developers.openai.com\/api\/docs\/models\/dall-e-3?utm_source=chatgpt.com\">https:\/\/developers.openai.com\/api\/docs\/models\/dall-e-3<\/a><\/p>\n\n\n\n<p>Pygame Community. (s. f.). <em>Getting started<\/em>. Pygame Wiki. <a href=\"https:\/\/www.pygame.org\/wiki\/GettingStarted?utm_source=chatgpt.com\">https:\/\/www.pygame.org\/wiki\/GettingStarted<\/a><\/p>\n\n\n\n<p>Pygame Community. (s. f.). <em>pygame v2.6.0 documentation<\/em>. <a href=\"https:\/\/www.pygame.org\/docs\/?utm_source=chatgpt.com\">https:\/\/www.pygame.org\/docs\/<\/a><\/p>\n\n\n\n<p>PyInstaller Development Team. (s. f.). <em>PyInstaller manual<\/em>. <a href=\"https:\/\/www.pyinstaller.org\/?utm_source=chatgpt.com\">https:\/\/www.pyinstaller.org\/<\/a><\/p>\n\n\n\n<p>Python Software Foundation. (s. f.). <em>Python 3.14.5 documentation<\/em>. <a href=\"https:\/\/docs.python.org\/3\/\">https:\/\/docs.python.org\/3\/<\/a><\/p>\n\n\n\n<p>Real Python. (2018). <em>Using PyInstaller to easily distribute Python applications<\/em>. <a href=\"https:\/\/realpython.com\/pyinstaller-python\/?utm_source=chatgpt.com\">https:\/\/realpython.com\/pyinstaller-python\/<\/a><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>El desarrollo de videojuegos puede utilizarse como una estrategia educativa para explicar conceptos t\u00e9cnicos de una forma m\u00e1s din\u00e1mica e interactiva. Con ese prop\u00f3sito se desarroll\u00f3 CyberGuardian: Amenaza Xenon, un videojuego 2D de plataformas creado con Python y Pygame, orientado a reforzar conceptos b\u00e1sicos de ciberseguridad. El proyecto combina movimientoSeguir Leyendo<\/p>\n","protected":false},"author":1953,"featured_media":88203,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[4115],"tags":[254,4484],"class_list":["post-88156","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-video-juegos-serios","tag-2d","tag-video-juego"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>videojuego 2D educativo de ciberseguridad con Python y Pygame<\/title>\n<meta name=\"description\" content=\"CyberGuardian, un videojuego 2D de ciberseguridad con Python y Pygame\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/niixer.com\/index.php\/2026\/05\/22\/desarrollo-cyberguardian-videojuego-2d-ciberseguridad-python-pygame\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"videojuego 2D educativo de ciberseguridad con Python y Pygame\" \/>\n<meta property=\"og:description\" content=\"CyberGuardian, un videojuego 2D de ciberseguridad con Python y Pygame\" \/>\n<meta property=\"og:url\" content=\"https:\/\/niixer.com\/index.php\/2026\/05\/22\/desarrollo-cyberguardian-videojuego-2d-ciberseguridad-python-pygame\/\" \/>\n<meta property=\"og:site_name\" content=\"Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/niixer\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-22T23:03:12+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-22T23:03:13+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/0_resultado.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1536\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"erodriguezl2\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"erodriguezl2\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutos\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"videojuego 2D educativo de ciberseguridad con Python y Pygame","description":"CyberGuardian, un videojuego 2D de ciberseguridad con Python y Pygame","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/niixer.com\/index.php\/2026\/05\/22\/desarrollo-cyberguardian-videojuego-2d-ciberseguridad-python-pygame\/","og_locale":"es_ES","og_type":"article","og_title":"videojuego 2D educativo de ciberseguridad con Python y Pygame","og_description":"CyberGuardian, un videojuego 2D de ciberseguridad con Python y Pygame","og_url":"https:\/\/niixer.com\/index.php\/2026\/05\/22\/desarrollo-cyberguardian-videojuego-2d-ciberseguridad-python-pygame\/","og_site_name":"Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos","article_publisher":"https:\/\/www.facebook.com\/niixer\/","article_published_time":"2026-05-22T23:03:12+00:00","article_modified_time":"2026-05-22T23:03:13+00:00","og_image":[{"width":1536,"height":1024,"url":"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/0_resultado.webp","type":"image\/webp"}],"author":"erodriguezl2","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"erodriguezl2","Tiempo de lectura":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/niixer.com\/index.php\/2026\/05\/22\/desarrollo-cyberguardian-videojuego-2d-ciberseguridad-python-pygame\/#article","isPartOf":{"@id":"https:\/\/niixer.com\/index.php\/2026\/05\/22\/desarrollo-cyberguardian-videojuego-2d-ciberseguridad-python-pygame\/"},"author":{"name":"erodriguezl2","@id":"https:\/\/niixer.com\/#\/schema\/person\/3e22e87fdf7690a6ab6555d02b92954e"},"headline":"CyberGuardian, un videojuego 2D de ciberseguridad con Python y Pygame","datePublished":"2026-05-22T23:03:12+00:00","dateModified":"2026-05-22T23:03:13+00:00","mainEntityOfPage":{"@id":"https:\/\/niixer.com\/index.php\/2026\/05\/22\/desarrollo-cyberguardian-videojuego-2d-ciberseguridad-python-pygame\/"},"wordCount":1453,"publisher":{"@id":"https:\/\/niixer.com\/#organization"},"image":{"@id":"https:\/\/niixer.com\/index.php\/2026\/05\/22\/desarrollo-cyberguardian-videojuego-2d-ciberseguridad-python-pygame\/#primaryimage"},"thumbnailUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/0_resultado.webp","keywords":["2D","video juego"],"articleSection":["video juegos serios"],"inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/niixer.com\/index.php\/2026\/05\/22\/desarrollo-cyberguardian-videojuego-2d-ciberseguridad-python-pygame\/","url":"https:\/\/niixer.com\/index.php\/2026\/05\/22\/desarrollo-cyberguardian-videojuego-2d-ciberseguridad-python-pygame\/","name":"videojuego 2D educativo de ciberseguridad con Python y Pygame","isPartOf":{"@id":"https:\/\/niixer.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/niixer.com\/index.php\/2026\/05\/22\/desarrollo-cyberguardian-videojuego-2d-ciberseguridad-python-pygame\/#primaryimage"},"image":{"@id":"https:\/\/niixer.com\/index.php\/2026\/05\/22\/desarrollo-cyberguardian-videojuego-2d-ciberseguridad-python-pygame\/#primaryimage"},"thumbnailUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/0_resultado.webp","datePublished":"2026-05-22T23:03:12+00:00","dateModified":"2026-05-22T23:03:13+00:00","description":"CyberGuardian, un videojuego 2D de ciberseguridad con Python y Pygame","breadcrumb":{"@id":"https:\/\/niixer.com\/index.php\/2026\/05\/22\/desarrollo-cyberguardian-videojuego-2d-ciberseguridad-python-pygame\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/niixer.com\/index.php\/2026\/05\/22\/desarrollo-cyberguardian-videojuego-2d-ciberseguridad-python-pygame\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/niixer.com\/index.php\/2026\/05\/22\/desarrollo-cyberguardian-videojuego-2d-ciberseguridad-python-pygame\/#primaryimage","url":"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/0_resultado.webp","contentUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/0_resultado.webp","width":1536,"height":1024},{"@type":"BreadcrumbList","@id":"https:\/\/niixer.com\/index.php\/2026\/05\/22\/desarrollo-cyberguardian-videojuego-2d-ciberseguridad-python-pygame\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/niixer.com\/"},{"@type":"ListItem","position":2,"name":"CyberGuardian, un videojuego 2D de ciberseguridad con Python y Pygame"}]},{"@type":"WebSite","@id":"https:\/\/niixer.com\/#website","url":"https:\/\/niixer.com\/","name":"Portal de noticias de tecnolog\u00eda, ciencia, Android, iOS, Realidad Virtual, Aumentada y Mixta, Videojuegos, computadores, todo lo mas reciente en tecnolog\u00eda","description":"Portal de noticias de tecnolog\u00eda","publisher":{"@id":"https:\/\/niixer.com\/#organization"},"alternateName":"Niixer","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/niixer.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/niixer.com\/#organization","name":"Niixer","alternateName":"Niixer.com","url":"https:\/\/niixer.com\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/niixer.com\/#\/schema\/logo\/image\/","url":"https:\/\/niixer.com\/wp-content\/uploads\/2022\/08\/logo-niixer-sin-fondo-1.png","contentUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2022\/08\/logo-niixer-sin-fondo-1.png","width":140,"height":140,"caption":"Niixer"},"image":{"@id":"https:\/\/niixer.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/niixer\/","https:\/\/www.instagram.com\/niixer.tecnologia\/"]},{"@type":"Person","@id":"https:\/\/niixer.com\/#\/schema\/person\/3e22e87fdf7690a6ab6555d02b92954e","name":"erodriguezl2","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/03270feac3103a044beeed26a38b637bf4687c67f29ac932cb7c5c432d33c35b?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/03270feac3103a044beeed26a38b637bf4687c67f29ac932cb7c5c432d33c35b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/03270feac3103a044beeed26a38b637bf4687c67f29ac932cb7c5c432d33c35b?s=96&d=mm&r=g","caption":"erodriguezl2"},"url":"https:\/\/niixer.com\/index.php\/author\/erodriguezl2\/"}]}},"jetpack_featured_media_url":"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/0_resultado.webp","_links":{"self":[{"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts\/88156","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/users\/1953"}],"replies":[{"embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/comments?post=88156"}],"version-history":[{"count":1,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts\/88156\/revisions"}],"predecessor-version":[{"id":88258,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts\/88156\/revisions\/88258"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/media\/88203"}],"wp:attachment":[{"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/media?parent=88156"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/categories?post=88156"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/tags?post=88156"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}