Introducción a C++

1

Todo lo que aprenderás sobre C++

2

¿Qué es programar y por qué aprender C++?

Conceptos Generales de C++

3

La Historia de C++ y sus diferencias con C

Preparando el entorno de trabajo

4

Instalando Codeblocks

5

Pasos para instalar en mac

6

Ejecutando nuestro primer programa

7

¿Qué son las librerías STD? - Portada del Proyecto

Manejo de memoria

8

¿Qué es la memoria y tipos de datos?

9

Alojando variables en memoria

10

¿Cómo usar operadores?

11

¿Qué son los apuntadores?

12

Reto: Escribir un programa que calcule áreas.

Entrada de datos y funciones

13

¿Cómo introducir datos a nuestro programa?

14

¿Cómo usar condicionales?

15

Usando condicionales

16

¿Cómo encapsular código en funciones ?

17

¿Qué son los parámetros y como usarlos?

18

Reto: Juego narrativo implementando condicionales y entrada de datos.

Loops y arreglos

19

¿Qué son los arreglos?

20

¿Qué son los Loops?

21

Programando Loops

22

Loops , arreglos y arreglos bidimensionales

23

Dibujando el mapa de nuestro juego con arreglos

24

Manipulando mi jugador con inputs en arreglos unidimensionales

25

Arreglos bidimensionales

26

Reto: Moviendo a mi personaje en mi arreglo bidimensional

Lectura de Archivos

27

Creando y leyendo un archivo externo

28

Leyendo archivos externos

29

Reto: En el mapa, crear punto de inicio y salida del jugador

Programación Orientada a Objetos

30

¿Qué es POO?

31

Definiendo una clase y creando sus instancias

32

Encapsulación

33

Abstracción

34

Herencia

35

Propiedades de clase en herencia

36

Polimorfismo

Finalizando nuestro proyecto

37

Creación de personaje y archivo de encabezado

38

Moviendo mi personaje con entrada de datos

39

Mapa

40

Interacción entre el personaje y el mapa

41

Paredes

42

Optimizando trazado de mapa

43

Colisiones

44

Creando nuestra portada de juego

45

Tesoro y victoria

46

Conclusiones

47

Proyecto final

Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Optimizando trazado de mapa

42/47
Recursos

Aportes 31

Preguntas 6

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

El id es de tipo char (caracter), asi que no se imprimirá cero sino el caracter cuyo código ascii es 0 (el cual es NULL pero es un caracter que no se imprime). Se podría modificar asi: PlayerCell->id = '0';

Dejo esto comentario para las personas que llegaron a este punto y les sucedió el mismo error que a todas las personas de abajo (que algunas pudieron solucionar y otras no): “A mi me pasó lo mismo, pasé horas sin poder solucionarlo y hasta borre el proyecto pero, jugando una partida de LOL con una amiga y charlando de programación (ella es frontend así que me entendía jaja) me dijo: te vas a dejar ganar?” Así que decidí repasar los temas sobre punteros, creación y lectura de archivos y arreglos. Hoy volví con este vídeo y PUM! Entendía mejor las cosas, hay cosas que decidí hacerlas a mi manera y logre terminar el vídeo sin errores y con los mismos resultados. PERMITITE FRUSTRARTE PERO NO TE RINDAS!! 😉

Para los que no se fijaron bien y les pasa que los ceros desaparecen, Recuerden cambiar el Cero que esta solo a tipo carácter encerrandolo en comillas simples, que aunque en los comentarios de abajo está la solución no está de más decirles.

Como recordatorio los caracteres en blanco o vacíos se representan de diferente forma en Windows y Linux, quizás macOS y BSD funcionen de la misma forma que Linux.

  • En Windows se representa con el número cero 0, no el carácter ‘0’.
variable = 0;
  • En Linux se puede hacer uso de un espacio entre comillas simples: ’ ’
variable = ' ';

tambien me queda igual al final 😦 tengo horas tratando de resolver el bug

hasta luego , gracias platzi por esta oportunidad 😄 , ahora conquistare unreal engine

Chicos ya solucione el problema de una forma muy divertida, en vez de preguntarme con que llenar el valor detectado por el apuntador en la lectura del archivo, solo coloque un ’ ’ (un espacio entre comillas) y funciona de maravilla, jajajajaja, como todos estaban diciendo que se tardaron horas me asuste, pero solo use ese truco y me salio, me tarde 2 minutos, jajajjaja les dejo mi código ❤️
Es aqui donde hice los cambios:
GameMap.cpp

#include "GameMap.h"
#include <iostream>
#include <fstream>

using namespace std;

GameMap::GameMap()
{
    //ctor
    PlayerCell = NULL;
    LoadMapFromFile();
}
void GameMap::Draw()
{
    for(int i = 0; i < 15 ; i++)
    {
        for(int p = 0;p < 10; p++)
        {
            cout<<cells[i][p].id;
        }
        cout<<endl;
    }
}

void GameMap::SetPlayerCell(int PlayerX, int PlayerY)
{
    if(PlayerCell != NULL)
    {
        PlayerCell->id = ' ';
    }

    PlayerCell = &cells[PlayerX][PlayerY];
    PlayerCell->id = 'S';
    //cout<<"Las coordenadas del jugador son: "<<PlayerX<<","<<PlayerY<<endl;
}

void GameMap::LoadMapFromFile()
{
    /*ofstream FileCreated("Map.txt");

    if(FileCreated.is_open()){

    }else{
    cout<<"ERROR : MAP FILE COULD NOT BE CREATED"<<endl;
    }
    */
    string line;
    int row = 0;
    ifstream MyFile("Map.txt");

    if(MyFile.is_open())
    {
        while(getline(MyFile,line))
        {
            for(int p = 0;p<line.length();p++)
            {
                if(line[p] == '0')
                {
                    cells[row][p].id =' ';
                }else
                {
                    cells[row][p].id = line[p];
                }
            }

            row++;
        }
    }else{
        cout<<"ERROR : MAP FILE COULD NOT BE LOADED"<<endl;
    }
}


Hack 😄, deja el simbolo de tu personaje en numero 3, y tendras este resultado

Tenia un error en el que me salia; getline no esta definido, lo solucione reiniciando el codeblocks.

Tengo un bug que cuando imprime el mapa con el for, no me pinta los 0 y se corren los 1 que estan en la ultima posicion de las filas hacia la izquierda y queda asi

1111111111111
11
11
11
11111111111111

Alguna solucion?

Mi programa tiene este error

Propongo en vez de usar el molesto cin mas un Enter, la función _getch() de la librería estándar conio.h

Cool

ahrrrggg me faltan 5 min antes de que se acabe platzi day

Creo que seria mejor a igualarlo como espacio en blanco, en vez de un entero 0 al caracter:

#include "GameMap.h"
#include <iostream>
#include <fstream>

using namespace std;

GameMap::GameMap()
{
    PlayerCell = NULL;
    loadMapFromFile();
}

GameMap::~GameMap()
{
    //dtor
}
void GameMap::draw() {
    for( int i = 0; i < 15; i++ ) {
        for( int j = 0; j < 10; j++ ) {
            cout << cells[i][j].id;
        }
        cout << endl;
    }
}

void GameMap::setPlayerCell( int px, int py ) {
    //cout << "Las cordenadas del jugador estan en " << px << ", " << py << endl;

    if( PlayerCell != NULL ) {
        PlayerCell->id = ' ';
    }

    PlayerCell = &cells[px][py];
    PlayerCell->id = '3';

}

void GameMap::loadMapFromFile() {

    /*ofstream fileCreated("Map.txt");

    if ( fileCreated.is_open() ) {

    }
    else {
        cout << "Error, Map file could't be created";
    }*/


    string line;
    ifstream myFile("map.txt");
    int row = 0;

    if ( myFile.is_open() ) {
        while ( getline( myFile, line ) ) {
            for ( int p = 0; p < line.length(); p++ ) {
                if ( line[p] == '0' ) {
                    cells[row][p].id = ' ';
                }
                else {
                    cells[row][p].id = line[p];
                }

            }
            row++;
        }
    }

    else {
        cout << "ERROR: Map file couldn't be loaded" << endl;
    }
}

line,length()
no tenia idea de esa funcion yo usaba esto

    if (ArchivoMapa.is_open())                {
        while(getline(ArchivoMapa,linea))     {
            for (int i = 0;linea[i] != NULL;i++){//asi lo hacia y funciona
                    CeldaDelMapa[Salto][i].ID = linea[i];}
            Salto++;                          }}}```

Teoría del problema del “pintado”:

Creamos el mapa, asignamos la ubicación del Player y asignamos su símbolo en la ubicación correspondiente, pero al cambiar de posición, nunca hicimos un proceso para indicar que la posición “vacía” iba a asignársele otra vez el simbolo ‘0’

Tengo una duda, En el minuto 1:13, como es posible que la función Getline(), la cual tengo entendido que se ejecuta en cada vuelta del ciclo While, sepa cual linea debe obtener, es decir, es llamada en instancias diferentes y sabe que: en la segunda iteración del loop While debe leer la segunda linea y así sucesivamente, ¿Alguien sabe como funciona?, intente buscar información y no pude encontrarla 😕

Me sale un error: getline no esta definido}

hecho

#include "Gamemapa.h"
#include <iostream>
#include <fstream>

using namespace std;


Gamemapa::Gamemapa()
{
playercell = NULL;
CargadeArchivo();
}



void Gamemapa::drawmap()
{
    for(int i =0; i < 15; i = i + 1 )
    {


    for(int p =0; p < 10; p = p + 1 )
    {
        cout << celdas[i][p].id;// i dibuja las columnas mientras p las filas
    }
cout << endl;
    }


}
//recibe el player X y Y, por lo tanto habra que ponerla en nuestro main()
void Gamemapa::setplayer(int playerx, int playery)

{
    if(playercell != NULL)
    {
        playercell->id= 0;
    }
playercell = &celdas[playery][playerx];
playercell->id= '3'; //id es un apuntador
/*estamos consiguiendo de nuestro arreglo de celdas la direcion de una de ellas, en este caso la de nuestro jugador
y la guardamos en una variable sin tener que iterar con las demas
*/

}

void Gamemapa::CargadeArchivo()
{
/*

ofstream archivocreado("map.txt");

 if(archivocreado.is_open())
 {

 }

 else
{
     cout << "el archivo no pudo cargarse"<<endl;

}
*/

string line; /*esta linea va a estar cargando cada linea de mi archivo,
las strings son uniones o arreglos de caracteres.*/
int fila=0;//linea
ifstream  Myfile("map.txt"); //entrada de flujo de datos

if(Myfile.is_open())

{
while(getline(Myfile,line))
{for(int j =0; j <10; j = j + 1) //line.length es una funcion de las strings que regresa el largo de la linea
{

    if( line[j]== '0')
    {


celdas[fila][j].id = 0;  /*primero s e agarra el primer lugar de la celda y se iguala con el primer caracter del archivo
 fila es el renglon mientras
 j las */

    }

    else
{celdas[fila][j].id = line[j];  }
  //cuando termina se le suma un renglo para seguir con las demas filas
}
  fila++;

}
}
else
{
    cout << "el archivo no pudo cargarse"<<endl;
}

}```

Cuando se cambio de entero a char, tambien hay que modificar el metodo “setPlayerCell” para que le ponga un char en vez de un entero

Creo que tiene que ver con la iniciación de la variable PlayerCell = Null entonces cada que cambiamos de posición, la posición anterior ya no se rellena con nada.

Mi teoría de por que se pinta en el mapa es por que se ocupa llamar a la función de LoadMap() en el while() que esta en nuestro main()

Seguí el vídeo al pié de la letra y tuve el mismo error que las personas de abajo. Intente solucionarlo y no pude. Miré con detalles el vídeo y no entiendo como a mi me desaparece el mapa y al profesor no. Seguiré practicando los conceptos y los ejercicios anteriores para no perder los conceptos. Se vuelve agotador cuando pasa este tipo de cosas, si a alguien le pasa como a mi, yo voy a retomar estos vídeos más adelante. Quizás esto es muy avanzado para mi… voy a seguir reforzando el aprender bien las bases de la programación.

Por el tipo de variable que acabamos de usar, char = 0 es un espacio vacío

Para que sea más elegante su código pueden usar las evaluaciones ternarias en C++. Como lo pueden ver dentro del for. Les dejo más info aquí: https://www.programiz.com/cpp-programming/ternary-operator#:~:text=Ternary Operator in C%2B%2B,is true %2C expression1 is executed.

Si le ponen pausa no sigo, jajaja, obvio, jaja

excelente curso muy bueno para seguir la ruta del aprnedizaje

gracias!

Gracias!

Los ceros desaparecen porque igualamos la celda a 3 que es un entero int a celdas donde se estan trabajando con caracteres char