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';
Introducción a C++
Todo lo que aprenderás sobre C++
¿Qué es programar y por qué aprender C++?
Conceptos Generales de C++
La Historia de C++ y sus diferencias con C
Preparando el entorno de trabajo
Instalando Codeblocks
Pasos para instalar en mac
Ejecutando nuestro primer programa
¿Qué son las librerías STD? - Portada del Proyecto
Manejo de memoria
¿Qué es la memoria y tipos de datos?
Alojando variables en memoria
¿Cómo usar operadores?
¿Qué son los apuntadores?
Reto: Escribir un programa que calcule áreas.
Entrada de datos y funciones
¿Cómo introducir datos a nuestro programa?
¿Cómo usar condicionales?
Usando condicionales
¿Cómo encapsular código en funciones ?
¿Qué son los parámetros y como usarlos?
Reto: Juego narrativo implementando condicionales y entrada de datos.
Loops y arreglos
¿Qué son los arreglos?
¿Qué son los Loops?
Programando Loops
Loops , arreglos y arreglos bidimensionales
Dibujando el mapa de nuestro juego con arreglos
Manipulando mi jugador con inputs en arreglos unidimensionales
Arreglos bidimensionales
Reto: Moviendo a mi personaje en mi arreglo bidimensional
Lectura de Archivos
Creando y leyendo un archivo externo
Leyendo archivos externos
Reto: En el mapa, crear punto de inicio y salida del jugador
Programación Orientada a Objetos
¿Qué es POO?
Definiendo una clase y creando sus instancias
Encapsulación
Abstracción
Herencia
Propiedades de clase en herencia
Polimorfismo
Finalizando nuestro proyecto
Creación de personaje y archivo de encabezado
Moviendo mi personaje con entrada de datos
Mapa
Interacción entre el personaje y el mapa
Paredes
Optimizando trazado de mapa
Colisiones
Creando nuestra portada de juego
Tesoro y victoria
Conclusiones
Proyecto final
Aún no tienes acceso a esta clase
Crea una cuenta y continúa viendo este curso
Aportes 31
Preguntas 6
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.
variable = 0;
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
¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.