Quote Originariamente inviata da torn24 Visualizza il messaggio
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;
}
Ciao! Sfortunatamente sono ancora io Ho controllato la tua proposta per il programma e ho capito il tuo funzionamento logico, il quale mi sembra giusto. Il programma non funziona, così l'ho analizzato col debugger e i watches attivi per controllare tutti i valori delle singole variabili. Da quel che ho capito, il problema sta nella variabile "short partitegiocaotori[N]", che anche se subito dopo viene avviato il comando, non si inizializza mai a 0. Ho provato a fare di tutto per cercare di inizializzarla, anche creandola come matrice, ma non ne vuole sapere. Per colpa di questa variabile non inizializzata ovviamente non parte il ciclo del flag, creando un loop infinito nel serteggio (ho messo un printf per il valore di y per controllare e infatti il programma non termina mai, ma continua a sorteggiare la y all'infinito). Se avresti una soluzione/proposta a tale problema te ne sarei enormemente grato, grazie!