Cuando estaba aprendiendo JavaScript, escribí un juego de Sudoku en JavaScript. Recientemente leí contenido Java, así que quería crear una versión Java del juego Sudoku.
Ahora compartiré todo el código y aprenderé de usted. Por supuesto, hay varios problemas y deficiencias en el código. Espero que criticen y me dé algunos consejos.
El siguiente es el algoritmo central para generar mapas de Sudoku. El algoritmo no es muy bueno, y también he referido algunas ideas en línea antes:
paquete hlc.shudu.src;/** clase de ayuda de sudoku, que proporciona todos los algoritmos requeridos para datos*/clase pública shuduhelper {// sudoku map matriz private static int [] [] maps = new int [9] [9]; // El número de posiciones que se pueden colocar en cada cuadrícula de nueve metros private static int [] oputsum = new int [9]; // usar para almacenar previamente static int [] usado = new int [9]; // si la generación de mapas se ha completado boolean estático isok = true; /** Obtenga la matriz de mapa de Sudoku*/public static int [] [] getMap () {// juzga si el mapa ha sido generado y regenerado si no está completado. // De esto podemos ver que el algoritmo aún necesita ser optimizado. Si el retroceso es bueno, se puede regenerar a través del retroceso, y aquí se regenera re-ejecutando el algoritmo de generación. Espero que los amigos interesados puedan implementar lo siguiente. do {isok = true; initMaps (); } while (! ISok); Mapas de regreso; } / * * Inicializar mapas * / private static void initmaps () {// Inicializar la matriz de mapas sin ningún número para (int i = 0; i <9; i ++) {for (int j = 0; j <9; j ++) {maps [i] [j] = -1; }} // Complete 1 ~ 9 para (int num = 1; num <= 9; num ++) {for (int i = 0; i <9; i ++) {usado [i] = -1; CanputSum [i] = -1; } // atraviesa cada novena cuadrícula en la cuadrícula de nueve grandes para (int i = 0; i <9; i ++) {if (oputsum [i] ==-1) {canputSum [i] = getCanputSum (i, num); } if (oputsum [i] == 1) {usado [i] = -1; } if (oputsum [i] == 0) {OvutputSum [i] = -1; usado [i] = -1; // Si el número Número no se puede colocar en la cuadrícula de nueve actual, luego regrese al NIN anterior if (i> 0) {// Borrar la posición donde el NUM se coloca en la cuadrícula de nueve anteriores if (usado [i-1]! =-1) {// mapas [(int) (Math.floor (usado [i-1]/3)+math.floor ((i-1)/3)*3)] [usado [i-1]%3+((i-1)%3)*3] =-1; Clearnum (i - 1, num); } // I Retrocede uno, porque el gris For Loop agregará uno a I, por lo que 2 se resta aquí I -= 2; continuar; } else {isok = false; devolver; }} else {// Poner num en la novena red de cuadrícula actual BOOLEAN BLAG = false; while (! flag) {int j = (int) (math.random () * 9); // La coordenada horizontal del cuadrado pequeño actual int ii = (i / 3) * 3 + j / 3; // La coordenada vertical actual del cuadrado pequeño int jj = (i % 3) * 3 + j % 3; //System.out.println("num:"+Num+"/tii:"+ii+"/tjj:"+jj); // Si se puede colocar num, coloque if (maps [ii] [jj] == -1 && j! = Usado [i] && iscanput (ii, jj, num)) {maps [ii] [jj] = num; usado [i] = j; CanputSum [i] -= 1; bandera = verdadero; }}}}}}}} / * * Clare num en la novena novena cuadrícula * / private static void clearNum (int i, int num) {for (int j = 0; j <9; j ++) {// la coordenada horizontal del cuadrado pequeño actual int ii = (i / 3) * 3+j / 3; // La coordenada vertical del cuadrado pequeño actual int jj = (i % 3) * 3 + j % 3; // Determinar si el cuadrado pequeño actual se puede colocar si (mapas [ii] [jj] == num) {mapas [ii] [jj] = -1; }}} /** Obtenga el número de posiciones donde el nuevo cliente actual se puede colocar en el número num* / private static int getCanputSum (int i, int num) {int sum = 0; // atraviesa el nueve-cliente para (int j = 0; j <9; j ++) {// La coordenada horizontal del cuadrado pequeño actual int ii = (i / 3) * 3+j / 3; // La coordenada vertical del cuadrado pequeño actual int jj = i % 3 * 3 + j % 3; // Determinar si el cuadrado pequeño actual se puede colocar si (mapas [ii] [jj] == -1 && iscanput (ii, jj, num)) {++ suma; }} suma de retorno; } / * * Especifique si los puntos de coordenadas horizontales y verticales se pueden colocar num * / private static boolean iscanput (int ii, int jj, int num) {// determinar si el mismo número de la misma fila o columna del punto de coordenada especificado tiene el mismo número. Si lo hay, es falso para (int i = 0; i <9; i ++) {if (maps [ii] [i] == num) {return false; } if (maps [i] [jj] == num) {return false; }} return verdadero; }}El paquete completo se puede descargar en GitHub: https://github.com/houlongchao/s
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.