Quando eu estava aprendendo JavaScript, escrevi um jogo Sudoku em JavaScript. Recentemente, li algum conteúdo do Java, então queria criar uma versão Java do jogo Sudoku.
Agora vou compartilhar todo o código e aprender com você. Obviamente, existem vários problemas e deficiências no código. Espero que você critique e me dê alguns conselhos.
A seguir, é apresentado o algoritmo principal para gerar mapas sudoku. O algoritmo não é muito bom, e eu também me referi a algumas idéias online antes:
pacote hlc.shudu.src;/** Sudoku Help Class, que fornece todos os algoritmos necessários para dados*/classe pública shuduhelper {// sudoku mapa matriz private static int [] [] maps = new int [9] [9]; // o número de posições que podem ser colocadas em cada grade de nove metros privada estática int [] canputSum = new int [9]; // Use para armazenar estático colocado anteriormente [] usado = new int [9]; // se a geração do mapa foi concluída estática booleana isok = true; /** Obtenha a matriz de mapa sudoku*/public static int [] [] getMap () {// julga se o mapa foi gerado e regenerado se não for concluído. // Com isso, podemos ver que o algoritmo ainda precisa ser otimizado. Se a backtrack for boa, ela pode ser regenerada através de retrocesso e aqui é regenerada reexecionando o algoritmo de geração. Espero que os amigos interessados possam implementar o seguinte. do {isok = true; initmaps (); } while (! ISOK); retornar mapas; } / * * Inicialize mapas * / private estático void initmaps () {// Inicialize a matriz de mapa sem qualquer número para (int i = 0; i <9; i ++) {for (int j = 0; j <9; j ++) {maps [i] [j] = -1; }} // preencha 1 ~ 9 para (int num = 1; num <= 9; num ++) {for (int i = 0; i <9; i ++) {usado [i] = -1; cancputSum [i] = -1; } // Travessia cada nona grade na grade grande de nove para (int i = 0; i <9; i ++) {if (canputSum [i] ==-1) {canputSum [i] = getCanpanSum (i, num); } if (canputSum [i] == 1) {usado [i] = -1; } if (canputSum [i] == 0) {canputSum [i] = -1; usado [i] = -1; // Se o número de número não puder ser colocado na grade de nove atuais, retorne ao nin anterior se (i> 0) {// limpe a posição onde o num é colocado na grade de nove anos anterior se (usada [i-1]! =-1) {// maps [(int) (Math.floor (usado [i-1]/3)+math.floor ((i-1)/3)*3)] [usou [i-1]%3+((i-1)%3)*3] =-1; clearnum (i - 1, num); } // Eu caio um para trás, porque o cinza para loop adicionará um a i, então 2 é subtraído aqui i -= 2; continuar; } else {isok = false; retornar; }} else {// Coloque o NUM na nona grade atual bandeira booleana = false; while (! flag) {int j = (int) (math.random () * 9); // a coordenada horizontal do pequeno quadrado pequeno int II = (i / 3) * 3 + J / 3; // a coordenada vertical atual do pequeno quadrado int jj = (i % 3) * 3 + j % 3; //System.out.println("num:"+num+"/tii:"+ii+"/tjj:"+jj); // se num pode ser colocado, coloque -se se (mapas [ii] [jj] == -1 && j! = Usado [i] && iscanput (ii, jj, num)) {maps [ii] [jj] = num; usado [i] = j; cancputSum [i] -= 1; bandeira = true; }}}}}}}} / * * Limpe o número no nono grade * / private estático privado clearnum (int i, int num) {for (int j = 0; j <9; j ++) {// The Horizontalinate of the Current Square // A coordenada vertical do pequeno quadrado atual int JJ = (i % 3) * 3 + j % 3; // determinar se o quadrado pequeno atual pode ser colocado se (mapas [ii] [jj] == num) {maps [ii] [jj] = -1; }}} /** Obtenha o número de posições em que o atual cliente de nove pode ser colocado no número num* / private estático int getCanputSum (int i, int num) {int sum = 0; // atravessa o client nove para (int j = 0; j <9; j ++) {// a coordenada horizontal do pequeno quadrado pequeno e atual II = (i / 3) * 3+j / 3; // A coordenada vertical do pequeno quadrado atual int JJ = i % 3 * 3 + j % 3; // determinar se o quadrado pequeno atual pode ser colocado se (mapas [ii] [jj] == -1 && iscanput (ii, jj, num)) {++ sum; }} retornar soma; } / * * Especifique se os pontos de coordenadas horizontais e verticais podem ser colocados NUM * / BOOLEAN PRIVADO PRIVADO ISCANPUT (INT II, Int JJ, int num) {// Determine se o mesmo número da mesma linha ou coluna do ponto de coordenada especificado tem o mesmo número. Se houver, é falso para (int i = 0; i <9; i ++) {if (maps [ii] [i] == num) {return false; } if (maps [i] [jj] == num) {return false; }} retornar true; }}O pacote completo pode ser baixado no github: https://github.com/houlongchao/s
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.