Bienvenidos sean a este post, antes de adentaranos en el proximo tema vamos a hacer un pequeño proyecto.
En este caso vamos a hacer un proyecto de juego de cartas para que despues podamos explicar el siguiente tema, pero para este caso tambien vamos a aplicar todo lo que hemos visto hasta ahora, este proyecto constara de representar una baraja de cartas, para comenzar crearemos un archivo que llamaremos cartas.c y le agregaremos el siguiente codigo:
cartas.c
#include <stdio.h>
#include <string.h>
typedef enum {
oro = 1,
copa,
basto,
espada
} Palo;
typedef enum {
uno = 1, dos, tres, cuatro, cinco, seis,
siete, ocho, nueve, sota, caballo, rey
} Numero;
typedef struct
{
Palo palo;
int valorPalo;
Numero numero;
int valorNumero;
} Carta;
void MostrarCarta(Carta* acarta);
void CartaAString(Carta* aCarta, char aCartaStr[20]);
void IniciarCarta(Carta* aCarta, Palo p, Numero n);
int main()
{
}
Esta es nuestra estructura basica del codigo, obseven que primero definimos un enum donde representaremos a los «palos», los simbolos de cada carta, estos iran de 1 a 4 gracias al enum que los numera por nosotros, despues tenemos otro enum donde estaran los distintos valores que puede haber en cada palo, estos van desde el uno hasta el nueve y luego tenemos la sota que equivale al diez, el caballo al once y el rey al doce, por ultimo tenemos un struct que sera la carta en si, para ello tendremos varias propiedades, la primera sera de tipo Palo, despues un tipo int para el valor que esta relacionado, luego otro de tipo Numero para este y al igual que el caso uno de tipo int para el valor relacionado a este, y la llamaremos Carta, despues tenemos tres prototipos para estas tres acciones respectivamente:
- Mostrar la carta
- Pasar el tipo Carta a Cadena (String)
- Iniciar una Carta
Con esto comentado comencemos con la definicion de los tres prototipos, para ello agregaremos cada uno de los bloques despues del main, comencemos con la definicion de MostrarCarta:
void MostrarCarta(Carta* aCarta)
{
char cadenaCarta[20] = {0};
CartaAString(aCarta, cadenaCarta);
printf("%18s", cadenaCarta);
}
Aqui recibiiremos un apuntador de un objeto de tipo Carta, en este definiremos una cadena vacia de 20 posiciones, luego llamaremos al funcion CartaAString para convertir el tipo Carta a string, para ello pasaremos el objeto recibido y la cadena que definimos anteriormente, por ultimo mostraremos el valor que agregamos a cadenaCarta, nuestro siguiente paso sera agregar la definicion de la funcion que necesitamos en esta, para ello agregaremos el siguiente bloque:
void CartaAString(Carta* aCarta,char aCadenaCarta[20])
{
switch(aCarta->numero)
{
case uno: strcpy(aCadenaCarta, "as "); break;
case dos: strcpy(aCadenaCarta, "dos "); break;
case tres: strcpy(aCadenaCarta, "tres "); break;
case cuatro: strcpy(aCadenaCarta, "cuatro "); break;
case cinco: strcpy(aCadenaCarta, "cinco "); break;
case seis: strcpy(aCadenaCarta, "seis "); break;
case siete: strcpy(aCadenaCarta, "siete "); break;
case ocho: strcpy(aCadenaCarta, "ocho "); break;
case nueve: strcpy(aCadenaCarta, "nueve "); break;
case sota: strcpy(aCadenaCarta, "sota "); break;
case caballo: strcpy(aCadenaCarta, "caballo "); break;
case rey: strcpy(aCadenaCarta, "rey "); break;
default: strcpy(aCadenaCarta, "??? "); break;
}
switch(aCarta->palo)
{
case oro: strcat(aCadenaCarta,"de Oro"); break;
case copa: strcat(aCadenaCarta,"de Copas"); break;
case basto: strcat(aCadenaCarta,"de Bastos"); break;
case espada: strcat(aCadenaCarta,"de Espadas"); break;
default: strcat(aCadenaCarta,"de ????"); break;
}
}
Aqui recibiremos un objeto de tipo Carta (de vuelta en apuntador) y una cadena de 20 caracteres, dentro de bloque tendremos dos switch, el primero nos servira para establecer el valor o numero de la carta, para ello evaluaremos la propiedad numero dentro del objeto Carta (en este caso a traves de su apuntador), dentro de cada case vamos a utilizar una funcion que mencionamos en el post anteiror, en este caso usamos a strcpy para copiar un texto dentro de una cadena, para esta ocasion pasaremos el valor o el nombre de la carta a la cadena que usamos como argumento, tambien tenemos un default por si no se cumple una coincidencia con los casos anteriores, el siguiente switch verifica de que palo es, es decir si pertenece al oro, copa, basto o espada, para ello usamos la propiedad palo dentro del objeto, en cada case evaluaremos a cada uno de ellos pero en esta ocasion usaremos a strcat para concatenar o unir el texto existente con uno nuevo, en este caso le asignaremos una identificacion para el tipo de carta mediante el mensaje de identificacion, tambien tenemos un default por lo mismo que en el otro switch, esta sera la funcion encargada de crear lo que mostraremos en pantalla a traves de la funcion anterior, con todo esto comentado pasemos a definir la ultima funcion mediante el siguiente bloque:
void IniciarCarta(Carta* aCarta, Palo p, Numero n)
{
aCarta->palo = p;
aCarta->valorPalo = (int)p;
aCarta->numero = n;
aCarta->valorNumero = (int)n;
}
Esta sera basicamente para iniciar los valores en el objeto que le pasemos, para ello sera el primer argumento, el siguiente sera el palo de la carta y el ultimo el numero de la misma, observen que para las propiedades palo y numero las asignaamos directamente pero para los casos de los valores hacemos un «casteo» para indicarle el tipo de valor que almacenara, con esto comentado solo nos falta hablar de main, para el cual lo modificaremos de la siguiente manera:
int main()
{
Carta carta;
IniciarCarta(&carta, oro, siete);
MostrarCarta(&carta);
printf("\n");
}
Es la modificacion mas simple porque en este caso primero crearemos el objeto del struct Carta, luego lo iniciaremos por medio de la funcion IniciarCarta, estableciendo los valores y por ultimo llamamos a MostrarCarta, observen que en ambos pasamos la direccion de memoria no el objeto en si porque son apuntadores los que deben recibirlos, con todo esto comentado veamos como que el codigo final:
cartas.c
#include <stdio.h>
#include <string.h>
typedef enum {
oro = 1,
copa,
basto,
espada
} Palo;
typedef enum {
uno = 1, dos, tres, cuatro, cinco, seis,
siete, ocho, nueve, sota, caballo, rey
} Numero;
typedef struct
{
Palo palo;
int valorPalo;
Numero numero;
int valorNumero;
} Carta;
void MostrarCarta(Carta* acarta);
void CartaAString(Carta* aCarta, char aCartaStr[20]);
void IniciarCarta(Carta* aCarta, Palo p, Numero n);
int main()
{
Carta carta;
IniciarCarta(&carta, oro, siete);
MostrarCarta(&carta);
printf("\n");
}
void MostrarCarta(Carta* aCarta)
{
char cadenaCarta[20] = {0};
CartaAString(aCarta, cadenaCarta);
printf("%18s\n", cadenaCarta);
}
void CartaAString(Carta* aCarta,char aCadenaCarta[20])
{
switch(aCarta->numero)
{
case uno: strcpy(aCadenaCarta, "as "); break;
case dos: strcpy(aCadenaCarta, "dos "); break;
case tres: strcpy(aCadenaCarta, "tres "); break;
case cuatro: strcpy(aCadenaCarta, "cuatro "); break;
case cinco: strcpy(aCadenaCarta, "cinco "); break;
case seis: strcpy(aCadenaCarta, "seis "); break;
case siete: strcpy(aCadenaCarta, "siete "); break;
case ocho: strcpy(aCadenaCarta, "ocho "); break;
case nueve: strcpy(aCadenaCarta, "nueve "); break;
case sota: strcpy(aCadenaCarta, "sota "); break;
case caballo: strcpy(aCadenaCarta, "caballo "); break;
case rey: strcpy(aCadenaCarta, "rey "); break;
default: strcpy(aCadenaCarta, "??? "); break;
}
switch(aCarta->palo)
{
case oro: strcat(aCadenaCarta,"de Oro"); break;
case copa: strcat(aCadenaCarta,"de Copas"); break;
case basto: strcat(aCadenaCarta,"de Bastos"); break;
case espada: strcat(aCadenaCarta,"de Espadas"); break;
default: strcat(aCadenaCarta,"de ????"); break;
}
}
void IniciarCarta(Carta* aCarta, Palo p, Numero n)
{
aCarta->palo = p;
aCarta->valorPalo = (int)p;
aCarta->numero = n;
aCarta->valorNumero = (int)n;
}
Ahorra si podemos proceder a compilarlo, ejecutarlo y ver como es su salida:
tinchicus@dbn001vrt:~/lenguajes/C$ ./prog/cartas
siete de Oro
tinchicus@dbn001vrt:~/lenguajes/C$
Como podemos ver esta funcionando perfectamente pero vamos a hacer una ultima modificacion para facilitar nuestro codigo, para ello vamos a crear u un nuevo archivo que llamaremos cartas.h y le agregaremos el siguiente codigo:
cartas.h
typedef enum {
oro = 1,
copa,
basto,
espada
} Palo;
typedef enum {
uno = 1, dos, tres, cuatro, cinco, seis,
siete, ocho, nueve, sota, caballo, rey
} Numero;
typedef struct
{
Palo palo;
int valorPalo;
Numero numero;
int valorNumero;
} Carta;
void CartaAString(Carta* aCarta,char aCadenaCarta[20])
{
switch(aCarta->numero)
{
case uno: strcpy(aCadenaCarta, "as "); break;
case dos: strcpy(aCadenaCarta, "dos "); break;
case tres: strcpy(aCadenaCarta, "tres "); break;
case cuatro: strcpy(aCadenaCarta, "cuatro "); break;
case cinco: strcpy(aCadenaCarta, "cinco "); break;
case seis: strcpy(aCadenaCarta, "seis "); break;
case siete: strcpy(aCadenaCarta, "siete "); break;
case ocho: strcpy(aCadenaCarta, "ocho "); break;
case nueve: strcpy(aCadenaCarta, "nueve "); break;
case sota: strcpy(aCadenaCarta, "sota "); break;
case caballo: strcpy(aCadenaCarta, "caballo "); break;
case rey: strcpy(aCadenaCarta, "rey "); break;
default: strcpy(aCadenaCarta, "??? "); break;
}
switch(aCarta->palo)
{
case oro: strcat(aCadenaCarta,"de Oro"); break;
case copa: strcat(aCadenaCarta,"de Copas"); break;
case basto: strcat(aCadenaCarta,"de Bastos"); break;
case espada: strcat(aCadenaCarta,"de Espadas"); break;
default: strcat(aCadenaCarta,"de ????"); break;
}
}
void IniciarCarta(Carta* aCarta, Palo p, Numero n)
{
aCarta->palo = p;
aCarta->valorPalo = (int)p;
aCarta->numero = n;
aCarta->valorNumero = (int)n;
}
void MostrarCarta(Carta* aCarta)
{
char cadenaCarta[20] = {0};
CartaAString(aCarta, cadenaCarta);
printf("%18s", cadenaCarta);
}
Como pueden ver basicamente pusimos todos los elemetnos de nuestro codigo para poder ser llamados desde este archivo, ahora solo nos resta modificar el archivo cartas.c de la siguiente manera:
cartas.c
#include <stdio.h>
#include <string.h>
#include "cartas.h"
int main()
{
Carta carta;
IniciarCarta(&carta, oro, siete);
MostrarCarta(&carta);
printf("\n");
}
Como pueden ver solamente dejamos el main y agregamos con include el nuevo archivo que debe estar en el mismo directorio que nuestro archivo .c, si lo compilan y prueban deberan tener el mismo resultado anterior, con esto tenemos nuestro codigo terminado solo nos resta comenzar el siguiente tema pero eso sera en el proximo post.
Nota: Si quieren saber mas sobre arcchivos de encabezado o librerias, les recomiendo visitar este post.
En resimen, hoy hemos visto un ejemplo aplicando mucho de lo visto en posts anteriores pero que nos servira para poder explicat algunos temas que se iran complicando un poco mas, en este caso no solo repasamos enum, struct y cadenas (string) sino que tambien lo establecimos como libreria, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
