Salve a tutti,
avevo intenzione di creare uno script per la creazione automatica di vari schemi del sudoku rispettando chiaramente la disposizione dei numeri rispetto alle righe,colonne e regioni (le 9 tabelle 3x3). Il problema è che il mio algoritmo riempe gli 81 elementi dell'array di 0 e non so dove ho sbagliato.

Vi allego il codice dello script :
codice:
window.onload = function (){




    sudoku = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
    contatore = 0;
    arrayControllo = [];
    possibiliNumeri = [1,2,3,4,5,6,7,8,9];


    creaSudoku();
    visuaSudoku();
} 




function creaSudoku() {
   
    var errore;
    var num;
    var possibiliNumeri2;
    var i;
    if (sudoku.length < 81){
        if (possibiliNumeri.length == 0){
            sudoku[contatore] = 0;
            contatore--;
            creaSudoku();
        }
        else{
                do {
                     errore = false;
                     num = Math.floor((Math.random() * 9) + 1);


                    for (i = 0; i<arrayControllo.length-1; i++){
                        if (arrayControllo[i] == num) errore = true
                    }  
                } while (errore == false)


                switch(true){                 //controllo righe
                    case (contatore < 9):
                        for (i = 0; i<9; i++){
                            if (sudoku[i] == num) errore = true;                
                        }
                    case (contatore >= 9 && contatore < 18 ):
                        for (i = 9; i<18; i++){
                            if (sudoku[i] == num) errore = true;  
                        }
                    case (contatore >= 18 && contatore < 27 ):
                        for (i = 18; i<27; i++){
                            if (sudoku[i] == num) errore = true;  
                        }
                    case (contatore >= 27 && contatore < 36 ):
                        for (i = 27; i<36; i++){
                            if (sudoku[i] == num) errore = true;  
                        }
                    case (contatore >= 36 && contatore < 45 ):
                        for (i = 36; i<45; i++){
                            if (sudoku[i] == num) errore = true;  
                        }  
                    case (contatore >= 45 && contatore < 54 ):
                        for (i = 45; i<54; i++){
                            if (sudoku[i] == num) errore = true;  
                        } 
                    case (contatore >= 54 && contatore < 63 ):
                        for (i = 54; i<63; i++){
                            if (sudoku[i] == num) errore = true;  
                        }  
                    case (contatore >= 63 && contatore < 72 ):
                        for (i = 63; i<72; i++){
                            if (sudoku[i] == num) errore = true;  
                        } 
                    case (contatore >= 72 && contatore < 81 ):
                        for (i = 72; i<81; i++){
                            if (sudoku[i] == num) errore = true; 
                        }                                                                                        
                }


                switch(contatore % 9){                 //controllo colonne
                    case (0):
                        for (i = 0; i<9; i++){
                            if (sudoku[(i*9)+contatore % 9] == num) errore = true;                
                        }
                        break;
                    case (1):
                        for (i = 9; i<18; i++){
                            if (sudoku[(i*9)+contatore % 9] == num) errore = true;                
                        }
                        break;                      
                    case (2):
                        for (i = 18; i<18; i++){
                            if (sudoku[(i*9)+contatore % 9] == num) errore = true;                
                        }
                        break;                        
                    case (3):
                        for (i = 27; i<36; i++){
                            if (sudoku[(i*9)+contatore % 9] == num) errore = true;                
                        }
                        break; 
                    case (4):
                        for (i = 36; i<45; i++){
                            if (sudoku[(i*9)+contatore % 9] == num) errore = true;                
                        }
                        break;
                    case (5):
                        for (i = 45; i<54; i++){
                            if (sudoku[(i*9)+contatore % 9] == num) errore = true;                
                        }
                        break;
                    case (6):
                        for (i = 54; i<63; i++){
                            if (sudoku[(i*9)+contatore % 9] == num) errore = true;                
                        }
                        break; 
                    case (7):
                        for (i = 63; i<72; i++){
                            if (sudoku[(i*9)+contatore % 9] == num) errore = true;                
                        }
                        break; 
                    case (8):
                        for (i = 72; i<81; i++){
                            if (sudoku[(i*9)+contatore % 9] == num) errore = true;                
                        }
                        break;                                                                                      
                }                



            if (errore == false){
                sudoku[contatore] = num;
                arrayControllo[arrayControllo.length] = num;
                contatore++;
                possibiliNumeri = [1,2,3,4,5,6,7,8,9];
                creaSudoku();
            }
            else{
                var c=0;
                for (i = 0; i < 9; i++){
                    if (possibiliNumeri[i] != num){
                        possibiliNumeri2[c] = num;
                        c++;
                    }
                }
                possibiliNumeri = possibiliNumeri2;
                creaSudoku();
            }


        }
    }


}


function visuaSudoku(){
    var c;
    for (c=0; c<81; c++){
        console.log(sudoku[c]);
    }


}
Grazie mille per l'aiuto P.S. ho tralasciato il controllo delle regioni perchè superavo il numero max di caratteri disponibili