
Originariamente inviata da
torn24
Ciao. premetto che capire il codice di un altro può risultare più complicato che inventarsi una propria
soluzione, perché bisogna capire il ragionamento, l'idea di un altra persona.
Ti propongo una piccola modifica al codice, non ho provato e non so se funziona, ma potresti prendere ugualmente spunto per una soluzione...
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX 32
int main(){
int i, j, p, k, N, y, partitemax;
char s[MAX];
srand(time(NULL));
do {
printf("Inserire numero giocatori: ");
gets(s);
N = atoi(s);
if (N < 4 || N > MAX)
printf("Valore errato: deve essere tra 4 e %d\n", MAX);
} while (N < 4 || N > MAX);
short partitegiocatori[N];
for (i = 0; i < N; i++) {
partitegiocatori[i] = 0;
}
char player[N][MAX];
for (i = 0; i < N; i++) {
printf("Giocatore %d: ", i+1);
gets(s);
if (strlen(s) == 0) {
printf("Nessun giocatore specificato - ripeti\n");
i--;
}
else
strcpy(player[i], s);
}
printf("\nInserire numero partite totali: ");
scanf("%d", &p);
partitemax = p / N;
printf("Per un gioco totalmente equilibrato saranno giocate %d partite", partitemax*N);
for (i = 0; i < (partitemax*N); i++) {
char a[4][MAX];
for (j = 0; j < 4; j++)
a[j][0]='\0';
int flag=0;
int estratto=0;
for (j = 0; j < 4; j++) { //Ripete per 4 giocatori
do{ // Ripete finché non viene estratto un numero valido
y = (0 + rand() % N);
for (k = 0; k < 4; k++) { //Verifica che non sia ripetuto nei 4 giocatori
if (K!=J && strcmp(a[k], a[j]) == 0){
estratto=1;
break;
}
else
estratto=0;
}
if(estratto==0 && partitegiocatori[y] < partitemax){
partitegiocatori[y]++;
strcpy(a[j],player[y]);
flag=1; // esce dal do while, il numero estratto è valido
}
else{
continue; // se il numero non è valido perché ha superato partitemax o perché il giocatore è gia estratto
}
}while(flag==0);
flag=0; // metto di nuovo a zero per il prossimo giocatore del for()
}
printf("\n %s - %s VS %s - %s", a[0], a[1], a[2], a[3]);
}
return 0;
}