Siccome sto impazzendo (basta vedere l'ora xD), pensavo di aver chiuso col frammento 1 (infatti ho già iniziato col 2), ma mi sono accorto che la mia implementazione di update_wator non andava bene. Mi son messo a rifarla, ma continua a darmi errore di segmentazione. Penso (non ne sono sicuro, ma dato che tutti i test funzionano tranne l'ultimo) che ci sia un errore nella funzione che ho fatto (non so se semantico/sintattico/concettuale) e non nelle altre. In definitiva la posto qua, se per caso qualcuno notasse ad occhio un errore stupido o sapesse dirmi dove sto sbagliando gliene sarei grato (così da poter continuare con il secondo frammento >_ plan -> nrow; ++i){
for(int j=0; j < pw -> plan -> ncol; ++j){
k = i;
l = j;

// PESCI
if (pw->plan->w[j] == FISH){

// PESCE SI RIPRODUCE
if(fish_rule4 (pw, i, j, &k, &l ) == -1){
return -1;
}

// SI E' RIPRODOTTO
if(k != i || l != j){
pw -> plan -> w[k][l] = FISH;
k = i;
l = j;
}

// PESCE SI MUOVE
if(fish_rule3 (pw, i, j, &k, &l ) == -1){
return -1;
}

// SI E' MOSSO
if(k != i || l != j){
pw -> plan -> w[j] = WATER;
pw -> plan -> w[k][l] = FISH;
}
} else {

// SQUALI
if (pw->plan->w[j] == SHARK){

// SQUALO SI RIPRODUCE E MUORE
int a = shark_rule2 (pw, i, j, &k, &l );
if(a == -1){
return -1;
} else {

// SI E' RIPRODOTTO
if(i != k || j != l){
pw -> plan -> w[k][l] = SHARK;
k = i;
l = j;
}

// E' MORTO
if(a == DEAD){
pw -> plan -> w[j] = WATER;
}
}

// SQUALO MANGIA E SI MUOVE
a = shark_rule1 (pw, i, j, &k, &l );
if(a == -1){
return -1;
}

// HA MANGIATO O SI E' MOSSO
if(i != k || j != l){
pw -> plan -> w[j] = WATER;
pw -> plan -> w[k][l] = SHARK;
}
}
}
}
}

// Aggiorno tempo (chronon) e contatori
pw -> chronon++;
pw -> nf = fish_count(pw -> plan);
pw -> ns = shark_count(pw -> plan);
return 0;
}