/* ---------------------------------------------------------------------- */ /* Probabilidades de los posibles resultados en el Risk cuando el */ /* atacante tira 3 dados y el defensor 2 -- por José A. Cañizo, 6/3/2005 */ /* ---------------------------------------------------------------------- */ #include #include int min (const void *n, const void *m); /* ---------------------------------------------------------------------- */ int main(void) { int i,j,k,l,m; int pierde_defensor = 0; /* Bichos que pierde el defensor */ int pierde_atacante = 0; /* Bichos que pierde el atacante */ int pierde2_atacante = 0; /* Cuantas veces pierde 2 el atacante */ int pierde2_defensor = 0; /* Cuantas veces pierde 2 el defensor */ int empate = 0; /* Cuantas veces se empata */ /* Contar todos los resultados posibles de los dados. */ for(i=1; i<=6; i++) { for(j=1; j<=6; j++) { for(k=1; k<=6; k++) { for(l=1; l<=6; l++) { for(m=1; m<=6; m++) { int dados_atacante[] = {i,j,k}; int dados_defensor[] = {l,m}; int pd; pd = CuantosPierdeDefensor(dados_atacante, dados_defensor, 2); pierde_defensor += pd; pierde_atacante += 2-pd; switch (pd) { case 2: pierde2_defensor++; break; case 1 : empate++; break; case 0: pierde2_atacante++; break; } } } } } } /* Imprimir resultados */ printf("El atacante pierde %i soldados\n", pierde_atacante); printf("El defensor pierde %i soldados\n", pierde_defensor); printf("El defensor pierde 2 %i veces (%f \%)\n", pierde2_defensor, 100 * ((float)pierde2_defensor)/7776); printf("El atacante pierde 2 %i veces (%f \%)\n", pierde2_atacante, 100* ((float)pierde2_atacante)/7776); printf("Empatan %i veces (%f \%)\n", empate, 100*((float)empate)/7776); } /* ---------------------------------------------------------------------- */ /* Devuelve cuantos soldados pierde el defensor. */ /* da -- Resultado de los dados del atacante (tres dados) */ /* dd -- Resultado de los dados del defensor */ /* (numero de dados en n_dados_defensor) */ /* n_dados_defensor -- Numero de dados que usa el defensor */ /* ---------------------------------------------------------------------- */ int CuantosPierdeDefensor(int* da, int* dd, int n_dados_defensor) { /* Ordenarlos de mayor a menor */ qsort(da, 3, sizeof(int), min); qsort(dd, n_dados_defensor, sizeof(int), min); /* Compararlos */ int pierde_defensor = 0; if (da[0] > dd[0]) { pierde_defensor++; } if ((n_dados_defensor > 1) && (da[1] > dd[1])) { pierde_defensor++; } return(pierde_defensor); } /* ---------------------------------------------------------------------- */ int min (const void *n, const void *m) { int *a = (const int *) n; int *b = (const int *) m; if (*a > *b) { return -1; } if (*a < *b) { return 1; } return 0; }