Cita:
Iniciado por demurral96 Soy estudiante de ingeniería desoftware y apenas es mi segundo cuatrimestre por lo tanto todavía no se mucho ni domino esto de la programación.
Conozco chavales de 15 años que se hacen sus progamitas en Java... que estés en un curso X no implica que tus conocimientos tengan que ser necesariamente escasos.
Te lo comento porque intentar excusarte con este tipo de argumentos no te va a aportar nada.
Bueno, vamos a por tu código. Voy a ponerme un poco en modo
profe así que espero que mis comentarios los veas desde una perspectiva crítica no despectiva.
La primera regla de todo programa es que este ha de ser legible. Esto implica que las variables y los objetos usados en el programa han de tener nombres lo más descriptivos posibles.
Estas 4 líneas de código de ejemplo violan completamente el párrafo anterior:
- ¿Por que c? ¿Tanto cuesta poner carta?
- ¿Qué demonios es x? ¿No será por algún casual el número de la carta?
- ¿Y signo? No sabía que las cartas tenían signo. Espera... ¿No será que signo representa el palo?
Por otro lado, tenemos que una baraja tiene 4 palos diferentes: Oros, Copas, Espadas y Bastos. Aquí podría perfectamente usarse un enum y no tener que repetir una ristra tremendamente legible de 155, 156, 157 y 159. Si luego quieres cambiar el caracter asociado te toca hacer 13 sustituciones para que el programa siga funcionando:
Código C:
Ver originalenum Palos
{
PaloNoValido, // Para posibles errores
Oros, // O Diamantes
Copas, // O Trébol
Espadas, // O Picas
Bastos // O Corazones
};
typedef enum Palos Palos;
struct Carta{
int valor;
Palos palo;
};
typedef struct Carta Carta;
char GetPalo(Palos palo)
{
char toReturn = 0;
switch( palo )
{
case Oros:
toReturn = 155;
break;
case Copas:
toReturn = 156;
break;
case Espadas:
toReturn = 157;
break;
case Bastos:
toReturn = 158;
break;
}
return toReturn;
}
Aunque pueda parecer una chorrada hay convenciones que conviene adquirir. En el caso de C, las macros, por motivos históricos, se han escrito siempre en mayúsculas para diferenciarlas de las variables y funciones. En tu caso tarjetas debería estar en mayúsculas:
Por otro lado se asume que cada jugador va a manejar cartas. Esta parte del programa la puedes enfocar de dos formas diferentes:
- Solo hay una lista de cartas y a cada jugador le facilitas un puntero (puntero o índice a la posición) a las cartas que posea.
- Cada jugador recibe una copia de las cartas.
En tu caso has optador por una tercera vía que es que cada jugador tiene únicamente ¿un
char? de cartas. ¿Qué pretendes almacenar en el
char? Si es el índice al mazo entonces char no es la opción recomendable por semántica. Si pretendes almacenar una copia de la carta
char se te queda corto.
Código C:
Ver original// Almacenar punteros
Carta* jugador1[TARJETAS] = {0};
// Almacenar índices
int jugador1[TARJETAS] = {-1};
// Almacenar copia (ojo)
Carta jugador1[TARJETAS] = {};
Almacenar punteros o índices es sencillo porque para descartar una carta basta con asignar a ese elemento valor no válido (puntero=0 o índice=-1) para saber qué elemento hay que sustituir. En el caso de las copias necesitarías crear una carta especial para reconocerla y poder descartar correctamente.
Yo no soy demasiado amigo de tener los valores escritos a pelo en medio del código... y si es una baraja entera menos aun. Para generar el mazo de cartas yo te propondría usar símplemente un array de enteros de 0 a 52. Conocer el valor de la carta o el palo dado su índice es bastante sencillo:
Código C:
Ver original#define NUM_CARTAS 52
int GetValorCarta(int indice)
{
return (indice%13) + 1;
}
Palos GetPaloCarta(int indice)
{
Palos toReturn = PaloNoValido;
switch( indice/13 )
{
case 0:
toReturn = Oros;
break;
case 1:
toReturn = Copas;
break;
case 2:
toReturn = Espadas;
break;
case 3:
toReturn = Bastos;
break;
}
return toReturn;
}
int main()
{
int mazo[NUM_CARTAS];
for(int i=0; i<NUM_CARTAS; i++)
mazo[i] = i;
}
Para mezclar las cartas lo más sencillo puede ser programar una serie de intercambios. Puedes, por ejemplo, recorrer la baraja 3 veces y en cada pasada vas intercambiando la carta actual con otra elegida al azar:
Código C:
Ver original#include <time.h>
#include <stdlib.h>
// Macro para intercambiar valores
#define SWAP(a,b) { int c=a; a=b; b=c; }
void barajar(int mazo[NUM_CARTAS])
{
for(int i=0; i<3; i++ ) // Recorremos 3 veces el mazo
{
for(int j=0; j<NUM_CARTAS; j++ ) // Iteramos cada carta
{
// Elegimos otra carta al azar
int otra
= rand()%NUM_CARTAS
;
// intercambiamos las cartas
SWAP(mazo[j],mazo[otra]);
}
}
}
Juntando todo lo dicho anteriormente tendríamos algo tal que:
Código C:
Ver original#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define TARJETAS 5
#define NUM_CARTAS 52
// Macro para intercambiar valores
#define SWAP(a,b) { int c=a; a=b; b=c; }
enum Palos
{
PaloNoValido, // Para posibles errores
Oros, // O Diamantes
Copas, // O Trébol
Espadas, // O Picas
Bastos // O Corazones
};
// Para convertir fácilmente cada palo a cadena
const char* PalosToString[] = { "", "Oros", "Copas", "Espadas", "Bastos" };
typedef enum Palos Palos;
int GetValorCarta(int indice)
{
return (indice%13) + 1;
}
Palos GetPaloCarta(int indice)
{
Palos toReturn = PaloNoValido;
switch( indice/13 )
{
case 0:
toReturn = Oros;
break;
case 1:
toReturn = Copas;
break;
case 2:
toReturn = Espadas;
break;
case 3:
toReturn = Bastos;
break;
}
return toReturn;
}
void barajar(int mazo[NUM_CARTAS])
{
for(int i=0; i<3; i++ ) // Recorremos 3 veces el mazo
{
for(int j=0; j<NUM_CARTAS; j++ ) // Iteramos cada carta
{
// Elegimos otra carta al azar
int otra
= rand()%NUM_CARTAS
;
// intercambiamos las cartas
SWAP(mazo[j],mazo[otra]);
}
}
}
int main()
{
int mazo[NUM_CARTAS];
for(int i=0; i<NUM_CARTAS; i++)
mazo[i] = i;
barajar(mazo);
for( int i=0;i<NUM_CARTAS;i++)
{
int valor = GetValorCarta(mazo[i]);
Palos palo = GetPaloCarta(mazo[i]);
printf("%d de %s\n", valor
, PalosToString
[palo
]); }
int jugador1[TARJETAS] = {-1};
int jugador2[TARJETAS] = {-1};
int jugador3[TARJETAS] = {-1};
int jugador4[TARJETAS] = {-1};
}
Creo que este es un buen punto para retomar tu ejercicio.
Un saludo.