Fundamentos de Programación

1

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

2

¿Cómo aprender programación?

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

Aprende Inglés, Desarrollo Web, AI, Ciberseguridad y mucho más.

Antes: $249

Currency
$209
Comienza ahora

Termina en:

1 Días
16 Hrs
50 Min
41 Seg

Una sola fuente de la verdad

52/84
Recursos

A lo largo del código fuente de un proyecto, puede haber información “hardcodeada” que cause dificultades en el futuro de la aplicación para que el proyecto siga creciendo.

Qué es el código hardcore

El término “hardcore”, o cuando hablamos de “código hardcodeado”, significa escribir directamente en el código fuente información propia para el funcionamiento de un proyecto.

Por ejemplo, si tenemos una contraseña para acceder a algún servicio externo. No es una buena práctica harcodear la contraseña en una variable.

const password = '12345';

Ya que, además de ser inseguro, la misma puede cambiar con el tiempo.

Si tienes una determinada cantidad de información, de mokepones en tu videojuego, procura pensar en la escalabilidad de tu proyecto. Siempre piensa en qué pasaría si tuvieras miles de mokepones o si alguno de ellos cambia de nombre.

Hasta este punto del desarrollo del videojuego, es un buen ejercicio que repases todo el código que has escrito y que hagas un esfuerzo por buscar mejorarlo o por identificar información hardcodeada que puede causar problemas con el tiempo.


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

Aportes 73

Preguntas 28

Ordenar por:

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

Este curso esta en otro nivel. Cada vez entiendo mas la progrmación y quiero dedicarle mas tiempo a estudiar.💚💚💚

Sinceramente Platzi, os habéis paseado con este curso 💃🏽🙏🏼❤️

En resumen:
Todas las funciones que tengan información “a mano” que nosotros ponemos, la vamos a retirar, para poner sólo la información que existe en los objetos, es decir Usar una sola fuente de verdad.

Información “a mano”:

spanMascotaJugador.innerHTML = 'Capipepo'

haciendo uso de una Fuente de verdad:

spanMascotaJugador.innerHTML = inputHipodoge.id

Te dejo un buen recurso donde puedes ahonda más en el tema de Una sola fuente de verdad

single source of truth Lo único malo que no hay una versión en español

Este curso es tan bueno (Y GRATIS) que no entiendo cómo mucha gente no aprende a programar🤯.

Por cierto, es posible evitarse la validación con if si se declara la mascota del jugador más o menos así:

let mJugador = eval(document.querySelector('input[name="mascota"]:checked').id)

Siempre que el input esté así:

<input type="radio" name="mascota" id="hipodoge">

Una fuente de verdad es que Platzi es la mejor inversión que harás.
Este valor se repetirá sin importar el día, mes o año en el que lo quieras ocupar


yo he creado una pequeña funcion la cual dependiendo el caso sustituye el span por la imagen correspondiente

Una sola fuente de verdad se refiere a:

  • Tener en una sola variable la información que se usará repetidamente en el programa (en este caso el nombre del mokepón), y no agregar esa información directamente en el código (harcodear)

Uno va dejando un poco el miedo a un lado, cada vez el gusto por aprender programación es mayor. 😄

Me encanta!!!, Amo platzi, amo a los profes, amo a Cheems y te amo a ti.

en vez de colocar el nombre de la mascota, coloque la imagen de la mascota.

function seleccionarMascotaJugador(){

if(inputMascota1.checked){
    mascotaJugador = inputMascota1.id
    muestraMascotaJuagador()
} else if(inputMascota2.checked){
    mascotaJugador = inputMascota2.id
    muestraMascotaJuagador()
} else if(inputMascota3.checked){
    mascotaJugador = inputMascota3.id
    muestraMascotaJuagador()
} else {
    alert('Debe Seleccionar una Mascota')
}
sectionSeleccionarAtaque.style.display = ''
sectionSeleccionarMascota.style.display = 'none'

seleccionarMascotaEnemigo()

}

function muestraMascotaJuagador(){
mokemones.forEach((mokemon) => {
if(mascotaJugador == mokemon.nombre){
document.getElementById(“imagen-mostro-ataque-jugador”).innerHTML=<img class="imagen-mostro-ataque" src="${mokemon.imagen}" alt="${mokemon.nombre}" />;
}
})
}

function seleccionarMascotaEnemigo(){
mascotaEnemigo = aleatorio(1, 3)
mokemones.forEach((mokemon) => {
console.log(mascotaEnemigo + ’ ’ + mokemon.apodo)
if(mascotaEnemigo == mokemon.apodo){
console.log(‘paso’)
document.getElementById(“imagen-mostro-ataque-enemigo”).innerHTML=<img class="imagen-mostro-ataque" src="${mokemon.imagen}" alt="${mokemon.nombre}" />;
}
})

}

Pensé que lo haría con Hipodoge.nombre.

Siempre me han gustado estos temas de poder automatizar o parametrizar todo lo que uno crea. Esa fue una de las razones por las que me animé a estudiar programación.

Quiero decir que la fuente de mis mayroes erroes en este poryecto es producto de mi dixlesia al momento de escrbir variables.

Una sola fuente de la verdad es la información que tenemos ne nuestros objetos. Todas las function que tengan información a mano (Hardcoded) deberíamos retirarla.

  • typeof() que tipo de elemento es lo que se le coloca
  • Lo que veo es que al colocar la variable que recorre el array con forEach de la clase Mokepon, las variables pasan hacer objetos, y asi exraer información de ellos.
  • entonces para llegar al método del objeto seria con el “.”

mokeponooooooo

Tu sabes cuantos años de flow tú tienes que acumular para llegar aquí,muchos 😜🤘🏻🦁😏

Es interesante la verdad la forma en que estos valores son usados. Su logica es algo parecido a lo que uso Flutter, jamas imagiene que algunas reglas de logica sean las mismas. Quede impresionado.

En mi caso los input me aparecen como “null”, ya he revisado el código un montón de veces y el del profesor pero no he logrado dar con el problema

const sectionSeleccionAtaque = document.getElementById("seleccionaAtaque") 
const spanMascotaJugador = document.getElementById("mascota-jugador")```


function seleccionarMascotaJugador() {
    
    sectionSeleccionarMascota.style.display = 'none'
    sectionSeleccionAtaque.style.display = 'flex'
    
    if (inputHipodoge.checked) {
        spanMascotaJugador.innerHTML = inputHipodoge.id
    } else if (inputCapipepo.checked) {
        spanMascotaJugador.innerHTML = inputCapipepo.id
    } else if (inputRatigueya.checked) {
        spanMascotaJugador.innerHTML = inputRatigueya.id
    } else {
        alert('Selecciona una mascota')
    }

    seleccionarMascotaEnemigo()
}

El método:

typeof (AquiElElementoQueSeQuiere
Consultar) nos sirve para saber que tipo de elemento es
ya sea: objet, class, array, etc.

A mi me quedo asi la funcion

function seleccionarMascotaJugador () {
    seccionMascota.style.display = 'none';
    seccionAtaques.style.display = 'flex';

    let selected = document.querySelector('input[name="mascota"]:checked');
    if (selected === null) {
        location.reload();
        alert('no seleccionaste nada');
    }
    mascotaJugador = selected.id;
    spanMascotaJugador.innerHTML = mascotaJugador;
    buttonMasconta.disabled = true;
    ramdonMascota();
    inputMascotaEnemigo.innerHTML = mascontaEnemiga;

    insertarImagenMokepon( mascotaJugador);
}
Aquí un resumen del tema SSOT en colaboración con ChatGPT 🤖: "Una sola fuente de verdad" (en inglés, "Single Source of Truth" o SSOT) es un concepto en desarrollo web y gestión de datos que se refiere a tener una única ubicación centralizada donde se almacena la información más actual y precisa. Este principio asegura que todos los sistemas se basen en los mismos datos actualizados y consistentes, evitando la duplicación y las inconsistencias. ### Aplicaciones en el Desarrollo Web 1. **Bases de Datos Centralizadas**: En muchas aplicaciones web, una base de datos central actúa como la única fuente de verdad. Todas las operaciones de lectura y escritura se realizan en esta base de datos, asegurando que todos los usuarios vean la misma información actualizada. 2. **APIs**: Las APIs (Interfaces de Programación de Aplicaciones) pueden servir como una sola fuente de verdad cuando varias aplicaciones o servicios acceden a los mismos datos a través de una API centralizada. Esto asegura que todas las aplicaciones utilicen y actualicen la misma información. 3. **Gestión de Estados**: En aplicaciones de frontend, como las desarrolladas con React, Redux u otros gestores de estados pueden actuar como una sola fuente de verdad para el estado de la aplicación. Toda la información relevante sobre el estado de la aplicación se almacena en un único lugar, lo que facilita la gestión y sincronización del estado a través de los componentes de la aplicación. ### Ventajas * **Consistencia de Datos**: Al tener una única fuente de verdad, se asegura que todos los sistemas y usuarios trabajen con la misma información, evitando conflictos y errores derivados de datos inconsistentes. * **Mantenimiento Simplificado**: Facilita el mantenimiento y la actualización de los datos, ya que solo se necesita actualizar la información en un único lugar. * **Eficiencia**: Reduce la duplicación de datos y los esfuerzos necesarios para mantener múltiples copias de la misma información. ### Ejemplo Práctico Supongamos que tienes una aplicación de comercio electrónico. La información del inventario de productos puede ser almacenada en una base de datos central. Todas las consultas y actualizaciones de inventario (como verificar la disponibilidad de un producto o actualizar el stock después de una compra) se realizan en esta base de datos. Esto asegura que todos los usuarios, ya sea que estén navegando en la web o realizando una compra, vean la misma información actualizada sobre el inventario. En resumen, "una sola fuente de verdad" es un principio clave en desarrollo web que asegura la integridad, consistencia y precisión de los datos a través de todas las aplicaciones y sistemas que los utilizan. Espero que les ayude!

nesecito ayudaaaaaa

me aparece este error pero no veo el error de sintaxis Uncaught SyntaxError: Unexpected identifier 'id' (at mokepon.js:50:19)  {nombre: '💧' id:'boton-agua'},
hoigan quisas le ha pasado algo para mejorar si no seleccionan una mascota y le dan a seleccionar le mandara ese alert pero aun haci los llevara a la seccion de seleccionar ataque lo que hay que hacer es esto debajo del alert de cuando no seleccionaste la mascota en ese alert de la funcion seleccionar\_mascota\_jugador poner debajo de eso un return haci:```js else{ alert('selecciona una mascota') return } section_mascota.style.display='none' section_ataque.style.display='flex' ```tambien hay que poner trasladar los dos llamados a la funcion selection\_mascota y la section\_ataque hacia habajo pero antes de el llamado a la function seleccionar\_mascota\_enemigo fuera del else pero el return es adentro del else de nada
Quiero decir que la fuente de mis mayores errores en este proyecto es producto de mi dislexia al momento de escribir variables. 😂
Puedo confirmar que si intentas adelantarte y poner ` if (Mokepon.checked) { mascotaJugador = Mokepon.id}` no funciona. No se rompe en mi caso porque tengo un `else` para cuando no se selecciona mascota... así que interpreta siempre **else**. Tampoco funciona `mokepon.checked` ni `mokepones.checked` Bueno a lo mejor en la siguiente clase Diego explica cómo sí se hace bien, yo solo probaba por pura curiosidad y no hice ningún ajuste ni revisé nada.
buen curso
traka
casi
de los errores se aprende
buen curso(=
![](https://static.platzi.com/media/user_upload/image-52225946-9c5c-4f60-92d1-e9acc02daf97.jpg) así se ve mi función con una sola fuete de verdad
Para confirmar que entendí bien, me gustaría explicarles lo que entendí: Al asignarle a los span el valor de `inputHipodoge.id` lo que hace esta sección es leer el código HTML inyectado en el `forEach()` que posteriormente obtiene la información del `inputHipodoge = document.getElementById('Hipodoge')` por lo que es una especie de "bucle" o ciclo, el cual va obteniendo información previamente asignada para asignar valores(?) Me ayudaría mucho su feedback jeje, ya que me demore 25 minutos en una clase de 4:44 😅
Tengo una pregunta en qué momento las variables de imput de los mokepones pasa a ser un objeto. Porque se muestra claramente, por ejemplo, como la variable inputHipodoge guarda la propiedad html previamente asignada con el getElementById. inputHipodoge donde la variable en sí guarda esta línea de código html = \<input type="radio" name="mascota" id="Hipodoge"> ¡En qué momento estas variables input que guardan html se convierten en un objeto? En mi perspectiva se logra ver superficialmente que simplemente haciendo la asignación con el getElementById logramos esto, pero me gustaría saber cómo funciona esto por detrás.
mokepo.js:110 Uncaught TypeError: Cannot read properties of null (reading 'checkd') at HTMLButtonElement.selecionarMascota (mokepo.js:110:23) me sale este error ayudaa
Muchas gracias por este curso, estas últimas clases han sido fascinantes!

Siempre me quedo con las ganas de ponerle “Like” o “Me encanta” a cada clase

Este curso está excelente. se aprende bastante.

Si por alguna razón, hiciste todo bien pero las imágenes iniciales desaparecieron, revisa si dejaste alguna de las comillas cuando cambiaste el link del archivo de las fotos iniciales por ${mokepon.foto}. Me tomó varias horas ver que lo había dejado así <img src="${mokepon.foto}.

Averiguar que tipo de elemento una variable

Gracias por la clase. Corta pero eficaz.

En el anterior video comente que se me ocurrio una solución para el inputHipodoge = document.get…, con la funcion eval(), pero no tome en cuenta que al hacer los inputHipodoge.checked tambien podia resumir ese codigo, a un for anidado con if, no soy muhco de explicar, así que espero entiendan el codigo.

function seleccionarMascotaJugador() {
    for (let i = 0; i < mokepones.length; i++) {
        if (eval(`input${mokepones[i].nombre}.checked`)) {
            spanMascotaJugador.innerHTML = mokepones[i].nombre
            sectionSeleccionarAtaque.style.display = 'flex'
            sectionSeleccionarMascota.style.display = 'none'

            seleccionarMascotaEnemigo()
            break;
        } else if (i == (mokepones.length - 1)){
            alert('Selecciona una mascota')
        }
    }
}

Ya que creamos estos elementos desde JS y los rellenamos con informacion de nuestros objetos, aprovecharemos esto por que cada uno de nuestros elementos es un objeto, por lo tanto podemos acceder a las propiedades de esto a traves de la notacion de punto.

Platzi es morado XD

UNDEFINED
si tienes problemas con el nombre del personaje que deberia mostrarse al utilizar este nuevo sistema llamando al nombre usando el id del objeto, revisa el nombre del la variable en la seccion donde se trabaja eso. En mi caso la variable global ( de las que se colocan al principio de todo el codigo en JavaScript), que me servia para los nombre de los MOKEPONES, tenian el mismo nombre que las que estaban dentro de la funcion de elegir al personaje, por tanto se sobreescribia el contenido y daba el error UNDEFINED.
ej:
variable global ----> inputsubzero
variable de la funcion seleccionar personaje —> inputsubzero

Resultado: UNDEFINED

para corregirlo solo le agregue otra paralabra a la variable que uso en la seccion de elegir el personaje y se soluciono

si no lo entindes a la primera lectura, trata de ir comparando cada parte de lo que lees aqui con tu codigo, y te iras ilustrando. Pero tambien me puedes preguntar para mas detalles.

de aqui salgo atrabajr, el mejor curso junto a el otro de programcion

cada clase es algo nuevo, excelente

Harcode: codificación en la que los valores son escritos directamente en el código fuente del programa en lugar de
de ser definidos como variable o constante.

Mis apuntes de esta clase:

METODOS

typeof -> Que tipo de elemento es mi variable

FUENTE DE VERDAD
Utilizar la info de nuestros objetos: los input están ligados a la info de html que pusimos con javascript

Reemplazar la variable que se esta validando a mano y la reemplazamos con la id de ese elemento para que sea dinámico:

if (inputHipodoge.checked) {
	spanMascotaJugador.innerHTML = inputHipodoge.id
} else if (inputCapipepo.checked) {
	spanMascotaJugador.innerHTML = inputCapipepo.id
} else if (inputRatigueya.checked) {
	spanMascotaJugador.innerHTML = inputRatigueya.id
} else {
	alert('Selecciona una mascota')
}

Hola a todas, vego a decirles que investigué cómo poder reducir el código de seleccionarMascotaJugador

function selectPet() {
  var radios = document.getElementsByName("avatar");
  for (var radio of radios) {
    if (radio.checked) {
      spanPetPlayer.innerHTML = radio.id;
      puchamones.forEach((puchamon) => {
        if (puchamon.name == radio.id) {
          imgPet.src = puchamon.img;
        }
      });
      selectPetEnemy();
    }
  }
}

Guardo todos los inputs radio dentro de una variable llamada radios, buscandolos por el nombre
avatar: es el nombre que tienen los inputs radio
lo recorro todo con un forEach y busco el que esté seleccionado, cuando lo encuentro, mediante la propiedad del objeto que cree le asigno el id, que contiene el nombre de la mascota, lo mismo sucede con el resto del código, pero es para asignar la imagen correspondiente

Si esta no es de la mejores clases de todo el curso, no se que lo sea, que increible Diego como profesor

La info que va cambiando repentinamente o con el tiempo debe ser manejada a través de Javascript y estructurada con HTML (Con js puedes también manejar y manipular el DOM, por lo tanto sirve también). El beneficio es que el proyecto se vuelve escalable y eficaz en el largo plazo.

Sin embargo, habrá información que es mejor escribirla directamente

Con eso no habria que hacer muchos cambios al agregar un nuevo personaje. La verdad esta genial 😃

Cada vez entiendo el flujo de los datos con facilidad!

Una fuente de verdad es tener una sola variable que me va a dar información que se va a utilizar repetidamente en todo el programa, de tal manera que los cambios que se realicen se harán de forma dinámica y no manual.

aqui mi versión de colocar la imagen de la mascota del jugador

    let maxNumberArrayPets = mokepones.length;

    // loop al array

    if (maxNumberArrayPets > 0) {
        for (let inc = 0; inc < maxNumberArrayPets; inc++) {

            let pets_input = pets_array[inc];

            if (pets_array[inc].checked) {

                gvimagegamer.setAttribute("src", mokepones[inc].photo)

                gamerChoice = inc;
                petsInputTitle = pets_input.title;

                break;
            }
        }

    } 

📌 Lo de una sola fuente de verdad lo entiendo como ligar un valor hacia una única variable, parece ser que no es exactamente así, pero me ayuda a comprenderlo

es bastante difícil para una persona que empieza como yo realizar estos cambios, es prácticamente restructurar todo lo ya echo.

Dios mío… Programar siendo disléxico es terrible

Diego diciendo… Vamos al Navegador y ya todo funciona como esperamos…
Mi navegador

no mi ciela

-_-

Wuuooou cada vez me voy sintiendo con mas seguridad y potencial para que mis proyectos queden mejor

Este curso ofrece una perspectiva muy aplia de lo que es la programación y todo lo que puedes hacer con ella, es alucinante.

Aportar imagen al resultado:

else if (inputCapipepo.checked) {
        spanMascotaJugador.innerHTML = inputCapipepo.id
        imagenJugador.innerHTML = `<img src=${capipepo.foto} alt=${capipepo.nombre}>`
        inputCapipepo.checked = false

algunos datos se borran otros se agregan ahí cuando uno se pierde pero ay que prestar mucha atención

“Una sola fuente de la verdad” 👀

Es normal sonreír cada vez que entiendes algo nuevo o solo soy yo?
Que maravilla que es la programación y lo mucho que puede facilitar las cosas (para el cliente, a nosotros nos desarma el cerebro)

<code> 

Este curso es geniall, me encanta esto de las clases!!

Anteriormente llamaba la mascota del jugador y del enemigo en la segunda pantalla para escoger el ataque, como el código cambió por el tema de optimización, no sabia como llamarlo, así que decidí crear una funcion para obtener la imagen/foto del jugador y del enemigo.

Les muestro la implementación y el uso cuando la llamo para traer la información correspondiente:

El nombre de este concepto “Una sola fuente de la verdad” es muy épico. 💪🌿

la fuente de verdad es el ciclo for donde están todos los elementos iterados que necesitamos para hacer las comparaciones.

Tambie se pudo realizar el mismo bloque de codigo que se utilizo para generar las tarjetas en la parte de preguntar que label esta checke:
Solo se ingresaria los imputs creados por medio del .forEach en un nuevo array, y utilizar el mismo metodo, para que cada vez que se ingrese un nuevo Mokepon, se genere un if(mokepon.checked) por cada mokepon dado de alta, me doy a entender? yo me entiendo jajaja 😂