Funciones
Hemos llegado a uno de los temas más divertidos desde mi punto de vista, las funciones.
Una función es un conjunto de instrucciones bajo un nombre que nos va a ayudar a reutilizar código y mantenerlo ordenado.
Cuando estamos escribiendo funciones, estamos dividiendo nuestro código en partes más pequeñas y manejables, lo que nos permite reutilizar el código en diferentes partes de nuestro programa.
Una función es la encargada de realizar una acción en nuestro programa, mostrar algo en pantalla, realizar una operación matemática, etc.
Vamos a desarrollar ahora una pelea de Isaac vs The Fallen.


1#include <iostream>23using namespace std;45void shoot() {6cout << "Isaac dispara contra The Fallen: ●" << endl;7}89void enemyHit(string enemy) {10cout << "¡" << enemy << " golpeó a Isaac!" << endl;11}1213int takeDamage(int health) {14return health - 1;15}1617int main() {1819int isaacHealth = 3;20int theFallenHealth = 5;21char answer;222324cout << "¡Isaac entra a una habitación!" << endl;2526while (isaacHealth > 0 && theFallenHealth > 0) {2728cout << "¿Disparar? (s/n): " << endl;29cin >> answer;3031if (answer == 's') {32shoot();33theFallenHealth = takeDamage(theFallenHealth);34}3536cout << "¿Te han dañado? (s/n): " << endl;37cin >> answer;3839if (answer == 's') {40enemyHit("The Falle");41isaacHealth = takeDamage(isaacHealth);42}4344}4546if (isaacHealth == 0) {47cout << "¡Isaac ha muerto!" << endl;48}4950if (theFallenHealth == 0) {51cout << "¡Isaac ha derrotado a The Fallen!" << endl;52}5354return 0;55}
¡Esto es lo más cerca que hemos estado de programar un videojuego! Vamos a explicar el código anterior para que entiendas cómo es que funciona.
Primero declaramos nuestras variables que llevarán el conteo de vida restante de Isaac y The Fallen.
Luego declaramos nuestras funciones que nos van a permitir disparar, recibir daño y mostrar la vida restante.
En el main() declaramos nuestras variables y ejecutamos el ciclo while que se ejecutará mientras Isaac y The Fallen tengan vida.
Dentro del ciclo while preguntamos si Isaac quiere disparar y si lo hace ejecutamos la función shoot() y luego la función takeDamage() para restarle vida a The Fallen.
Luego preguntamos si Isaac ha sido dañado y si lo ha sido, ejecutamos la función enemyHit() y luego la función takeDamage() para restarle vida a Isaac.
Si Isaac ha muerto mostramos un mensaje de que Isaac ha muerto.
Si The Fallen ha muerto mostramos un mensaje de que Isaac ha derrotado a The Fallen.
Retornamos 0 para indicar que el programa ha terminado correctamente.
Las funciones shoot y enemyHit son de tipo void porque no retornan ningún valor, solo ejecutan una acción, en este caso, mostrar un mensaje.
Sin embargo, nuestra función takeDamage(int health) retorna un valor entero que es la vida restante después de recibir daño y además recibe un parámetro, que es la vida actual.
Cuando pasamos el valor de una variable a una función se llama paso por valor, esto significa que estamos pasando una copia de nuestra variable para que la función la utilice y realiza acciones con ese valor, es por eso que la variable original no se modifica y necesitamos asignarla de nuevo para que refleje el nuevo valor, como:
isaacHealth = takeDamage(isaacHealth);
Asignamos el valor retornado por la función a la variable original.Cuando empezaba a programar una de mis primeras dudas se relacionaba con el nombre de las variables que se pasaban como parámetro, por ejemplo, en la función takeDamage(int health), el parámetro se llama health, pero en el main() la variable se llama isaacHealth.
Esto puede ser confuso al principio, pero es importante entender que el nombre del parámetro es sólo una etiqueta interna de la función, no afecta el nombre de la variable que se pasa como argumento.
Es como si le presentaras a tu función un valor con un apodo, el apodo puede llamarse exactamente igual que la variable original o completamente diferente, sin embargo, deberá llamarse igual dentro de la función para poder ser utilizada.
isaacHealth: Deberá llamarse así en toda la función main.
health: Deberá llamarse así en toda la función takeDamage.
Consejos
Usa nombres descriptivos
Los nombres de las funciones y variables deben ser descriptivos y claros, de esta manera otros programadores (o tú en el futuro) podrán entender fácilmente qué hace cada función y variable.
Funciones pequeñas y enfocadas
Mantén tus funciones pequeñas y enfocadas en una sola tarea, es decir, que realicen una sola acción, con esto no nos referimos a separar en funciones múltiples acciones que formen un todo, sino a que cada función tenga un propósito claro y específico.
Funciones válidas:
takeDamage: Se encarga de reducir la vida del personaje.
shoot: Se encarga de disparar.
openChest: Se encarga de abrir un cofre, mostrando el contenido.
Funciones sin sentido:
takeDamageAndShoot: Se encarga de reducir la vida del personaje y disparar, esta función hace dos cosas, lo cual no es recomendable.
isaacXYZ123: No es descriptivo, ya que XYZ123 no indica nada sobre lo que hace la función.
addOneHealth: Existiendo el ++, no es necesario crear una función para agregar 1 a un valor.
Con esto terminamos esta sección sobre funciones, nos ayudará a mantener nuestro código más ordenado en futuros programas que serán cada vez más completos.
