数独生成器

时间:2012-12-16 18:31:41

标签: java generator sudoku

我是一名新手程序员,我正在尝试编写数独生成器 我知道我的代码的外观并不太好 有人能告诉我如何改进它以及如何使我的发电机工作吗?

import java.util.Random;
public class Main {
    static final int n=9;        //taka pomocnicza stala 

    public static int dodawaj(int x){        //dodawanie liczby                   
        if (x==9)
            x=1;
        else x++;
            return x;   

    }
    public static int losowanieliczby(int x){ //losujemy liczbe
            Random r = new Random();
            x=r.nextInt(n)+1;
            return x;
    }
    public static int sprawdzaniepoziom(int indeks, int tab[]){        //sprawdzenie w poziomie
        int czyprawda=1;
        int licznik=(indeks%n); //ile pol ma sie cofac i sprawdzac                
        if (licznik==0) return czyprawda; //wykonywanie sprawdzenia
        else 
            for (int i=indeks-licznik; i<indeks; i++){
                if (tab[indeks]==tab[i]) {return czyprawda=0;}
            }
        return czyprawda;
    }
    public static int sprawdzaniekomorki(int indeks, int tab[]){ //sprawdzenie komorki
        int czyprawda=1;
        if ((indeks%9)%3==0 && (indeks/9)%3==0) return czyprawda;
        if ((indeks%9)%3==1 && (indeks/9)%3==0){ if (tab[indeks]==tab[indeks-1]) return czyprawda=0;} 
        if ((indeks%9)%3==2 && (indeks/9)%3==0){ if (tab[indeks]==tab[indeks-1] || tab[indeks]==tab[indeks-2]) return czyprawda=0;} 
        if ((indeks%9)%3==0 && (indeks/9)%3==1){ if (tab[indeks]==tab[indeks-9] || tab[indeks]==tab[indeks-8] || tab[indeks]==tab[indeks-7]) return czyprawda=0;} 
        if ((indeks%9)%3==1 && (indeks/9)%3==1){ if (tab[indeks]==tab[indeks-1] || tab[indeks]==tab[indeks-10] || tab[indeks]==tab[indeks-9] || tab[indeks]==tab[indeks-8]) return czyprawda=0;}
        if ((indeks%9)%3==2 && (indeks/9)%3==1){ if (tab[indeks]==tab[indeks-1] || tab[indeks]==tab[indeks-2] || tab[indeks]==tab[indeks-11] || tab[indeks]==tab[indeks-10] || tab[indeks]==tab[indeks-9]) return czyprawda=0;}
        if ((indeks%9)%3==0 && (indeks/9)%3==2){ if (tab[indeks]==tab[indeks-9] || tab[indeks]==tab[indeks-8] || tab[indeks]==tab[indeks-7] || tab[indeks]==tab[indeks-18] || tab[indeks]==tab[indeks-17] || tab[indeks]==tab[indeks-16]) return czyprawda=0;}
        if ((indeks%9)%3==1 && (indeks/9)%3==2){ if (tab[indeks]==tab[indeks-1] ||tab[indeks]==tab[indeks-10] || tab[indeks]==tab[indeks-9] || tab[indeks]==tab[indeks-8] || tab[indeks]==tab[indeks-19] || tab[indeks]==tab[indeks-18] || tab[indeks]==tab[indeks-17]) return czyprawda=0;}
        if ((indeks%9)%3==2 && (indeks/9)%3==2){ if (tab[indeks]==tab[indeks-1] ||tab[indeks]==tab[indeks-2]  ||tab[indeks]==tab[indeks-11] || tab[indeks]==tab[indeks-10] || tab[indeks]==tab[indeks-9] || tab[indeks]==tab[indeks-20] || tab[indeks]==tab[indeks-19] || tab[indeks]==tab[indeks-18]) return czyprawda=0;}
        return czyprawda;
    }
    public static int sprawdzaniepion(int indeks, int tab[]){ //sprawdzenie w poionie
            int czyprawda=1;
            int licznik=indeks/n;        
            int y=indeks;
            if (licznik==0) return czyprawda;                
                    else
                            for (int i=0; i<licznik; i++){        
                                    y=indeks-9;
                                    if (tab[indeks]==tab[y]) {return czyprawda=0;}                                        
                            }
            return czyprawda;
    }

    public static class Sprawdzarka{
        static int y=0;                
        static int czyok=0;
        public static  int[]alggeneruj(int tab[], int indeks){        
            czyok=0;
            while(y!=9){
                if (sprawdzaniepoziom(indeks, tab)==0 || sprawdzaniekomorki(indeks, tab)==0 || sprawdzaniepion(indeks, tab)==0){
                    tab[indeks]=dodawaj(tab[indeks]); 
                    y++;
                    alggeneruj(tab, indeks);
                }else{y=0; czyok=1; return tab;}
            }
            y=0; czyok=0; return tab;

        }
    }

    public static void main(String args[]){                        
        int tab[] = new int [n*n];                        
        int indeks=0;                        
        while (indeks!=81){
            tab[indeks]=losowanieliczby(tab[indeks]);                
            tab=Sprawdzarka.alggeneruj(tab, indeks);                        
            if (Sprawdzarka.czyok==0){                                
                indeks--;
                while (Sprawdzarka.czyok!=1) {tab=Sprawdzarka.alggeneruj(tab, indeks);};
            }
            indeks++;
        }
        for (int j=0; j<81; j++){if (j%9==0)System.out.println();
            System.out.print(tab[j]);}


    }



}

1 个答案:

答案 0 :(得分:1)

好的,首先:尝试用英语编码。很难得到你做的和错误的位置。

我注意到的另一件事是,你的public static int sprawdzaniekomorki你可以将你的条件分组,因为你每次都要重新调整它们,只是为了增加另一个条件。写作会更有效:

int returnValue = 1;
if(){
    if(){
        returnValue = x;
    }else{
        returnValue = y;
    }
}
return returnValue;

这也有助于更好地理解代码。 所以,请在代码中添加英文评论(也许看一下eclipse的jAutodoc-Plugin),我也许可以帮忙:)。