Fundamentos de Programación

1

Bienvenida a Platzi: ¿qué necesitas para tomar el curso?

2

Programación en Navegadores: Primeros Pasos

3

Crea tu primer sitio web

4

Sitios web con HTML

5

Estructura de árbol en HTML

6

Instalando tu primer editor de código

7

Cómo declarar variables y usar prompt

8

Algoritmo de piedra, papel o tijera

9

Algoritmo avanzado de piedra, papel o tijera

10

Aleatoriedad

11

Refactor del código usando funciones

12

Ciclos

13

Gana 3 veces

14

Archivos de HTML y JavaScript

15

¿Qué es el DOM?

Quiz: Fundamentos de Programación

Desarrollando un juego con HTML y JavaScript

16

Maquetación con HTML

17

Sección de elegir mascota

18

¿Dónde ubicar la etiqueta script? Conectando HTML con JavaScript

19

Escuchando eventos con JavaScript

20

addEventListener

21

Manipulación del DOM

22

Enemigos aleatorios

23

Ataques en JavaScript

24

Ataques aleatorios del enemigo

25

Imprimiendo ataques del enemigo

26

¿Ganaste, perdiste o empataste?

27

Tablas de verdad

28

Creando el contador de vidas

29

¿Quién ganó el juego?

30

Reiniciando el juego

31

Ocultando elementos HTML con JS para mejorar la UX del juego

Quiz: Desarrollando un juego con HTML y JavaScript

Estilos con CSS

32

Anatomía de CSS

33

Tipos de display

34

Flexbox

35

Modelo de caja

36

Imágenes para los Mokepones

37

Estilos del botón

38

Adaptando HTML al diseño del juego

39

Layout: título y ataques

40

Adaptando JavaScript al diseño del juego

41

CSS Grid

42

Responsive Design

43

Detalles finales

Quiz: Estilos con CSS

Optimización de código

44

Revisión de código

45

Don't repeat yourself (DRY)

46

Clases y objetos

47

Clases y objetos de Mokepon

48

Arrays o arreglos

49

Objetos vs. arreglos

50

Ciclos: manipulando el DOM con iteradores

51

Declaración lenta de variables

52

Una sola fuente de la verdad

53

Mascotas aleatorias con arreglos

54

Ataques dinámicos por cada mascota: extraer

55

Renderizado dinámico en HTML

56

Eventos de click dinámicos

57

Secuencia de ataques del enemigo

58

Iniciando el combate

59

Resolviendo el reto de condicionales

60

Optimizando el frontend del juego

Quiz: Optimización de código

Mapa con canvas

61

Introducción a canvas: dibujando con JavaScript

62

Moviendo a Capipepo hacia la derecha

63

Movimiento hacia todas las direcciones

64

Movimientos con el teclado

65

Imágenes y personajes de fondo

66

Métodos en las clases

67

Obstáculos y colisiones

68

Combate entre mokepones colisionados

69

Mapa responsive

70

Botones bonitos y viewport

Quiz: Mapa con canvas

Backend: videojuego multijugador

71

¿Qué es backend?

72

Instalación de Node.js y NPM

73

Terminal de comandos y Node.js

74

Servidor web con Express.js

75

HTTP, localhost, servidores y puertos

76

Express.js y fetch: API REST con JavaScript

77

JSON y POST: mokepon online

78

Transmisión de coordenadas

79

Mokepones dinámicos en el mapa

80

Optimizando el mapa del juego

81

Batalla entre jugadores

82

Consumiendo la API de ataques del enemigo

Quiz: Backend: videojuego multijugador

Próximos pasos

83

Probando el juego en varios dispositivos

84

¿Y ahora qué curso tomar?

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Convierte tus certificados en títulos universitarios en USA

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

16 Días
2 Hrs
18 Min
27 Seg

Batalla entre jugadores

81/84
Recursos

Te encuentras muy cerca de finalizar tu primer backend y tu primera aplicación completa. ¡Solo un esfuerzo más!

El último esfuerzo

Si tu proyecto aún no funciona como debe, te recomiendo realizar una comparación con el código de los profesores que lo crearon originalmente. También puedes compartir y buscar ayuda en la sección de comentarios.

Notarás que el código fuente se encuentra alojado en una plataforma llamada GitHub que utiliza un software llamado Git. Git será uno de tus próximos pasos en el mundo de la programación y GitHub es una “red social para programadores”. La misma te permite llevar un control de versiones del código fuente y es la herramienta perfecta para guardar tu código.

Te tocará aprender Git en el futuro. De momento, concentra tu energía en finalizar tu primera aplicación. Solo falta desarrollar unos endpoints más para completar el videojuego.


Contribución creada por: Kevin Fiorentino (Platzi Contributor).

Aportes 63

Preguntas 31

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Ya casi amigos!!

Hahaha yo cada que me tengo que devolver a lo que escribí hace una semana XD

¡¡¡Créditos a @ric.arellano92!!!
Para evitar el error “mokepon.js:448 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading ‘nombre’)” lo que hice fue agregar un if que evalué si el mokepon existe o no, esta validación también se aplica en la parte de pintar mokeponEnemigo:

//---------------------Al recuperar enemigos--------------------------
                mokeponesEnemigos = enemigos.map(function (enemigo)
                {
                    let mokeponEnmigo = null
                    if(enemigo.mokepon != undefined)
                    {
                        const mokeponNombre = enemigo.mokepon.nombre 
                        switch (mokeponNombre)
                        {
                        case "Hipodoge":
                            mokeponEnmigo = newMokepon('Hipodoge', './assets/mokepons_mokepon_hipodoge_attack.png', 5, './assets/hipodoge.png', enemigo.id)
                                break
                            case "Capipepo":
                                mokeponEnmigo = newMokepon('Capipepo', './assets/mokepons_mokepon_capipepo_attack.png', 5, './assets/capipepo.png', enemigo.id)
                                break
                            case "Ratigueya":
                                mokeponEnmigo = newMokepon('Ratigueya', './assets/mokepons_mokepon_ratigueya_attack.png', 5, './assets/ratigueya.png', enemigo.id)
                                break
                            default:
                                break
                        }

                        mokeponEnmigo.x = enemigo.x
                        mokeponEnmigo.y = enemigo.y
                    }
                        return mokeponEnmigo
                })

//---------------------------------Al tratar de pintar enemigos----------------------------------------
        mokeponesEnemigos.forEach(function (mokepon)
        {
            if(mokepon != undefined){
                mokepon.pintarMokepon()
                revisarColision(mokepon)
            }
        })

Decidí subir la respuesta de @ric.arellano92 porque estuve rompiéndome la cabeza durante una semana y quiero que otros lo puedan solucionar, ya que desde las carpetas del curso da error. saludos!

Yo creo que a este punto prácticamente nadie entiende, solo copian porque sixdd.
Los primeros profesores lo hacían bien, y explicando, el resto ya solo comenzó a escribir como si nada

Haciendo todo este proceso de juego “online” me doy cuenta de lo absurdamente detallado que debe ser la lógica de un juego, cada pequeña validación importa en el proceso, si alguna validación está mal hecha se rompe la lógica.
He Sufrido como no tienen idea en esta parte del juego por habermelas dado de “creativo” y haber puesto rondas y contadores de choques y otras cosas XD… no se si lo lograre con lo poco que sé pero seguro llegaré hasta donde me llegue el conocimiento.

Acá queda rotísimo…
¡Hasta la próxima amigos!

Un curso espectacular 🔥

Bueno… creo que me devuelvo a fundamentos de la programación, o quizá me haga unas clasesitas de diagramas de flujo jajaja

Para mi desde la clase 79 no función el código hice todas las correcciones , copie el Cod. desde el Github y nada, y por lo que leo en los comentarios varias personas presentan el mismo error, y al estar empezando es difícil poder detectar fallos en el cód… fácilmente.
lo dejare pendiente y cuando este mas capacitado y vea donde están los fallos regresare y compartiré la solución.
Por acá mencióno algunas de las correcciones que hice y que igual no funcionaron:

  1. Comillas (``) en algunas casos no funciona así que ocupe estas (" ") acompañado de + , en la parte del cod. : fetch(“http:/ /localhost:8080/mokepon/” + “{jugadorId}/” + “posición”, intente de todas formas el jugadorid y nada.
  2. Los else: en esa misma función se menciona if, else if, y nuevamente else if, siendo lo habitual según leí en varios comentarios que la ultima debe de ser else, bueno igual realice esa modificación y nada .
  3. ahora tengo un error de que indica: Cannot read properties of undefined (reading ‘nombre’)

Bueno finalizare el programa pero una pena que al final luego de casi 80 clases este roto en las ultimas.

TIP: Para que no tengan que cortar y pegar pueden mover lineas de código arriba y abajo usando ALT y la teclas de arriba o abajo.

Nunca me había sentido tan frustrado y perdido !

Hola, Alguien mas le sale este error, la cariable nombre esta con el mismo nombre que la variable de los nombres de los ataques, pense que erra erros mio pero mire con el codigo de la clase y sale el mismo.

No se cómo sigue funcionado mi código pero ahí vamos😂

resistan spartanos ya falta poco.

Pdt: para finalizar la intro.

Con mucho esfuerzo, lo voy logrando!!

Les recomiendo buscar comparador de textos en internet y comparar el código que hicieron con el que se descarga de la clase, es increible que un simple espacio en blanco puede alterar todo, hay muchos, yo estoy usando este

https://text-compare.com/es/

Yo despues de Terminar el curso de Programacion Básica, 1 mes despues… NUEVO CURSO Gratis de Programacion basica… ok otro reto, ventra el otro nuevo curso grati…?

Quiero hacer esto en unity, está muy genial!

CUANDO ESTAS APUNTO DE TERMINAR … !

y no funciona con todos los mokepones, cuando chocan, quisas algun dia encuentre la solucion

A mi hasta ahora me funciona perfecto pero hasta que ingreso una simple linea de codigo

revisarColision(mokepon) 

Las colisiones funcionan antes, no se porque con solo escribir esa linea, ya nisiquiera me aparecen todos los mokepones en pantalla al tiempo.

Mi texto sobrevivió a todo a duras penas, pero sigue funcionando! 😄

Segun como lo veo yo, este curso es simplemente para ver los diferentes aspectos del desarrollo web y en 15 horas no te van a explicar todo. Yo terminando este curso voy a tomar el de HTML y CSS y luego el de Javascritpt que son mas profundo. Este es un camino muy largo y por no entender al principio no significa que no es lo tuyo, todo se aprende con tiempo, esfuerzo y disciplina.

![]()![]()![]()![]()![](https://media.tenor.com/vqPBNO2hMbsAAAAC/school-time-to-learn.gif)

A solo 3 clases y mi codigo esta roto ! Increible jejeje !

wow esto si se me puso dificil

¿Cómo reinicia el servidor tan rápido? Ya lo logré apagar: crtl+C encender: flecha arriba+enter

Seria bueno que para un futuro agregaran la posibilidad de poder cambiarle la calidad a los videos. Como no tengo un internet muy bueno, me ha costado, un poco mas de lo normal terminar el curso.

Creo que en el examen de este modulo si me voy a pegar la rajada del siglo jejjejeje. Pero no entender aun no me destruye la moral.

Yo tengo el código un poquito diferente, porque yo evaluaba ataque por ataque y no esperaba a que se realicen los 5, pero a ver si resulta skldjaskdljsakldja

1+

ya casi siiiiiiiiiiiiiuuuuuuuuuuuuuuuuuu

Buenas clases, ya falta poco para culminar.
Hola a todos... no he podido pasar de esta clase debido a que tengo un error que no he podido solucionar, cada vez que selecciono el mokepon no dibuja el mapa, sino que salta directamente a la pantalla de los ataques. Ya he revisado mi código comparando con el de los profes, pero no encuentro el error, he modificado mucho el código. Si alguien me puede ayudar para continuar les agradezco
para el error "Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'nombre')" pueden usar este codigo: `const mokeponNombre = enemigo.mokepon ? enemigo.pochems.nombre : '';` en la linea donde definen la variable mokeponNombre, Esta línea de código comprueba si `enemigo.mokepon`está definido antes de intentar acceder a su propiedad `nombre`. Si `enemigo.mokepon`es `undefined`, entonces `mokeponNombre` se establecerá en una cadena vacía. Esto evitará el error.
ayuda no me responde el servicio pero el fetch al enviar los datos sale ok pero del lado del backend puse un console.log con los datos llegados pero no ocurre nada no llega nada

Me he dado cuenta que la muchos errores que me pasaban era por iniciar mal el servidor y la actualización de la página.
Como consejo, les recomiendo tener mucho cuidado al iniciar y cerrar el servidor. 😄

Yo me pregunto , ¿Qué está pasando? , jaja me lo pregunto cada 1 minuto aproximadamente.

Es un poco triste como es que está terminando este curso, la verdad que tengo mucha más frustración e entendimiento que sensación de éxito , definitivamente para aprender no creo que sea tan buena esa sensación . Una mezcla extraña entre aprender pero también con mucho entendimiento.

En fin, vamos que ya queda poquito! los que llegamos hasta aquí, deberíamos estar orgullosos porque esto ha sido todo un desafío , en mi caso yo partí el 18 de abril … para ser mi primer curso en programación a la final me voy contento , un poco frustrado pero a la final orgulloso y contento

Buenas. Tengo un problema similar al resto que publica. Igualmente, es curioso lo que me paso, lo comento:

  1. Antes de iniciar con el backend, completé los trabajos que había indicado el anterior profesor: metí a los otros tres mokepones (Tucapalma -me declaro fan de Tucapalma -, Langoselvis y Pydos), según la clase (agua, fuego y tierra) y a quien se enfrentaba se le suma un ataque o no, y cada enemigo ataca en función de su clase. Esto me llevó a modificar el código.
  2. Esa modificación del código me complicó el seguir cada paso de indicado por la profesora Diana, y tuve que ir adaptando lo explicado en clases con mi código. Me esta costando el mismo tiempo prácticamente lo que se enseña de backend con todo lo anterior. Obviamente, de igual manera voy a seguir adelante.
  3. Finalmente, logré adaptarlo. De igual manera, funcionó bastante bien las primeras veces. Ahora, no se que toqué (o dejé de tocar) y resulta que al hacer colisión entre personajes queda como “colgado” el juego. Al verificar en consola es como que repite en loop, cargando constantemente datos de mokepones. Lo que me llama la atención es que funcionaba bien las primeras veces, despues es que dejo de hacerlo. Resetee infinidad de veces el servidor, y puede funcionar bien un par de veces pero despues pasa lo mismo que indique anteriormente.
  4. Previo a esto, tambien me paso que es como que se satura de información el servidor. Cuando hay mas de 4 ventanas abiertas del juego, es como que colapsa. Es problema mio o a alguien mas le pasa?
    Saludos! Muy buen curso!

Esto puede ayudarlos! si por ahí les sale un error con un Undefined

const enemigos = jugadores.filter((jugador) => 
    jugador.id !== jugadorId && jugador.mokepon !== undefined)
    

Casi que no doy con el chiste para que funcionará la colisión, pero es porque si al refrescar el enlace, no se escoje mokepon, igual se crea un nuevo enemigo que no tiene mokepon, por lo que este mokepon indefinido entra a la lista de mokepones enemigos y se paletea todo, para corregirlo agregué un condicional en la función del servidor, en la cual solo agrego el jugador a la lista de enemigos en caso de que ya haya elegido un mokepon

Me salía un millón de veces este error, y cuando lo quise arreglar desapareció de la nada 🙃 ![](https://static.platzi.com/media/user_upload/image-78fe6d98-71b5-41f3-91ce-28b007c90a2f.jpg) O será que me estoy volviendo locaaa xD!
y pensar que existirá un mapa como el de GTA VI...
con un mapa de la poderosa CDMX ![](https://static.platzi.com/media/user_upload/image-d273a643-a823-437f-a016-b3e8cec5d9bd.jpg)
Curso de Frustración Básica
Estuve más de una hora![]() revisando línea por línea todo el código y repasé cuatro clases anteriores varias veces, ya que, después de seleccionar todos los ataques de ambos jugadores, no mostraba el resultado. (Estuve a punto de borrar todo el código y comenzar desde cero). Al final, en la función "secuenciaAtaque", escribí "ataqueDelJugador" en vez de "ataqueJugador" :))))))) ![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-06-18%20132716-95a899ca-4bb0-448b-961c-374790cc5eae.jpg)
hola buenas me podrian decir cuantas horas les tomo terminar el curso gracias
Tuve este problema, cada que presionaba un ataque, mi cadena de ataques quedaba como null luego del primero. ![](https://static.platzi.com/media/user_upload/image-389058a1-337c-440e-b420-d2f286804981.jpg) Mi error era el if (ataqueJugador.length = 5 ), solo lo coloqué con un =, y la profesora le colocó tres ===. ![](https://static.platzi.com/media/user_upload/image-f7e6cd89-b714-4fbd-8f65-36d3d145e315.jpg)
como puedo arreglar esto?: mokepon.html:1 Access to fetch at 'file:///C:/mokepon/0.1617707234197141/ataques' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, isolated-app, ipns, https, chrome-untrusted, ipfs, data, chrome-extension, chrome.
Hola a todos. Tengo un problema que no he podido solucionar. Al seleccionar el mokepon, de una salta a la pantalla de ataques, sin ni siquiera colisionar con el enemigo. si alguien me puede ayudar que podría estar pasando. He modificado mucho el código y no logro ver el error comparando con el código de los profes.

basic course

Es frustrante que se te rompa el código, pero siempre hay alguien en los comentarios con la solución.

Estuve hasta acá pensando como hacian los profes para no perder la secuencia del código, los nombres de las variables, funciones y métodos. Observé entonces cómo de manera muy sutil miraba al lado izquierdo cada vez que iba a escribir alguno de ellos. Definitivamente se requiere un mapa o diagrama previo para programar. Les agradezco si me recomiendan la mejor forma de aprenderlo

Lo que me pasa es que se me duplican los botones de ataques pero no me aparece error, me tocara mirar como podré encontrar una solución 😃

Tengo una duda, porque se quita la condicional del si el personaje se mueve para verificar las colisiones?

Funcionando ya merito coronamos.
Viendo la clase y pausando a 0.85x (porque vuelvan esos profes) y con el vsCode con su autocompletar y aun así errores de typing 😅

Estamos a un solo paso de terminar este viaje. Vamooooooos.

En el código , en la función enviarAtaques ()
En este código pudimos ver como nos falto el puerto 8080 y el http : / / localhost .
Que quedaría así:

necesito fortalecer mi html

  • En mi proyecto, ya llevo varias docenas de juegos y subjuegos a partir de puro trabajo con idiomas, es decir no he usado muñecos sino palabras de ciertos idiomas.

  • He aprendido MUCHO elevado a la Platzi, en este curso, maravilloso, y lo bueno es que he aprendido muchas instancias de disciplina de programador.

  • Ahora ya paso a hacer juegos con movimientos…

  • Me esperan unos dos meses de trabajo intenso, dado el caso que estoy en plena producción pagada del año 2023 y debo ajustarme al horario de mi empleador.

  • Esto va bien.

He encontrado la solución gracias a usar CHAT GPT PLUS - GPT4 le he pasado el todo el código de mokepon.js y después de analizarlo me ha dicho que existía algunos problemas, y le he dicho:

Yo: Puedes solucionar los problemas que consideras que se tiene que ajustar?

Y la IA me dice: Sí, puedo hacer ajustes en el código para resolver algunos de los problemas mencionados. A continuación, se presenta el código modificado, en el que he reorganizado la estructura de algunas funciones para asegurar que todos los elementos estén definidos antes de ser utilizados:

// Código ajustado

const sectionSeleccionarAtaque = document.getElementById('seleccionar-ataque');
const sectionReiniciar = document.getElementById('reiniciar');
const botonMascotaJugador = document.getElementById('boton-mascota');
const botonReiniciar = document.getElementById('boton-reiniciar');
sectionReiniciar.style.display = 'none';

const sectionSeleccionarMascota = document.getElementById('seleccionar-mascota');
const spanMascotaJugador = document.getElementById('mascota-jugador');
const spanMascotaEnemigo = document.getElementById('mascota-enemigo');
const spanVidasJugador = document.getElementById('vidas-jugador');
const spanVidasEnemigo = document.getElementById('vidas-enemigo');
const sectionMensajes = document.getElementById('resultado');
const ataquesDelJugador = document.getElementById('ataques-del-jugador');
const ataquesDelEnemigo = document.getElementById('ataques-del-enemigo');
const contenedorTarjetas = document.getElementById('contenedorTarjetas');
const contenedorAtaques = document.getElementById('contenedorAtaques');
const sectionVerMapa = document.getElementById('ver-mapa');
const mapa = document.getElementById('mapa');

// Resto del código...

function iniciarJuego() {
    
    sectionSeleccionarAtaque.style.display = 'none';
    sectionVerMapa.style.display = 'none';

    mokepones.forEach((mokepon) => {
        opcionDeMokepones = `
        <input type="radio" name="mascota" id=${mokepon.nombre} />
        <label class="tarjeta-de-mokepon" for=${mokepon.nombre}>
            <p>${mokepon.nombre}</p>
            <img src=${mokepon.foto} alt=${mokepon.nombre}>
        </label>
        `;
        contenedorTarjetas.innerHTML += opcionDeMokepones;
    });
    
    inputHipodoge = document.getElementById('Hipodoge');
    inputCapipepo = document.getElementById('Capipepo');
    inputRatigueya = document.getElementById('Ratigueya');

    botonMascotaJugador.addEventListener('click', seleccionarMascotaJugador);
    botonReiniciar.addEventListener('click', reiniciarJuego);

    unirseAlJuego();
}

// Resto del código...

En este ajuste, he reorganizado el código para asegurar que los elementos del DOM se definan antes de ser utilizados. También he corregido la falta de puntos y comas al final de algunas líneas, para mantener una sintaxis consistente y evitar posibles problemas en la ejecución del código.

A mi se me rompio todo el codigo :C, no entienndo que hice mal aun, estoy esperando terminar el curso y asi poder revisarlo

Quede impresionado de como funciona el metodo de de mover el mapa e interactuar con una colision. Tuve mushos problemas para que este metodo funcionara, pero con paciencia y tiempo puede salir. La cosa es no darse por vencido.