Hola a todos, me encuentro en un problema, tengo que hacer un proyecto de juego de poker, donde se entreguen 4 cartas... eso lo hice, pero tengo que repartir 4 cartas a 4 jugadores y que no se repitan entre si las cartas :c
por favor :c alguien que me ayude u.u
miren aqui esta mi codigo
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
int main(){
int i, card=0;
char sel, men[15];
srand(time(NULL));
do{
printf("Juego de cartas al azar...\n");
for(i=1;i<=4;i++)
{
card=1+rand()%52;
//la carta pertenece al mazo de las espadas
if(card<=13)
{
if(card==1)
{
printf("\nLa carta %d es: A ",i);
putchar(6);
}
if(card>1 && card<=10)
{
printf("\nLa carta %d es: %d ",i,card);
putchar(6);
}
if(card==11)
{
printf("\nLa carta %d es: J ",i,card);
putchar(6);
}
if(card==12)
{
printf("\nLa carta %d es: Q ",i,card);
putchar(6);
}
if(card==13)
{
printf("\nLa carta %d es: K ",i,card);
putchar(6);
}
}
//la carta pertenece al mazo de los diamantes
if(card>=14 && card<=26)
{
card=card-13;
if(card==1)
{
printf("\nLa carta %d es: A ",i);
putchar(4);
}
if(card>1 && card<=10)
{
printf("\nLa carta %d es: %d ",i,card);
putchar(4);
}
if(card==11)
{
printf("\nLa carta %d es: J ",i,card);
putchar(4);
}
if(card==12)
{
printf("\nLa carta %d es: Q ",i,card);
putchar(4);
}
if(card==13)
{
printf("\nLa carta %d es: K ",i,card);
putchar(4);
}
}
//la carta pertenece al mazo de los treboles
if(card>=27 && card<=39)
{
card=card-26;
if(card==1)
{
printf("\nLa carta %d es: A ",i);
putchar(5);
}
if(card>1 && card<=10)
{
printf("\nLa carta %d es: %d ",i,card);
putchar(5);
}
if(card==11)
{
printf("\nLa carta %d es: J ",i,card);
putchar(5);
}
if(card==12)
{
printf("\nLa carta %d es: Q ",i,card);
putchar(5);
}
if(card==13)
{
printf("\nLa carta %d es: K ",i,card);
putchar(5);
}
}
//la carta pertenece al mazo de los corazones
if(card>=40 && card<=52)
{
card=card-39;
if(card==1)
{
printf("\nLa carta %d es: A ",i);
putchar(3);
}
if(card>1 && card<=10)
{
printf("\nLa carta %d es: %d ",i,card);
putchar(3);
}
if(card==11)
{
printf("\nLa carta %d es: J ",i,card);
putchar(3);
}
if(card==12)
{
printf("\nLa carta %d es: Q ",i,card);
putchar(3);
}
if(card==13)
{
printf("\nLa carta %d es: K ",i,card);
putchar(3);
}
}
}
printf("\n\n quieres sacar mas cartas?... (y/n)");
sel=getch();
putchar(sel);
if(sel=='y')
system("cls"); // limpia la pantalla de salida
}while(sel!='n');
printf("\n\n");
system("pause");
return 0;
}
Nota: Para poner código, usa las etiquetas GeSHi, gracias.
Una posibilidad para evitar repetir las cartas es crearte un arreglo que contenga todas las cartas. Dado que para el caso has utilizado un identificador que va del 1 al 52 te vale con un arreglo de 52 posiciones y lo rellenas con un for de forma secuencial:
int baraja[52];
for ( i = 0; i < 52; i++ )
baraja[ i ] = i+1;
Después tocaría barajar. Para ello puedes hacer uso de la función 'rand( )'. La idea es realizar permutaciones sobre la baraja para "mezclarla". Algo tal que:
for ( i = 0; i < 52; i++ )
{
int pos = rand( ) % 52;
int temp = baraja[ i ];
baraja[ i ] = baraja[ pos ];
baraja[ pos ] = temp;
}
Y luego, "repartir" puede ser simplemente asignar los valores del arreglo de forma secuencial:
// Cartas jugador 1
int cartas_jug1[ 4 ];
cartas_jug1[ 0 ] = baraja[ 0 ];
cartas_jug1[ 1 ] = baraja[ 1 ];
cartas_jug1[ 2 ] = baraja[ 2 ];
cartas_jug1[ 3 ] = baraja[ 3 ];
// Cartas jugador 2
int cartas_jug2[ 4 ];
cartas_jug2[ 0 ] = baraja[ 4 ];
cartas_jug2[ 1 ] = baraja[ 5 ];
cartas_jug2[ 2 ] = baraja[ 6 ];
cartas_jug2[ 3 ] = baraja[ 7 ];
// ...
Estos códigos se pueden mejorar bastante, la intención era presentar los conceptos de forma clara.
Por cierto, faltaría inicializar el generador de números aleatorios, pero eso ya te toca investigarlo a tí... no te lo voy a dar todo hecho ;)
Un saludo.
Para evitar ese "rosario" de if, yo usaría un par de arrays que recojan el palo y el valor de la carta, algo como:
const char *palo[4] = { "Corazones", "Diamantes", "Treboles", "Picas" };
const char *valor[13] = { "As", "Dos", "Tres", "Cuatro", "Cinco", "Seis", "Siete", "Ocho", "Nueve","Diez", "Jack", "Reina", "Rey" };
donde con las operaciones " % " y " / " obtendría del valor de la carta el palo y su valor.
Y después de barajar, como te comentó anteriormente
eferion, el reparto, suponiendo como planteas cuatro jugadores, haría algo como:
int carta;
for( carta = 0 ; carta < 20; carta++){
if ( carta %10 == 0 )
putchar('\n');
printf("\t%7s de %-9s%c", valor[baraja[carta] % 13], palo[baraja[carta] / 13], ( carta+1 ) %2 == 0 ? '\n' : '\t');
}
para obtener una salida como:
Seis de Corazones Diez de Corazones
Rey de Treboles As de Picas
As de Treboles Nueve de Treboles
Dos de Picas As de Corazones
Dos de Treboles Cuatro de Treboles
Cinco de Corazones Siete de Picas
Reina de Diamantes Siete de Treboles
Diez de Diamantes Jack de Diamantes
Dos de Diamantes Tres de Picas
Reina de Corazones Cuatro de Diamantes
¡¡¡¡ Saluditos! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)