Generador de Sudoku 2
Generador de Sudoku 2
Generador de Sudoku 2
Capítulo 1
Introducción
a la hora de diseñar algún programa que realice una tarea final, en esta ocasión la tarea
de números al llenarla es de 81, sin que se repitan los números en todas las filas y
con lo anterior, se pueden inferir las normas establecidas para la generación del
Objetivos
Objetivo General
Generar un Sudoku cumpliendo las reglas generales en las que se basa el juego,
Objetivos Específicos
lleva.
correctamente.
3
Marco Teórico
definición más acorde en el país de Japón, pues la palabra Sudoku significa Sū número y
doku a solo, que uniendo las palabras daría “Los números deben estar solos”. En la
actualidad, existen múltiples tipos de juego en Sudoku (Figura 1) pues se encuentran entre
otras, la matriz cuadrada, Sudoku samurái, el Sudoku mariposa, el Sudoku asesino, y así
con variadas figuras junto con los números. Para el trabajo con el algoritmo a desarrollar,
se utilizará el más común (Figura 2) que está formado al estilo 9 filas por 9 columnas, por
este motivo es que existen tres definiciones para tener claridad en la construcción del
1
Los cuadrados latinos son matrices n×n elementos en la que en cada casilla está ocupada por uno de los
n símbolos de tal modo que cada uno de ellos aparece exactamente una vez en cada columna y en cada fila
(Wikipedia).
4
Así se pueden encontrar las definiciones más aceptadas para el juego Sudoku,
como un cuadrado latino de matriz cuadrada n×n en la que en cada fila y columna son
variaciones de elementos que cumplan la condición de R = {1, 2, n+1} para n > 9. Esto
Otra definición se puede asociar con la primera, en la que establece que una matriz
{1, 2, 3, …, 9} de tal forma que solo exista un número de este grupo en cada fila, columna
inicial está bien definido si y sólo si existe una única forma de llenar las celdas vacías
matemático para un jugador las cuales comprenden que en las 9 submatrices 3 × 3, los
elementos deben de ser del uno al nueve; que en todas las filas debe haber elementos entre
5
el uno al nueve; y que en todas sus columnas debe haber elementos entre el uno al nueve,
en todas las tres reglas se debe cumplir que los números no tengan repetición.
a utilizar consiste en escribir en la primera fila los números del uno al nueve (figura 3),
de manera consecutiva; así cuando se vaya a programar, se usará el mismo proceso lógico.
1 2 3 4 5 6 7 8 9
Figura 3 Construcción de una primera Fila
continuación de la serie, que en el caso sería 4, 5 y 6 (figura 4), le seguiría en esta segunda
nuevamente el uno hasta terminar la fila. Así es como sucesivamente se llenará toda la
1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2 3
7 8 9 1 2 3 4 5 6
Figura 4 Secuencia de los números en la fila 2 y 3.
Como se puede observar, ya se ha llenado las submatrices que componen las tres
y entendiendo que, en la primera fila, se dio inicio con el número 1 (figura 5).
1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2 3
7 8 9 1 2 3 4 5 6
2 3 4 5 6 7 8 9 1
Figura 5 Llenando la siguiente submatriz.
donde se comienza con el número consecutivo (figura 6), se repetirá el mismo proceso
6
con la última submatriz (figura 7) y al final se habrá llenado todo el Sudoku sin repetición
de los números.
1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2 3
7 8 9 1 2 3 4 5 6
2 3 4 5 6 7 8 9 1
5 6 7 8 9 1 2 3 4
8 9 1 2 3 4 5 6 7
Figura 6 Segunda submatriz completa
1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2 3
7 8 9 1 2 3 4 5 6
2 3 4 5 6 7 8 9 1
5 6 7 8 9 1 2 3 4
8 9 1 2 3 4 5 6 7
3 4 5 6 7 8 9 1 2
6 7 8 9 1 2 3 4 5
9 1 2 3 4 5 6 7 8
Figura 7 Sudoku completo
submatrices, garantizando que ningún número se repetirá, este se hace con el fin de que
todos los rompecabezas queden de distinta manera, cada vez que se hace un intercambio,
1 2 3 4 5 6 7 8 9 7 8 9 1 2 3 4 5 6
4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3
7 8 9 1 2 3 4 5 6 1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1
5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4
8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7
3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2
6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5
9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8
Figura 8 Intercambio de filas y su resultado
7
Se hará lo mismo con los dos siguientes grupos de filas en las submatrices
7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6
4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 1 8 9 1 2 3 4 5 6 7
5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4
8 9 1 2 3 4 5 6 7 2 3 4 5 6 7 8 9 1
3 4 5 6 7 8 9 1 2 9 1 2 3 4 5 6 7 8
6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5
9 1 2 3 4 5 6 7 8 3 4 5 6 7 8 9 1 2
Figura 9 Intercambio de las demás filas y resultado final.
Luego de realizado el intercambio de las filas, se hará el mismo proceso para las
7 8 9 1 2 3 4 5 6 9 8 7 3 2 1 6 5 4
4 5 6 7 8 9 1 2 3 6 5 4 9 8 7 3 2 1
1 2 3 4 5 6 7 8 9 3 2 1 6 5 4 9 8 7
8 9 1 2 3 4 5 6 7 1 9 8 4 3 2 7 6 5
5 6 7 8 9 1 2 3 4 7 6 5 1 9 8 4 3 2
2 3 4 5 6 7 8 9 1 4 3 2 7 6 5 1 9 8
9 1 2 3 4 5 6 7 8 2 1 9 5 4 3 8 7 6
6 7 8 9 1 2 3 4 5 8 7 6 2 1 9 5 4 3
3 4 5 6 7 8 9 1 2 5 4 3 8 7 6 2 1 9
Por último, se reitera el mismo procedimiento, pero esta vez acorde con los dos
grupos de filas en las submatrices que se encuentran en el medio y la final (figura 11).
8
9 8 7 3 2 1 6 5 4 9 8 7 3 2 1 6 5 4
6 5 4 9 8 7 3 2 1 6 5 4 9 8 7 3 2 1
3 2 1 6 5 4 9 8 7 3 2 1 6 5 4 9 8 7
1 9 8 4 3 2 7 6 5 2 1 9 5 4 3 8 7 6
7 6 5 1 9 8 4 3 2 8 7 6 2 1 9 5 4 3
4 3 2 7 6 5 1 9 8 5 4 3 8 7 6 2 1 9
2 1 9 5 4 3 8 7 6 1 9 8 4 3 2 7 6 5
8 7 6 2 1 9 5 4 3 7 6 5 1 9 8 4 3 2
5 4 3 8 7 6 2 1 9 4 3 2 7 6 5 1 9 8
Figura 11 Intercambio de submatrices
Del mismo modo, la facilidad con la que se usa el algoritmo evidencia que los
números nunca se van a repetir, cumpliendo con lo establecido anteriormente, así hay
variadas transformaciones que se pueden aplicar para hacer este intercambio, no obstante,
lo importante de ello es que se pueda aplicar una secuencia aleatoria para obtener la
de números al azar. Para el nivel fácil se borrarán 40 números, medio serán 50 y difícil
60. Existen varias maneras para hacer la eliminación, como aplicación de matemáticas o
8 3 1 6 4 4
6 5 9 8 7 3 1 6 5 8 7 3 1
1 6 0 8 7 1 6 8 7
2 9 5 3 6 2 5 3 6
9 5 3 9 5 3
5 3 8 6 9 3 8 6 9
1 9 3 9 3
5 3 2 5 3 2
4 3 7 5 1 4 3 5
9
4
6 3
1 6 8 7
2 5 6
5
3 8 6 9
3
2
4 3 5
Figura 12 Eliminación de números en diferentes niveles
de su aprendizaje, fue diseñado como un lenguaje pequeño, con el objetivo de que sea
comprendido y que se adopte de una manera amplia y completa (Douglas Bell, 2003).
de la cual se crean objetos en su momento dado. Las clases en Jaca contienen métodos y
Lo que quiere decir que un programa se construye a través de objetos, los que a
su vez se crean a partir de clases. En palabras simples forma una nueva manera de pensar,
para representar acciones o cosas de la vida real basada en objetos. Existen unas
características que identifican al objeto, de acuerdo con el contexto, también son llamadas
objetos. Las clases son para los objetos lo que los planos de construcción son, para las
casas.
En el caso del Sudoku, junto con sus atributos y comportamientos, como se verá
a continuación:
SUDOKU
Una clase es un prototipo, matriz o plantilla de las que luego se pueden crear
múltiples instancias del mismo tipo. Es una manera de especificar las características, pero
basados en el mismo prototipo. La clase define las variables y los métodos comunes a las
instancias de ese tipo, pero luego, cada instancia de esta clase tendrá sus propios valores
Se usarán dos paquetes, el primero estará en el paquete por defecto, que tendrá la
clase Proyecto y el segundo se llamará lógica, que poseerá la clase llamada Sudoku.
2.2.3. Herramientas
IDE de Java llamado Java Development Toolkit (JDT) y el compilador (ECJ) que se
Las herramientas que se usarán en la programación del Sudoku serán los arrays
trabajo.
2.2.5. Arrays
Los arrays son contenedores de información que pueden tener una o varias
del Sudoku, se va a utilizar un arreglo que contiene varias dimensiones, en teoría son
arrays que tienen otros arrays. Los elementos se almacenan de forma contigua y el número
Y por último se procede a ingresar dentro los datos, estos elementos son accesibles
de la misma manera que una variable clásica. Para ello se utilizará un ciclo en el que vaya
recorriendo los filas y el otro para que vaya recorriendo las columnas, su nombre formal
12
2012).
secuencia dentro de otra secuencia. Para una mayor aclaración se muestra un reloj (Figura
4) en el que sus contiene tres manecillas, una para las horas, otra para los minutos y otra
para los segundos. En este ejemplo, se pueden comparar cada manecilla con cada
secuencia, puesto que la secuencia que está dentro del ciclo es el que más va a avanzar,
así el segundero hace mover al minutero cada vez que termina de hacer una vuelta, y el
minutero mueve al horario cuando este termina de hacer una vuelta, en este caso, es el
segundero el que va a dar más vueltas. Pero para la elaboración del rompecabezas,
solamente se usarán dos for para el llenado de la matriz mata, en el primero estará la letra
2.2.7. JOptionPane
diálogo preempaquetados para entrada y salida. Según Deitel & Deitel ( 2012), estos
cuadros de diálogo son ventanas en las cuales los programas muestran mensajes
programe, en este caso se muestran cuatro botones en los que tres pasarán a la dificultad
2.2.8. Random
java.util. Los objetos de esa clase producen valores aleatorios de distintos tipos, en el caso
específico será de tipo int¸ pues en el intercambio que se plantea (filas y columnas) se
necesita que sea al azar cuando se genere un nuevo Sudoku. En ese sentido, la aplicación
del método nextInt, dependerá del rango en el que se encuentre, pero se utilizará varios
números de acuerdo con una operación que esta dentro de ese rango, en este caso los
valores devueltos por nextInt son en realidad números pseudoaleatorios generados por un
cálculo, de tal forma que cada ejecución de un programa produzca una secuencia distinta
de valores aleatorios.
Asimismo, random se usará para que borre o cambie los números que se
3. Desarrollo de la Aplicación
aleatorios, tomando como base las herramientas vistas en clase, para ello se usará UML2
y capturas de pantalla.
donde cada uno de ellos tenga una clase, en el que estará la interfaz y la lógica. Para usar
en la interfaz lo que está en la lógica (figura 14), se procede a usar import bajo el nombre
de la carpeta, que en este caso se llamó lógica (línea 6) y crear el package, que iría la
Luego de ello, se crea un objeto Proyecto y lo asigna a py, mientras que para crear
la línea 7 se hizo la importación para que este funcionará, este se ejecutará mostrando un
2
Es el esquema de representación gráfica para modelar sistemas orientados a objetos.
15
usuario al menú de selección, de igual manera se dará a la creación y declaración del array
Figura 15 (De derecha a izquierda) Diagrama de clases de UML, que indica que
en el paquete default hay una clase Proyecto que tiene al main y en el paquete
Logica hay una clase Sudoku y una matriz definida.
anteriormente invocada, así se usará nuevamente JOptionPane, pero esta vez con el
usuario pueda escoger el nivel de dificultad, en este componente se deberá de escribir que
ícono que en este caso no será ninguno y se agrega la palabra null, el array o contenedor
que va a tener el texto que van a ir en los botones y por ultimo la opción inicial (figura
16).
Y por último, de acuerdo con el condicional if (línea 24) se enviará a otra acción
que dará la construcción del Sudoku, ya sea si se cumple, caso contrario else evaluará la
siguiente condición y así hasta que algún if sea verdadero. En los tres casos (fácil, medio
16
y difícil) se aplicará las mismas líneas de código y su creación están en las líneas 42, 58
y 74 respectivamente, pero para el último if, que en este caso no será ninguno de los tres
Proporcionalmente se le agrega a cada una los niveles. Con py hace que vaya a la acción
y que cuando este la termina, vuelva nuevamente al menú, puesto que la única salida que
recordando que en todas las tres será el mismo código, con el único cambio del número
de espacios en blanco, que en este caso se harán con ceros. Luego de definidas las
indicará el tamaño del arreglo en el paquete Logica (línea 5) que será 9 x 9, dentro de la
clase Sudoku.
bucle for¸ en el que se establece hasta que coordenada de fila y columna deberá de llenar
la matriz, en este caso será menor a 9, puesto que dicha comienza con la coordenada 0,0
y termina en 0,8. Se tendrá dos contadores m y o (línea 8), que hará las veces de poner
coordenada 0,0 (línea 13). Luego de que se lo asigna, aumentará en 1, es decir que ahora
m valdrá dos, lógicamente bajo la condición de que m tiene que ser igual o menor a 9
(línea 12), después a m se le sumará un tres que será asignado al otro contador o (línea
21), con el fin de que en la siguiente fila se inicie con 4, para ello se instaura un
cuatro. Además de ello, se encontró que al dividir los números resultantes de la suma en
la línea 21, su modulo podrá ser 2 o 3 (línea 24 y 25) y que sumado darían el número
necesario para seguir llenando la matriz, cumpliendo con las reglas (figura 18).
Figura 18 Declaración del tamaño de la matriz y llenado de la misma, así como su diagrama de clases
18
columnas (línea 35 y 37) dentro de un mismo grupo, para ello se selecciona dos filas al
azar y se intercambia. Del mismo modo se hace con las columnas, dependiendo del entero
En este caso, se cuenta con dos contadores llamados desde y hasta (línea 31 y 32),
ellos serán los encargados de hacer el calculo interno para que los números que salgan en
el random estén acordes a las submatrices. Después, se creará el objeto de random, que
hará la selección de las coordenadas aleatorias llamado roca (línea 33). Así, dentro de un
bucle for (línea 34), que su condición lo limita a realizar la acción intercambioFilas (línea
42) tres veces, pues este numero son las submatrices que se intercambiarán las filas.
este cambia cuando hasta le agrega el número que tenga asignado y se lo cambie
bucle, los nuevos números a escoger serían 6, 7 y 8; esto se debe a que dentro de la
selección del número que hará el random existe una resta y suma (línea 35) agregando
además a que los tres números arriba mencionados, así en el primer bucle que haga hasta
habrá cambiado (línea 40). En dado caso de que el número de la coordenada w1 y w2 sea
el mismo, el ciclo do while hará nuevamente la selección del número para w2 (figura 19).
19
En la línea 41 o 45, se evidencia que de acuerdo con el número entero que le llegue
(línea 57), en ambos casos se hace el mismo procedimiento. Viendo que los anteriores
métodos les llega w1 y w2, que son las coordenadas para cambiar, se creará una variable
ward (línea 50) que será la encargada de guardar el número que se encuentra en la celda
determinada bajo w1 y j (línea 52), con esto se crea un bucle for (línea 51) para que recorra
la fila explícita, pero la columna es una variable fija hasta que termine el bucle.
a w1, j (línea 53). Y por último lo que se había guardado en ward, pasa a w2, j (línea 54).
variable que va a guardar el número que esta en la celda será wars (línea 58). El cambio
estará encaminado en la letra que tenga el bucle; en este caso, la letra recorrerá la columna
reemplazarlos por ceros creando el método cero (línea 65) que le llegará la cantidad que
deberá cambiar por el entero ceroz. Nuevamente se instituirá un random bajo el nombre
de rc (línea 66) y con un bucle, hará el respectivo cambio (línea 68) basándose en que rc
generará las coordenadas aleatorias, que en este caso f será la coordenada de la fila y c
71) en donde valorara si en las coordenadas declaradas por rc existe un número diferente
i (línea 74) para que no se afecte la cantidad de ceros suministrada (figura 21), que en el
Para el último método de la clase Sudoku, se define como un entero llamado mama
(línea 78), que se encargará con un return de regresar la matriz completa (línea 79). Cabe
aclarar que para mostrarla se necesita un ciclo que se encuentra en el paquete default
(figura 22).
Figura 22 Método para mostrar la matriz y el diagrama UML final de la clase Sudoku
realizados, nuevamente aclarando que para los tres métodos se usará el mismo código,
deja dentro del método 1 (línea 45), que tomara el nombre de vigil.
3. Igual que en el numeral 2, solo que en vez de que a vigil se tome por 1, será
herramienta JOptionPane, haciendo uso de un bucle (línea 49) e invocando a mama (línea
51), que retornara la matriz. Para ello se usa un String llamado arg (línea 48), para que
deje espacios en blanco y permita que toda la matriz se visualice en un cuadro de mensaje.
Así a arg se simplifica la asignación con+= para que la matriz se sume con las comillas
(línea 51) y aparte generé una raya para poder diferenciar los números y no queden tan
juntos. En la linea 54 se aprecia un salto de línea con el fin de que no queden en una sola
cambian la cantidad de ceros según sea el nivel, que serán 50 (línea 63) y 60 (línea 79)
Conclusiones
de Algoritmos y Programación.
REFERENCIAS
Cabrera Pacheco, A., & Meneses Rodríguez, E. (2009). Un algoritmo sencillo de Sudokus
https://studylib.es/doc/4702296/un-algoritmo-sencillo-de-sudokus-de-9-×-9
Crilly, T. (2009). 50 cosas que hay que saber sobre matemáticas. Retrieved from
https://books.google.com.ua/books/about/50_cosas_que_hay_que_saber_sobre_las
_mat.html?id=Pg4NT5vBFyYC&printsec=frontcover&source=kp_read_button&re
dir_esc=y#v=onepage&q=sudoku&f=false
Deitel, P., & Deitel, H. M. (2012). Como programar en Java 9/e. Retrieved from
https://books.google.com.ua/books?hl=es&lr=lang_es&id=is2J44U4DpsC&oi=fnd
&pg=PA71&dq=java&ots=105i4mxitw&sig=34P3I7x7qqchnnNj2oHsvsgDhBI&r
edir_esc=y#v=onepage&q&f=false
https://books.google.com.ua/books?hl=es&lr=lang_es&id=3EQdUbkOVGIC&oi=f
nd&pg=PP1&dq=matriz+java&ots=04gVzBGDMO&sig=gfl02jgqidTK1CBvqCZ
ydb42aAg&redir_esc=y#v=snippet&q=for&f=false
Eclipse. (2018). Eclipse desktop & web IDEs. Retrieved July 30, 2019, from
https://blog.forret.com/2006/08/14/a-sudoku-challenge-generator/
Groussard, T. (2012). JAVA 7 : los fundamentos del lenguaje Java. Retrieved from
https://books.google.com.ua/books?hl=es&lr=lang_es&id=JaPTzKZxbN4C&oi=fn
d&pg=PA9&dq=matriz+java&ots=pV5FtcDnZj&sig=pAXvxFaKsnwQuZJKApG
DAUcMy6M&redir_esc=y#v=onepage&q=matriz&f=false