Buenas noches.
Perdón por haber tardado tanto en contestar pero he estado un poco liado.
He revisado lo que me comentaste y he visto varias cositas.
Por un lado a mi no me dice que existan más jugadores de los que marco, directamente me pone segmentation fault (core dumped). También he visto que no siempre me sale esta alerta. Hay veces que finaliza el programa correctamente diciendo quién ha ganado. Otras dice quién ha ganado pero lo dice mal (la última vez que ocurrió esto contó un trio como pareja y salió otro jugador como ganador debido a esto).
Lo que sí que me he fijado es que normalmente finaliza la función de almacenar resultados correctamente y o bien salta el error al volver al ciclo de incrementar el jugador, o salta el error en la función de determinar ganador.
La verdad esque he estado revisando todo pero no soy capaz de ver donde está el fallo.
Pongo el código a continuación con las cosas que he modificado:
/*Ejercicio 7.13: Determinar cual es la mejor mano de poker */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* prototipos */
void baraja( int wMazo[][ 13 ] );
void reparte( int wMazo[][ 13 ], const char *wCara[], const char *wPalo[], int carta_inicial, int carta_final );
void combinacion_mano( int wMazo[][ 13 ], const char *wCara[], const char *wPalo[], const char *combinacion_simple[], const char *combinacion_doble[], int carta_inicial, int carta_final,int resultados[][9] , int jugador );
void almacena_resultados( int resultados[][9], int num_combinacion_simple, int num_combinacion_doble,int jugador,int numero_carta_simple,int numero_carta_doble);
void determina_ganador(int resultados[][9],int jugadores,const char *combinacion_simple[], const char *combinacion_doble[],const char *cara[]);
int main()
{
/* inicializa el arreglo palo */
const char *palo[ 4 ] = { "Corazones", "Diamantes", "Treboles", "Espadas" };
/* inicializa el arreglo cara */
const char *cara[ 13 ] =
{ "As", "Dos", "Tres", "Cuatro",
"Cinco", "Seis", "Siete", "Ocho",
"Nueve", "Diez", "Jota", "Dama", "Rey" };
const char *combinacion_simple[7] = {"carta mas alta", "pareja", "trio", "poker","escalera", "color", "escalera de color" };
const char *combinacion_doble[3] = {"carta mas alta", "doble pareja","full"};
/* inicializa el arreglo mazo */
int mazo[ 4 ][ 13 ] = {{ 0 }};
int jugadores, jugador;
srand( time( NULL ) ); /* semilla del generador de números aleatorios */
baraja( mazo );
printf("Por favor introduzca el número de jugadores entre 2 y 5: ");
scanf("%d", &jugadores);
int resultados[5][9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1};// arreglo que guarda los resultados //
for (jugador = 0; jugador < jugadores; jugador++)
{
printf("\n\nJugador %d\n\n", jugador + 1);
reparte( mazo, cara, palo,1 + (jugador * 5),5 + (jugador * 5) );
combinacion_mano(mazo,cara,palo,combinacion_simple, combinacion_doble,1 + (jugador * 5),5 + (jugador * 5), resultados, jugador );
}
determina_ganador(resultados, jugadores, combinacion_simple, combinacion_doble, cara);
return 0; /* indica terminación exitosa */
} /* fin de main */
/* baraja las cartas del mazo */
void baraja( int wMazo[][ 13 ] )
{
int fila; /* número de fila */
int columna; /* número de columna */
int carta; /* contador */
/* elige aleatoriamente un espacio para cada una de las 52 cartas */
for ( carta = 1; carta <= 52; carta++ ) {
/* elije una nueva ubicación al azar hasta que encuentra un espacio vacío */
do {
fila = rand() % 4;
columna = rand() % 13;
} while( wMazo[ fila ][ columna ] != 0 ); /* fin de do...while */
/* coloca el número de carta en el espacio vacío del mazo */
wMazo[ fila ][ columna ] = carta;
} /* fin de for */
} /* fin de la función baraja */
/* reparte las cartas del mazo */
void reparte( int wMazo[][ 13 ], const char *wCara[],
const char *wPalo[],int carta_inicial, int carta_final )
{
int carta; /* contador de cartas */
int fila; /* contador de filas */
int columna; /* contador de columnas */
/* reparte cada una de las 52 cartas */
for ( carta = carta_inicial; carta <= carta_final; carta++ ) {
/* realiza el ciclo a través de las filas de wMazo */
for ( fila = 0; fila <= 3; fila++ ) {
/* realiza el ciclo a través de las columnas de wMazo en la fila actual */
for ( columna = 0; columna <= 12; columna++ ) {
/* si el espacio contiene la carta actual, despliega la carta */
if ( wMazo[ fila ][ columna ] == carta ) {
printf( "%6s de %-9s%c", wCara[ columna ], wPalo[ fila ],
carta % 2 == 0 ? '\n' : '\t' );
} /* fin de if */
} /* fin de for */
} /* fin de for */
} /* fin de for */
} /* fin de la función reparte */
//Determina la combinacion de la mano //
void combinacion_mano( int wMazo[][ 13 ], const char *wCara[], const char *wPalo[],
const char *combinacion_simple[], const char *combinacion_doble[],
int carta_inicial, int carta_final,int resultados[][9],int jugador )
{
int carta; /* contador de cartas */
int fila; /* contador de filas */
int columna; /* contador de columnas */
int posicion_carta;// contador para el resto de cartas que se comparan en función de la actual //
int numero_cartabase; //numero de la carta actual //
int palo_cartabase; //palo de la carta actual //
int num_combinacion_simple = 0; //combinacion que hay en la mano //
int num_combinacion_doble = 0; // segunda combinación que hay en la mano //
int mano[5] = {0};
int color = 1; // contador para saber si tienes color en la mano //
int escalera = 1; // contador para saber si tienes escalera //
int numero_carta_simple = -1;
int numero_carta_doble;
int carta_mas_alta = 0;
/* reparte cada una de las 52 cartas */
for ( carta = carta_inicial; carta <= carta_final; carta++ ) {
/* realiza el ciclo a través de las filas de wMazo */
for ( fila = 0; fila <= 3; fila++ ) {
/* realiza el ciclo a través de las columnas de wMazo en la fila actual */
for ( columna = 0; columna <= 12; columna++ ) {
/* Determina si hay una combinacion en función de la carta actual */
if ( wMazo[ fila ][ columna ] == carta && mano[carta - carta_inicial ] == 0 )
{
numero_cartabase = columna;
palo_cartabase = fila;
if(carta == carta_inicial ) // determina si tienes color a partir de la primera carta //
{
for ( posicion_carta = carta + 1; posicion_carta <= carta_final; posicion_carta++ ) {
/* realiza el ciclo a través de las filas de wMazo */
for ( fila = 0; fila <= 3; fila++ ) {
/* realiza el ciclo a través de las columnas de wMazo en la fila actual */
for ( columna = 0; columna <= 12; columna++ ) {
if( wMazo[fila][columna] == posicion_carta )
{
if (fila == palo_cartabase)
{
color++;
if(numero_carta_simple < columna)
numero_carta_simple = columna;
}
if(columna == numero_cartabase + (posicion_carta - 1) )
{
escalera++;
if(numero_carta_simple < columna)
numero_carta_simple = columna;
}
}
}
}
}
} // fin carta == 1 //
if (color != 5 && escalera != 5)// si no hay color ni escalera //
{
if(num_combinacion_simple == 0)
{
for ( posicion_carta = carta + 1; posicion_carta <= carta_final; posicion_carta++ ) {
/* realiza el ciclo a través de las filas de wMazo */
for ( fila = 0; fila <= 3; fila++ ) {
/* realiza el ciclo a través de las columnas de wMazo en la fila actual */
for ( columna = 0; columna <= 12; columna++ ) {
if(carta_mas_alta < numero_cartabase && carta_mas_alta != 0)
{
carta_mas_alta = numero_cartabase;
}
if( wMazo[fila][columna] == posicion_carta && columna == numero_cartabase)
{
num_combinacion_simple++;
numero_carta_simple = numero_cartabase;
mano[posicion_carta - 1] = 1;
}
}
}
}
}// fin if combinacion simple //
else // la combinacion es doble//
{
for ( posicion_carta = carta + 1; posicion_carta <= carta_final; posicion_carta++ ) {
/* realiza el ciclo a través de las filas de wMazo */
for ( fila = 0; fila <= 3; fila++ ) {
/* realiza el ciclo a través de las columnas de wMazo en la fila actual */
for ( columna = 0; columna <= 12; columna++ ) {
if( wMazo[fila][columna] == posicion_carta && columna == numero_cartabase)
{
num_combinacion_doble++;
numero_carta_doble = numero_cartabase;
mano[posicion_carta - 1] = 1;
}
}
}
}
} // fin de else //
}// fin de if si no hay color //
} /* fin de if */
} /* fin de for */
} /* fin de for */
} /* fin de for */
if(escalera == 5) // establece la escalera //
{
num_combinacion_simple = 4;
}
if(color == 5) // Establece el color //
{
num_combinacion_simple = 5;
}
if(escalera == 5 && color == 5) // Establece la escalera de color //
{
num_combinacion_simple = 6;
}
if(num_combinacion_simple == 2 && num_combinacion_doble == 1) // establece la otra posibilidad de full//
{
num_combinacion_doble = 2;
}
if (num_combinacion_doble == 0)
{
printf("\n\nEn esta mano hay %s \n", combinacion_simple[num_combinacion_simple] );
}
else
{
printf("\n\nEn esta mano hay %s \n", combinacion_doble[num_combinacion_doble] );
}
if(num_combinacion_simple == 0)
{
numero_carta_simple = carta_mas_alta;
}
printf("fin combinacion mano\n\n");
almacena_resultados (resultados, num_combinacion_simple, num_combinacion_doble, jugador, numero_carta_simple, numero_carta_doble);
} // fin de la funcion combinacion mano //
// funcion almacena resultados //
void almacena_resultados( int resultados[][9], int num_combinacion_simple, int num_combinacion_doble,int jugador,int numero_carta_simple,int numero_carta_doble)
{
if ( num_combinacion_doble == 0)
{
switch (num_combinacion_simple) {
case 0: resultados[jugador][0] = numero_carta_simple;
break;
case 1: resultados[jugador][1] = numero_carta_simple;
break;
case 2: resultados[jugador][3] = numero_carta_simple;
break;
case 3: resultados[jugador][7] = numero_carta_simple;
break;
case 4: resultados[jugador][4] = numero_carta_simple;
break;
case 5: resultados[jugador][5] = numero_carta_simple;
break;
case 6: resultados[jugador][8] = numero_carta_simple;
break;
} // fin switch //
}// fin if //
else
{
switch (num_combinacion_doble) {
case 1: resultados[jugador][2] = numero_carta_doble;
break;
case 2: resultados[jugador][6] = numero_carta_doble;
break;
}//fin switch//
}// fin else//
printf("fin alamacena resultados\n\n");
}
// funcion determina_ganador //
void determina_ganador(int resultados[][9], int jugadores,const char *combinacion_simple[], const char *combinacion_doble[],const char *cara[])
{
int jugador = 0;
int mejor = -1;
int jugada = 8;
int jugador_ganador1;
int jugador_ganador2 = -1;
int mano_simple = -1;
int mano_doble = 0;
printf("determina ganador\n\n");
while(resultados[jugador][jugada] == -1 && jugador < jugadores)
{
jugador++;
if (jugador == jugadores)
{
jugador = 0;
jugada--;
}
}
mejor = resultados[jugador][jugada];
jugador_ganador1 = jugador;
jugador++;
for(; jugador < jugadores; jugador++)
{
if(resultados[jugador][jugada] == mejor )
{
jugador_ganador2 = jugador;
}
else
{
if(resultados[jugador][jugada] > mejor || resultados[jugador][jugada] == 0 )
{
mejor = resultados[jugador][jugada];
jugador_ganador1 = jugador;
}
}
}
switch (jugada) {
case 0: mano_simple = 0;
break;
case 1: mano_simple = 1;
break;
case 2: mano_doble = 1;
break;
case 3: mano_simple = 2;
break;
case 4: mano_simple = 4;
break;
case 5: mano_simple = 5;
break;
case 6: mano_doble = 2;
break;
case 7: mano_simple = 3;
break;
case 8: mano_simple = 6;
break;
}
if (jugador_ganador2 == -1) // si no hay empate //
{
if(mano_doble == 0) // si es mano simple//
{
if(mano_simple != 5) // si no hay color //
{
printf("\n\nHa ganado el jugador %d con %s de %s\n\n",jugador_ganador1 + 1, combinacion_simple[mano_simple], cara[mejor]);
}
else //hay color//
{
printf("\n\nHa ganado el jugador %d con %s \n\n",jugador_ganador1 + 1, cara[mano_simple]);
}
}
else // si es mano doble //
{
printf("\n\nHa ganado el jugador %d con %s de %s\n\n",jugador_ganador1 + 1, combinacion_doble[mano_doble], cara[mejor]);
}
}
else // hay empate //
{
if(mano_doble == 0) // si es mano simple //
{
if(mano_simple != 5) // si no hay color//
{
printf("\n\nHa habido un empate entre el jugador %d y el jugador %d con %s de %s\n\n",jugador_ganador1 + 1,jugador_ganador2 + 1, combinacion_simple[mano_simple], cara[mejor]);
}
else //hay color//
{
printf("\n\nHa habido un empate entre el jugador %d y el jugador %d con %s\n\n",jugador_ganador1 + 1,jugador_ganador2 + 1, cara[mano_simple]);
}
}
else // si es mano doble //
{
printf("\n\nHa habido un empate entre el jugador %d y el jugador %d con %s de %s\n\n",jugador_ganador1 + 1,jugador_ganador2 + 1, combinacion_doble[mano_doble], cara[mejor]);
}
}
}