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

Métodos en las clases

66/84
Recursos

Aportes 71

Preguntas 22

Ordenar por:

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

Cuando el valor de una propiedad de un objeto es una función se le llama: método.

El método, entonces, es una función que está asociada a un objeto.

si ponen la funcion aleatorio en el constructor de la clase mokepon, en las cordenadas X y Y, los mokepones salen aleatorios.

this.x= aleatorio(0,320)
this.y= aleatorio(0,240)

va tomando forma 😁

Aquí les dejo las cabezas de nuestros Mokepones

Por personalizar a mis mascotas
![](

Me tocó improvisar cabezas jajaja.
![](

Nadie tiene las cabezas de los otros 3 mokepones del reto anterior ???
Por ahora en mi caso deje para la cabeza y el cuerpo, la misma imagen (Me refiero a langostelvis, pydos y tucapalma…)

Difícilmente se puede seguir el curso sin conocimientos anteriores. Se pasa por encima de muchas cosas, que se dan x conocidas.

Bueno!!!
.
Hay vamos…
.

.

.
Que gran avance!!!

Mi mapa:

Wowow este curso básico no esta tan básico después de todo espero seguir mas adelante aprendiendo y no sentirme mas perdido con las demás cursos de JS

Así va quedando :3

Quisiera compartirles un poco de como yo he ido haciendo este proyecto a mi manera con las bases del curso.

  • Yo puse todos mis objetos de personaje en un array, esto me permite usar los índices de cada personajes para toda la lógica del juego
let invocaciones = [sammy, amalthea, ashley];
  • Tambien tengo una funcion para crear otro array pero con los enemigos, esta función se activa luego de que nuestro usuario escoja personaje (no quiero tener que luchar contra mi propio personaje :p)
let enemigos
function IndiceEnemigos (){
    enemigos = invocaciones.filter(function(pj){
        return pj.nombre != invocaciones[indiceInvocacion_p1].nombre
    })
}

-Por último use nuestra función para crear números aleatorios en la posición donde sale cada personaje, así se evita que salgan siempre en el mismo sitio ( lo que sí hice fue limitar una zona para cada personaje porque aunque es aleatorio salían muy cerca algunas veces)
PD: los rangos van según el tamaño de nuestro canva teniendo en cuenta el tamaño de las imágenes también.

invocaciones[1].x = aleatorio(200,500);
invocaciones[1].y = aleatorio(150,350);

vamos!!!

Esta quedando chido 😃

Bueno, realmente es como sigue:
Propiedad es una función del objeto que establece o devuelve un valor, como Color.
Método es una función que puede no retornar un valor, pero que ejecuta una acción, como MoverDerecha(espacios), o Dibujar.
Evento es una función que es llamada por el propio objeto y queda disponible para que el programador la aproveche si lo necesita, como CambioColor (colorAnterior), CambioPosición(PosicionAnterior), SeAgregoUnAtaque(NuevoAtaque), Click, Drag…

Aprovechando la función Aleatorio que ya tenemos, coloqué cada Mokepón en un lugar al azár:
let hipodoge = new Mokepon(‘Hipodoge’,’./assets/Hipodoge.png’,0,’./assets/Hipodoge.png’,aleatorio(10,630), aleatorio(10,470))
/* Aquí aún no se ha definido el Canvas, así que use las dimensiones de pantalla (640x480) menos 10, para que todos estén en el mapa, pero esto se puede mejorar…

Luego, los pinto todos con un ciclo en la función correspondiente:
mokepones.forEach((moke) => {
moke.dibujar()
})

Yo le agregué un poco de picante 🔥 para que la posición de los enemigos sea aleatoria.

let hipodoge = new Mokepon('Hipodoge','./assets/mokepons_mokepon_hipodoge_attack.png', 5, './assets/hipodoge.png')
let capipepo = new Mokepon('Capipepo','./assets/mokepons_mokepon_capipepo_attack.png', 5, './assets/capipepo.png')
let ratigueya = new Mokepon('Ratigueya','./assets/mokepons_mokepon_ratigueya_attack.png', 5, './assets/ratigueya.png')
let hipodogeEnemigo = new Mokepon('Hipodoge','./assets/mokepons_mokepon_hipodoge_attack.png', 5, './assets/hipodoge.png', Math.random()*mapa.width, Math.random()*mapa.height)
let capipepoEnemigo = new Mokepon('Capipepo','./assets/mokepons_mokepon_capipepo_attack.png', 5, './assets/capipepo.png', Math.random()*mapa.width, Math.random()*mapa.height)
let ratigueyaEnemigo = new Mokepon('Ratigueya','./assets/mokepons_mokepon_ratigueya_attack.png', 5, './assets/ratigueya.png', Math.random()*mapa.width, Math.random()*mapa.height)

El en reto de la ultima clase del anterior modulo, nos pidieron agregar los 3 mokepones restantes, pero aqui solo dan el rostro de los 3 iniciales

pensé que iba a dejar el curso, la clase pasada no podía continuar, luego descubrí el error y pude seguir.😁😁

  • Método es el nombre que recibe una función que existe dentro de una clase.
    .
  • Se utilizan para englobar comportamientos o acciones que se pueden realizar con los objetos creados a partir de la clase.

No puedo seguir la clase, se quebró mi código, lo revise varias veces y no entiendo porque no me funciona. Alguna idea o sugerencia?

Ami me quedo así

no pude seguir de esta clase, copio pego mis personames y le cambio el nombre agregandoles Enemigo pero no sucede nada, yo tengo 6 personajes, copie y pegue los ultimos 3 y les agrege enemigo y del resto hice todo igual y no funciona y en la consola no sale error. ayuda!

yo en vez de crear todos los personajes de nuevo, pero con el “enemigo”, guarde la mascota aleatoria en una variable llamada mascotaDelEnemigo, luego prácticamente copie el sistema creado para hacer aparecer a la mascota del jugador, y de esta forma hice que apareciera el enemigo en el mapa

sinceramente estoy siguiendo el curso y todo me ha salido bien pero hay varios conceptos que no los termino de captar solo sigo las instrucciones pero hacerlo por mi cuenta sola no podría, igual seguiré porque imagino que cuando veamos todo a mas profundidad se aclararan dudas y afianzaran conocimientos, yo veo este curso como un abre boca para echemos un vistazo a todo lo que la programación ofrece y analicemos si de verdad queremos seguir, por mi parte no parare de aprender así me sienta perdida por momentos...

Vamos bien.

Hola a todos! Me parece mas entretenido si hacemos que los mokepones enemigos tengan una posición diferente cada vez que se inicia el juego. Para ello, usé la función aleatorio cuando creo los objestos enemigos:

<code> 
let hipodogeEnemigo = new Mokepon('Hipodoge','./assets/mokepons_mokepon_hipodoge_attack.png',5,'./assets/hipodoge.png', aleatorio(10,250), aleatorio(10,200))

let capipepoEnemigo = new Mokepon('Capipepo','./assets/mokepons_mokepon_capipepo_attack.png',5,'./assets/capipepo.png',aleatorio(10,250),aleatorio(10,200))

let ratigueyaEnemigo = new Mokepon('Ratigueya','./assets/mokepons_mokepon_ratigueya_attack.png',5,'./assets/ratigueya.png',aleatorio(10,250),aleatorio(10,200))

Estas clases son muy adictivas. Uno se ve una y quiere ver las otras 10. Gracias totales.

¡Vamos así! 😄 Más adelante pienso rediseñar algunos mokepones para diferenciarlos entre enemigos y el mokepon del jugador 😉.

Me encanta esta profesora, se detiene con frecuencia a explicar detalles adicionales que podrían ser de utilidad aunque no estén directamente relacionados con lo que se está haciendo en el momento, además que todo se siente menos cuadriculado. Hace que sienta que aún estoy avanzando pero el nivel de esfuerzo cognitivo disminuyó.

Genial ![](https://static.platzi.com/media/user_upload/image-c4640f9d-d922-480a-b50b-e8d572989404.jpg)![](https://static.platzi.com/media/user_upload/image-4f015098-3dbe-48c6-916b-461c9333684e.jpg)
así va quedando mi Hogwarts Legacy ![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-05-21%20114731-1ffba81f-b029-4d4a-a050-467c544dad5f.jpg)
**<u>Cómo hacer que la mascota rival te persiga:</u>** Les dejo la función que creé para que la mascota enemiga te persiga en lugar de quedarse quieta. Cabe mencionar que, además de esta función, fue necesario: * crear un nuevo `interval` que ejecute constantemente la función `moverRival` (el intervalo se inicializa en la función `iniciarMapa`, igual que el intervalo para el movimiento del jugador) * incorporar la actualización de la posición del rival en la función `pintarCanvas`. La función `moverRival` me quedó así: ![](https://static.platzi.com/media/user_upload/image-41e88c0e-1fd1-4ce1-b74b-e3fea4f78d23.jpg)
Queriendo usar animalitos pero con distinta resolucion, les asign\[e por par\[ametro un width y un height, por ejemplo el cocodrilo tenia que necesariamente cambiar la forma en la que se dibujaba para que no quedara chaparro![](https://static.platzi.com/media/user_upload/MOKEPON_capture-b86db3e5-8456-42a6-b70d-b644d62c7937.jpg)
Mi avance hasta ahora :D ![](https://static.platzi.com/media/user_upload/image-c5165766-736e-47a2-a62c-66c2b7c5f41a.jpg)![](https://static.platzi.com/media/user_upload/image-b574a0fd-cd72-4ece-a958-5d4f0866c84d.jpg)

😄

Utilicé la función aleatorio para la posición del mokepon enemigo, vi que en algunos aportes utilizaron el rango del aleatorio el mapa.width y el mapa.height pero en mi caso solo se movían en un rango muy chico y repetían muchas posiciones, me parece que tienen más movilidad definiendo los rangos del aleatorio.

let hipodogeEnemigo = new Mokepon("Hipodoge", "./assets/HIPODOGEF.png", 5, "💧", aleatorio(20, 620), aleatorio(20, 620))

let capipepoEnemigo = new Mokepon("Capipepo", "./assets/CAPIPEPOF.png", 5, "🌱", aleatorio(20, 620), aleatorio(20, 620))

let ratigueyaEnemigo = new Mokepon("Ratigueya", "./assets/RATIGUEYAF.png", 5, "🔥", aleatorio(20, 620), aleatorio(20, 620))

let langostelvisEnemigo = new Mokepon("Langostelvis", "./assets/LANGOSTELVISF.PNG", 5, "🔥", aleatorio(20, 620), aleatorio(20, 620))

let pydosEnemigo = new Mokepon("Pydos", "./assets/PYDOSF.png", 5, "💧", aleatorio(20, 620), aleatorio(20, 620))

let tucapalmaEnemigo = new Mokepon("Tucapalma", "./assets/TUCAPALMA.png", 5, "🌱", aleatorio(20, 620), aleatorio(20, 620))

Excelente clase. lo reproduzco a 0.85x, es bueno como se hace entender.
Gracias también los compañeros que hacen verdaderos aportes.

aún no estoy muy seguro de porque pero quería hacer un forEach para no volver a declarar a las mascotas enemigas, si no que usar las del propio arreglo de Mokepones y no me dejaba mostrar a la misma mascota que escogiera el jugador

mokepones.forEach(mokepon=>{
        mokepon.pintarMokepon()
    })

mi solución fue en la función seleccionarMascota() crear una variable enemiga y hacerle un push en el arreglo mokepones:

enemiga = new Mokepon(mascotaJugador.nombre,mascotaJugador.imagen,5,mascotaJugador.vida,mascotaJugador.mapaFoto.src)
            enemiga.ataques = (mascotaJugador.ataques)
            mokepones.push(enemiga)

Para no tener que volver a asignar todos los valores de los mokepones para los enemigos, uso una función que clona las instancias de una clase. Esto reduce el riesgo de errores, como por ejemplo, si cambiamos la ruta de la dirección de una de las imágenes, no hay necesidad de cambiarla tanto en el mokepón original como en el enemigo:

// Función auxiliar para clonar una instancia de una clase
function clonarClaseObjeto(obj){
    return Object.assign(Object.create(Object.getPrototypeOf(obj)), obj);
}

// Creamos los mokepones enemigos
let hipodogeEnemigo = clonarClaseObjeto(hipodoge);
[hipodogeEnemigo.x, hipodogeEnemigo.y] = [80, 120];

let capipepoEnemigo = clonarClaseObjeto(capipepo);
[capipepoEnemigo.x, capipepoEnemigo.y] = [150, 95];

let ratigueyaEnemigo = clonarClaseObjeto(ratigueya);
[ratigueyaEnemigo.x, ratigueyaEnemigo.y] = [200, 190];

Aguante el Hipodosh!!

Estoy impresionado con la forma que se ha usado las coordenadas de los enemigos para usar el canvas. Es la primera vez que veo eso, espero seguir aprendiendo mas.

Cuando pedimos parámetros para una función podemos definirle un valor por defecto a sus parámetros.

ARRIBA DE MI MOTO ESTUDIO PAAA

En mi caso ya que el `this.width` y el `this.height` solo aceptan valores en pixeles, cree dos funciones que me ayudan a pasar un numero de viewport y que este sea convertido a pixeles, haciendo que los pixeles establecidos cambien según el tamaño de la pantalla. ![](https://static.platzi.com/media/user_upload/image-1e928422-5fac-4f83-b889-e4fbd2ffd0c6.jpg)![](https://static.platzi.com/media/user_upload/image-0346469d-3308-437e-ba72-d650e555d534.jpg)
me están saliendo éstos errores y no se solucionarlos![](file:///C:/Users/Esteban/Pictures/Screenshots/Captura%20de%20pantalla%202024-06-27%20115618.png)
![](<"C:\Users\Esteban\Pictures\Screenshots\Captura de pantalla 2024-06-27 115618.png">)
Los mokepones parecen gallinas en el gallinero 😂😂

Que confuso que hace y deshace su código. En lugar de que sea super estructurada la instructora como nos acostumbraron al principio…

![]()
![](file:///Users/manuelgutierrez/Desktop/Screen%20Shot%202024-03-25%20at%205.29.02%20PM.png)
comenteeen
En mi caso lo que hice fue que las posiciones de los personajes fuesen aleatorias usando la función que ya habíamos creado desde el principio. ```js class Mokepon { constructor(nombre, foto, vidas, cara){ this._nombre = nombre this._fotos = foto this._vidas = vidas this._ataques = [] this._x = aleatorio(270, 0) this._y = aleatorio (190, 0) this._ancho = 50 this._alto = 50 this._imagen = new Image() this._imagen.src = foto this._velocidadX = 0 this._velocidadY = 0 this._cara = new Image() this._cara.src = cara } pintar(){ lienzo.drawImage( this._cara, this._x, this._y, this._ancho, this._alto) } } ```270 y 190 son los 320 y 240 menos los 50 pixeles que mide la imagen, para que nunca se salgan del lienzo. también se podría hacer esto para que las posiciones nunca sean las mismas ```js let posicionesUsadas = [] function generarPosicionUnica() { let x, y do { x = aleatorio(0, 320) y = aleatorio(0, 240) } while (posicionesUsadas.includes(`${x},${y}`)) posicionesUsadas.push(`${x},${y}`) return {x, y} } ```pero ya es mucho jaja no lo incluí, pero tenia la duda de si se podría, y si se puede >D

EL ERROR DE LA CLASE 65 JAMÁS SE LOGRA ARREGLAR, ES UNA LASTIMA, VENÍA MUY ENTUSIASMADO, CABE RESALTAR QUE NISIQUIERA COPIANDO EL CODIGO DEJADO EN GITHUB, JAMÁS LO PENSÉ PERO AHORA PUNTO NEGATIVO PARA PLATZI.

Gracias por la clase.

Saludoss les cuento pueden colocar las cabezas de sus personajes diferentes a los que usan los profesores la manera en que lo hice fue hacer capture de pantalla al personaje que he usado en mi juego luego en la pagina de removebg extrae el fondo guarde la imagen en la carpeta donde estan las imagenes de mis personajes y siguiendo los pasos de la profesora se logran inicializar en mi canvas

hola vine aqui de nuevo repasando jajajaja por esta no pasé la prueba

genial!

T.T no subieron las imagenes también de tucapalma, pydos y langostelvis, me tocará desmontarlos T.T

Posiciones aleatorias


Yo preferí, pintar todos los mokepones con un forEach:

mascotaJugadorObjeto.pintarMokepon()
mokepones.forEach((mokepon) => {
        mokepon.pintarMokepon()
})

Y en el constructor puse esto para las coordenadas:

this.x= aleatorio(0, mapa.width-this.ancho),
this.y= aleatorio(0, mapa.height-this.alto),

Así se ve:


Asi va quedando el proyecto, con un toque personal.
https://juancamilogomezalvarez.github.io/mokipon/

alguien mas se dio cuenta que el background es del Pokemon Rojo Fuego cuando vas al laboratorio del cientifico que se habia convertido en pokemon?

🔥🔥🔥

me aparece cuando elijo un personaje cuando le doy seleccionar en el mapa me aparece el que elegi muchas veces
y no que hacer llevo 1 hora tratando de repararlo

me preguntaba por que tambien funciona en diagonal al mover al mokepon, no encontre exolicacion, creanme no me ha dejado dormir 😃

que buena esta clase!!

es buen aporte para todos