Sudoku es un juego de cuadrícula de rompecabezas lógico en el que los jugadores colocan números del uno al nueve en una cuadrícula de nueve cuadrados divididos en nueve cuadrados más pequeños, de modo que cada número aparece una vez en una línea horizontal, una línea vertical y un cuadrado. Este juego es muy popular entre los amantes de las matemáticas. Por lo general, Sudoku se imprime en los periódicos diarios y la solución se publica al día siguiente.
Este artículo trata sobre la escritura de código en Python para resolver el rompecabezas de Sudoku utilizando el método de recursión. Primero haremos la parte de la GUI y luego procederemos a resolver el rompecabezas.
Tabla de Contenidos
Construyendo un solucionador de Sudoku GUI usando el lenguaje Python
Crearemos solucionadores de Sudoku GUI usando Jetbrains Pycharm IDE. Como estamos creando una impresionante solución de Sudoku con GUI, usaremos el Biblioteca Tkinter. Empecemos:
Importar biblioteca y escribir código
Importe todo desde Tkinter y cree una instancia para la ventana de Tkinter. Establezca el título de la ventana como «solucionador de sudokus“. Ahora establezca las dimensiones de la ventana usando el método de Geometría. Suponemos que las dimensiones de las ventanas son 324 × 550 píxeles.
Cree una etiqueta que muestre el uso del programa. Coloque la etiqueta en la fila 0 y la primera columna utilizando el método Grid. El intervalo de columnas establecido en 10 centra la etiqueta en la ventana.
Ahora crea otra etiqueta que entre en juego cuando falla el sudoku e inicialízala con una cadena vacía. En nuestro caso, el color de primer plano de la etiqueta de error es rojo. Utilice el método de cuadrícula para colocar la etiqueta en la fila 15 y la primera columna, la extensión de la columna en 10 y el relleno en 5.
Cree una etiqueta para el éxito del solucionador de Sudoku. Puede copiar el código de la etiqueta anterior y cambiar el color de primer plano a verde y marcar la etiqueta como resuelta.
Creemos un diccionario vacío para almacenar cada celda de la cuadrícula de entrada. Defina una función de validación para controlar la entrada en las celdas. El valor de la celda se utiliza como argumento.
El bloque de código:
Escribir la función de validación
Escriba el código para verificar el valor, ya sea un dígito o una cadena vacía, lo que permite a los usuarios eliminar el valor. Para limitar la entrada al uso de un solo dígito y comprobar si el valor es inferior a 2, devuelva el valor de la expresión booleana.
El bloque de código:
Registre la función y escriba otra función para dividir el sudoku en cuadrículas de 3×3
Registre la función utilizando el método de registro raíz en la ventana. Divida la cuadrícula Sudoku 9×9 en piezas más pequeñas de 3×3 escribiendo una función. Esto toma el número de fila, el número de columna. y colores de fondo como argumento.
Use un bucle for con un rango de tres que muestre las filas. Use otro bucle for adentro para especificar las columnas. Ahora cree un widget de entrada con un ancho de 5, bg como color de fondo, y use Justificar para centrar el texto. También confirme el botón para confirmar la función cuando se presiona el botón.
Valide el comando para una tupla de la función registrada y el código de sustitución %P que propaga el nuevo valor a la función cuando se cambia. Coloque el widget en la suma del número de fila como fila i+1 y la suma del número de columna como j+1. Puede ajustar el palo a nuevo, lo que lo hace pegajoso desde todas las direcciones. Establezca padx y pady en 1 y el relleno interno en 5.
Ahora almacene el widget de entrada en el diccionario con una tupla de números de fila y columna que usamos para colocar el widget como clave.
El bloque de código:
Escribe una función para dibujar una cuadrícula de 9×9
Escribiremos una función para crear una cuadrícula de 9×9. Usé una combinación de dos tonos para esta cuadrícula. El primer color indica el valor. Use un bucle for con rango 1, 10 y tamaño de paso 3 para la línea #.Use otro bucle for adentro con rango 0, 9 con tamaño de paso 3.
Ahora llame a la función 3 × 3 y pase la identificación de la fila, la identificación de la columna. y color. Para cambiar entre los colores, use la condición if. Si el valor de la variable de color es el primer color, lo establecemos en el segundo color. De lo contrario, lo establecemos en el primer color. Al escribir los códigos de color, manténgalos en mayúsculas y minúsculas.
El bloque de código:
Escribe una función para borrar el Sudoku
Escribiremos una función para eliminar valores para Sudoku que eliminará los valores en cada celda de la cuadrícula. Primero borre los indicadores de error y éxito. Repita las filas y columnas de nuevo. El rango de la fila sería 2, 11 y el rango de las columnas sería 1, 10.
Llame al widget de entrada que guardamos en un diccionario en una fila y columna específicas. Utilice el método de eliminación del widget de entrada para eliminar su valor desde el índice 0 hasta el final.
El bloque de código:
Escriba una función para obtener información del usuario
Escriba la función de obtención de valores y declare una lista vacía para almacenar los valores de cada celda de cada fila. Borre todas las etiquetas de nuevo para borrar el texto, si lo hay. Use el ciclo for para iterar sobre el rango 2, 11 para las filas y 1, 10 para las columnas. Ahora obtenga el valor de las celdas usando el método Obtener del widget Entrada. Si el valor es la cadena vacía, agregamos un 0 a la lista de filas. De lo contrario, agregue un valor entero a la lista.
Después de que finalice el bucle, agregue la lista de líneas a la lista de tableros.
El bloque de código:
Escribiendo código para botones
Cree un botón con el widget Botón. Configure el comando para obtener los valores, el texto a resolver y el ancho en 10. Ahora coloque el botón en la fila 20 y la primera columna con un espacio de columna de 5 pady como 20.
Cree otro botón copiando el mismo código, configurando el comando en la función Borrar valores y el texto en Borrar. Coloque este botón en la quinta columna.
El bloque de código:
llamando a las funciones
Llame a las funciones de cuadrícula de 9 × 9 y al método Roots Main Loop para iniciar la instancia de nuestra ventana creada.
escribir código
Primero declararemos una variable que contendrá el número de filas y columnas. Escriba la pregunta que valida un número específico para una fila o columna específica. Esto toma sudoku, número de fila, número de columna y número como argumentos. Para verificar si el mismo número existe en la misma fila, usamos un ciclo for en el rango de 9. La condición del ciclo for es la siguiente: si el número de la fila especificada y la i-ésima columna es igual a num, devolvemos INCORRECTO .
Asimismo, comprobamos si existe el mismo número en la misma columna. Use un ciclo for en el rango de 9. Si el número de la columna especificada y la j-ésima fila es igual a num, devolvemos falso.
Ahora debemos verificar si el mismo número existe en su cuadrícula especial de 3×3. La fila inicial será una fila sustraída del módulo de fila 3. La columna inicial sería una columna restada del módulo de columna 3.
Utilice dos bucles anidados en un rango de tres. Si el número de la fila inicial más la i-ésima fila y la columna inicial más la j-ésima columna es igual a num, devolvemos Falso. Al final de la función devolvemos True, que se ejecuta si no se cumple ninguna de las condiciones anteriores.
El bloque de código:
Función de escritura para asignar valores a posiciones no asignadas
Escribiremos una función de resolución de Sudoku para asignar valores a las posiciones no asignadas. Esto toma la matriz de sudoku, el número de fila inicial y el número de columna inicial como argumentos.
Comprobemos si la fila es igual a N-1 y la columna es igual a n. Si la condición prevalece, devolvemos verdadero. Esta condición actúa como la condición base ya que usaremos la recursividad para resolver el rompecabezas. Después de llegar a la última columna, pasamos a la siguiente columna. Si la columna es igual a n, agregamos uno a la fila y restablecemos la columna a cero. Ahora verificamos si un número está asignado a la ubicación actual
Si el número en la fila y la columna especificadas es mayor que cero, devolvemos la función de resolución de sudoku para la siguiente columna. Use un bucle for en el rango 1, N+1 para buscar cualquier número del 1 al 9.
Ahora verificaremos si está bien asignar este número a una fila y columna específica usando la función que escribimos anteriormente. Si está bien asignar el número, lo asignaremos en el sudoku. Suponiendo que el número asignado es correcto. También examinaremos la posibilidad con la siguiente columna.
En el bloque de código de bucles, reasignamos 0 ya que nuestra suposición era incorrecta y valida el siguiente valor. Devuelve falso al final del bloque de código de función.
El bloque de código:
Función de escritura para Sudoku resuelto
Escribiremos una función que devolverá el sudoku resuelto si es solucionable. Esto toma Sudoku como argumento. Para ver si Sudoku tiene solución, use la condición if. Devolvemos Sudoku si es solucionable. En caso contrario damos No.
Guarde este archivo como solver.py en la misma carpeta donde guardó su archivo GUI.
El bloque de código:
Importación de la función del solucionador en un archivo GUI
Abra el archivo GUI e importe la función solver desde el archivo solver.py. Función para escribir valores de actualización que actualiza las celdas y muestra la solución de Sudoku. Esto toma la matriz de sudoku como argumento.
Llame a la función de resolución y pásele el sudoku. Si la respuesta no es NO, use un bucle for con un rango de 2, 11. Dentro del bucle for, use otro bucle for con un rango de 1, 10. Borre los valores existentes de la celda. Utilice el método de inserción para insertar el valor en el índice 0.
El valor es el número de filas menos la segunda fila y la columna menos la primera columna. Restamos 2 y 1, respectivamente, ya que la matriz está indexada a cero.
Después de configurar el bucle, el texto de la etiqueta resuelta para sudoku se resuelve mediante el método de configuración. En la parte Else, configuramos el texto de la etiqueta de error para que no tenga solución.
Llamada de los valores de actualización
Al final, llame a la función obtener valores y pase la matriz del tablero.
Nuestro a partir de ahora El programa final está listo para ejecutarse..
Conclusión
Puede crear un solucionador de Sudoku usando el método de recursión como lo hicimos aquí. Pero desarrollar un solucionador de Sudoku con GUI pone más énfasis en sus habilidades de programación y facilita la resolución de los rompecabezas de Sudoku.
Esta publicación está dividida en partes para mantener el código. Espero que hayas disfrutado leyendo este artículo. Consulte los otros artículos de sugerencias de Linux para obtener más sugerencias y tutoriales.