Iniciando en C++: La Gran Hada del Poder

He sido un gamer toda mi vida, muchos de los mejores recuerdos que tengo en mi vida son con un control en la mano desde que tenia 4 años, por lo que veras que no puedo explicar de forma sencilla el impacto que los videojuegos han tenido en mi.

Si bien, empece a jugar a muy temprana edad en las consolas de mis amigos, como el Atari 5200 y el NES, puedo decir que mi mayor impacto como fanático lo recibí al ver a mi hermano mayor jugar The Legend Of Zelda: A Link To The Past en el Super Nintendo de un primo; el impacto que tuve en mi infancia de ver algo tan complejo en una consola me dejo sin aliento. Fue tanto el amor que desarrolle por la saga de Zelda que uno de los puntos mas importantes de mi adolescencia fue la espera por el lanzamiento de Ocarine Of Time en el Nintendo 64, a pesar de que mis expectativas de poder comprarlo era nulo.

Entre las tantas cosas que pudiese recalcar sobre la maravilla que son los juegos de Zelda, creo que uno de los puntos que mas me llamo la atención originalmente fue la capacidad que te daba A Link To The Past de nombrar a tu personaje, es decir, aunque el nombre oficial del héroe de los juegos es “Link“, un aspecto importante de la saga es la capacidad de otorgar un nombre que te identifique como jugador.

Nada de esto tiene una importancia real sobre nuestro tutorial o C++, excepto que este es un excelente ejercicio para el que he escogido como nuestro siguiente ejercicio.

La Gran Hada del Poder

La Gran Hada del Poder

La Gran Hada del Poder

La Gran Hada del Poder es un personaje que podemos conseguir en los juego de Ocarine of Time y Majora’s Mask, su función es otorgar al jugador el ataque circular con la espada.

Cuando encontramos a este personaje por primera vez, ella nos recibe con el siguiente discurso (extraído del guion del juego)

Bienvenido, {Link}! Yo soy la
Gran Hada del Poder!{NEXT}
Voy a otorgarte una nueva técnica de la espada.{NEXT}
Recibela ahora!
{END}

Como vemos, esta conversación tiene un par de características interesantes, el primero y mas obvio es que el nombre {Link} es variante, puede cambiar dependiendo de como el jugador decida llamar a su personaje; el segundo es que la información se van presentando de forma segmentada, es decir primero un bloque de información y al presionar un botón del control de juego debería ir apareciendo el resto por partes (esto corresponde a diferentes animaciones del personaje en el dialogo).

Ahora la pregunta de rigor es, como podemos reproducir este comportamiento en C++?

Veamos ambos requerimientos por partes

Capturando Información del Usuario

Anteriormente hemos utilizado la función std::cout de la librería iostream para mostrar información por pantalla (el Flujo de Salida Estándar), ahora si por el contrario quisiéramos tomar información desde el teclado (el Flujo de Entrada Estándar) podemos utilizar una función incluida en la misma librería llamada std::cin.

Un ejemplo de su funcionamiento seria

int numero;
std::cin>>numero;
std::cout<<numero;

Si estudiamos la sintaxis, podemos ver que la función opera casi como una inversa de cout y que para inyectar la información de la Entrada Estándar a la variable utilizamos el operador >>; esto funciona sin mayor problema con todos los tipos fundamentales, por lo que la lógica, y la experiencia de nuestros ejercicios anteriores, nos dice que si quisiéramos capturar el nombre del jugador deberíamos utilizar algo como

char* nombreJugador;
std::cin >> nombreJugador;
std::cout << nombreJugador;

Pero si intentaste ejecutar esto, recibirás un error de compilación, particularmente te dira que no has inicializado la variable nombreJugador; si intentas modificar la variable de forma inicializada como por ejemplo

char* nombreJugador="";

Igual recibirás un error de tiempo de ejecución del cin al intentar asignar valores a la variable.

Excepcion std::cin

Excepcion std::cin

Por qué ocurre esto?

La respuesta es un poco compleja, pero vamos a tratar de simplificarla para ilustrar la idea.

Si revisamos la lista de tipos fundamentales te mencione que char* era uno de ellos, pero en realidad el tipo fundamental es char, al utilizar el asterisco definimos que estamos manejando un arreglo de valores char, es decir, varios valores que se encuentran uno al lado del otro en memoria y a los cuales podemos acceder a través de una misma variable; pues bien, la función cin no puede hacer asignaciones a los diferentes valores de un arreglo, sino a un valor especifico por lo que su ejecución no es exitosa.

Entonces, como podemos hacer para capturar información de una cadena de caracteres?

Pues para esto utilizamos una librería especial llamada string, dentro de la cual conseguimos un tipo de dato llamado std::string.

El Tipo std::string

Es mucho lo que podemos decir sobre la librería string y las funciones que nos ofrece para manipular cadenas de caracteres, pero por hoy vamos a limitarnos a utilizar de forma básica el tipo de dato que nos ofrece para manipular cadenas de caracteres; primero que nada, es muy importante que en el area de declaracion de librerias agreguemos lo siguiente

#include <string>

Esto hará la debida inclusión de los diversos elementos de la librería principalmente el tipo de datos que vamos a utilizar, nuestro código podria ser ahora algo como

std::string nombreJugador;
std::cin >> nombreJugador;
std::cout << nombreJugador;

Si probamos este código vemos que ahora si funciona y que su ejecución ocurre sin inconvenientes.

NOTA: Hay un algo que tenemos que aclarar y es que si bien mencione que std::string era un tipo de datos, en realidad es una clase que maneja datos de secuencias de caracteres, por lo que existen diferentes funciones que podemos utilizar desde la misma variable para cambiar el estado de la misma, pero esto lo veremos a detalle mas adelante.

Segmentar la Ejecución de un Programa

Supongamos que queremos agregar pausas en un programa de manera que la ejecución de dos lineas de código ocurran de manera segmentada, por ejemplo las siguientes lineas se ejecutarían sin interrupción

std::cout<<"Linea 1";
std::cout<<"Linea 2";

Si quisiéramos crear una pausa entre las mismas, de forma tal que sea necesario presionar alguna tecla antes de que la ejecución del programa continué podemos utilizar una función de la librería conio.h llamada _getch() que frena la ejecución hasta que enviemos algún dato a la Entrada Estándar.

Para poder utilizarla es importante agregar al principio del fichero la inclusión

#include <conio.h>

Esto nos permitira agregar el siguiente código a para pausar el programa

std::cout<<"Linea 1";
_getch();
std::cout<<"Linea 2";

La manera en la que esto funciona es que veremos el mensaje “Linea 1” y la consola quedara en pausa hasta que presionemos alguna tecla (enviemos un dato a la Entrada Estándar) y en ese momento se mostrara el mensaje “Linea 2”.

La Gran Hada del Poder – Código Fuente

Pues si has seguido la explicación de los dos conceptos anteriores pudieses intentar resolver el ejercicio por ti mismo (es lo mejor que puedes hacer) pero como siempre vamos a ver el código que resuelve el ejercicio

#include <iostream>
#include <string>
#include <conio.h>

int main()
{
std::string nombreJugador;
std::cout << "Cual es tu nombre? " << std::endl;
std::cin >> nombreJugador;
std::cout << "Bienvenido, "<< nombreJugador <<"! Yo soy la" << std::endl;
std::cout << "Gran Hada del Poder!" << std::endl;
_getch();
std::cout << "Voy a otorgarte una nueva tecnica de la espada." << std::endl;
_getch();
std::cout << "Recibela ahora!"<< std::endl;
_getch();
return 0;
}

Hay algunas maneras en la que puedes hacer este programa mas interesante, pudieses intentar crear una función que tome como parámetro el nombre y muestre el bloque de texto o buscar el resto de los diálogos de las otras hadas y adaptarlos en diferentes funciones.


Ya que hemos hecho ejercicios de entrada y salida de datos y a la vez hemos visto como generar funciones, me gustaría recomendarte un ejercicio bastante bueno para desarrollar tus habilidades en estas áreas: crea una calculadora; escribe un programa con una función para cada una de las operaciones aritméticas básicas. Si bien se desvía un poco de los ejercicios que hemos creado, es un excelente ejercicio para ejercitar tus habilidades.

Como siempre espero haya sido de tu agrado y recuerda que cualquier comentario es bien recibido.

Hasta la próxima.

Anuncios
Esta entrada fue publicada en Blogging y etiquetada , . Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s