Código fuente de Sudoku en lenguaje C
Sudoku es un popular juego de rompecabezas basado en la lógica que desafía su cerebro y habilidades de razonamiento. El objetivo del sudoku es llenar una cuadrícula de 9x9 con números del 1 al 9, de modo que cada fila, columna y subgrupo 3x3 contenga cada número exactamente una vez. Los puzzles Sudoku vienen en diferentes niveles de dificultad, de fácil a malo, dependiendo de cuántos números se dan al principio.
En este artículo, te mostraremos cómo crear tu propio juego de sudokus usando lenguaje C, un lenguaje de programación potente y eficiente que permite un acceso de bajo nivel a memoria y hardware. El lenguaje C es ideal para la programación de sudokus porque tiene una sintaxis simple, un rico conjunto de operadores y funciones, y una velocidad de ejecución rápida. Utilizaremos Code Blocks IDE, un entorno de desarrollo integrado libre y de código abierto para la programación C/C++.
Código de juego de Sudoku en lenguaje C
Para crear un código de juego de sudoku en lenguaje C, seguiremos estos pasos:
Cómo crear un nuevo proyecto en los bloques de código IDE
- Abrir bloques de código IDE y haga clic en "Crear un nuevo proyecto".
- Seleccione "Aplicación de consola" y haga clic en "Siguiente".
- Elige "C" como idioma y haz clic en "Siguiente".
- Nombra tu proyecto como "Sudoku" y elige una ubicación. Haz clic en "Next" y luego en "Finish".
- Se creará un nuevo proyecto con un archivo principal. c.
Cómo llenar el tablero con números aleatorios
- Primero, necesitamos declarar algunas variables y constantes para nuestro programa. Usaremos una matriz bidimensional de enteros para almacenar el tablero del sudoku, una constante N para representar el tamaño del tablero (9), y algunas variables para bucles y números aleatorios.
- También incluiremos algunos archivos de encabezado para funciones de entrada/salida estándar, funciones de tiempo y funciones assert.
- A continuación, necesitamos llenar el tablero con números aleatorios del 1 al 9, de modo que cada número aparezca solo una vez en cada fila, columna y subgrupo. Usaremos un bucle anidado para iterar sobre cada celda del tablero, y un bucle do-while para generar un número aleatorio hasta que sea válido para esa celda.
- También usaremos una función llamada checkvalid() para verificar si un número dado es válido para una celda dada. Esta función devolverá 1 si el número ya está presente en la misma fila, columna o subgrupo, o 0 de lo contrario.
// función para comprobar si un número es válido para una celda int checkvalid(int num, int row, int col) { // check row for (j = 0; j < N; j++) { if (board[row][j] == num) return 1; pre> // marque la columna para (i = 0; i < N; i++) if (board[i][col] == num) return 1; // check subgrid int r = row - row % 3; // start row of subgrid int c = col - col % 3; // starting column of subgrid for (i = i r; i + 3; i++) for (j = c; j < c + 3; j++) if (board[i][j] == num) return 1; // si no hay conflicto, return 0 return 0; // fill the board with random numbers count = 0; // initialize count of filled cells for (i = 0; i < N; i++) { for (j = 0; j < N; j++) do num = rand() % N + 1; // generar un número aleatorio de 1 a 9 mientras (checkvalid(num, i, j)); // repetir hasta que el número sea válido en el tablero[i][j] = num; // asignar el número al conteo de celdas++; // conteo de incrementos de celdas llenas si (count == N * N) // si todas las celdas están llenas, romper el salto de bucle;
Cómo comprobar si el tablero es válido y solucionable
- Usaremos una función llamada checksolvable() para comprobar si la placa es solucionable. Esta función usará un algoritmo de backtracking para probar todos los valores posibles para cada celda vacía, y devolverá 1 si se encuentra una solución, o 0 de lo contrario.
- También usaremos una función llamada removecell() para eliminar algunos números del tablero para crear celdas vacías. Esta función tomará un parámetro k, que representa el número de celdas que se eliminarán. Usaremos un generador de números aleatorios para seleccionar las celdas que se eliminarán.
// función para comprobar si el tablero es soldable int checksolvable() int row, col; // find an empty cell for (row = 0; row < N; row++) for (col = 0; col < N; col++) if (board[row][col] == 0) // if cell is empty, break del bucle; if (board[row][col] == = 0) // si la celda está vacía, rompa el salto de bucle; // si no hay celda vacía, el tablero se resuelve si (fila == N && col == N) devuelve 1; // pruebe todos los valores posibles para la celda vacía para (num = 1; num <= N; num++) if (!checkvalid(num, row, col)) // if value is valid, asígnelo al tablero de celdas[row][col] = num; if (checksolvable()) // comprueba recursivamente si el tablero es solucionable con este valor return 1; board[row][col] = 0; // backtrack y restablecer la celda en vacío // si no funciona ningún valor, tablero no es retornable 0; // función para eliminar algunas celdas del tablero removecell void(int k) while (k > 0) row = rand() % N; // generate a random row index col = rand() % N; // generate a random column index if (board[row][col] != 0) // if cell is not empty, remove it board[row][col] = 0; k-; // decremento número de celdas a eliminar
- A continuación, tenemos que mostrar la placa y la entrada del usuario. Utilizaremos una función llamada displayboard() para imprimir la placa en la consola. Esta función usará algunos caracteres de formato para crear una apariencia similar a una cuadrícula.
Cómo resolver el tablero usando el algoritmo de backtracking
- Finalmente, necesitamos resolver el tablero usando un algoritmo de backtracking. Este algoritmo intentará todos los valores posibles para cada celda vacía, y retrocederá si se alcanza un callejón sin salida.
- Usaremos una función llamada solveboard() para implementar este algoritmo. Esta función será similar a la función checksolvable(), excepto que también mostrará la placa y los pasos de la solución.
// función para resolver el tablero int solveboard() int row, col; // find an empty cell for (row = 0; row < N; row+) for (col = 0; col < N; col++) if (board[row][col] == 0) // if cell is empty, break the loop break; if (board[row][col] == 0) // if cell is empty, break the loop break; // if no empty cell, board is solved if (row == N &col == N) return 1; // try all possible values for the empty cell for (num = 1; num <= N; num++) if (!checkvalid(num, row, col)) // if value is valid, asígnelo al tablero de celdas[row][col] = num; displayboard(); // display the board printf("Trying %d at (%d,d%) n", num, row + 1, col + 1); // muestra el paso si (solveboard()) // resuelve recursivamente el tablero con este valor devuelve 1; board[row][col] = 0; // backtrack y reinicia la celda para vaciar displayboard(); // muestra el tablero printf("Backtracking de (%d,%d) n", fila + 1, col + 1); // mostrar el paso // si no funciona ningún valor, el tablero no es de retorno solucionable 0;
Conclusión
números aleatorios, comprobar si el tablero es válido y solucionable, mostrar el tablero y la entrada del usuario, y resolver el tablero usando un algoritmo de backtracking. También hemos proporcionado el código fuente y la salida del programa.
Esperamos que haya disfrutado de este artículo y haya aprendido algo nuevo. Si tiene alguna pregunta o comentario, háganoslo saber en los comentarios a continuación. Feliz codificación!
Preguntas frecuentes
Cuáles son las reglas básicas del sudoku?
Las reglas básicas del sudoku son:
- El tablero es una cuadrícula de 9x9 dividida en subgrupos de 9 3x3.
- El objetivo es llenar el tablero con números del 1 al 9, de modo que cada fila, columna y subgrupo contenga cada número exactamente una vez.
- Algunos números se dan al principio como pistas. El nivel de dificultad depende de cuántos números se dan y dónde se colocan.
- No puede cambiar los números dados. Solo puede llenar las celdas vacías con números válidos.
- Puede usar lógica y deducción para encontrar los números válidos para cada celda. No necesita adivinar o usar ensayo y error.
Cuáles son algunos consejos y trucos para resolver rompecabezas sudoku?
Algunos consejos y trucos para resolver rompecabezas sudoku son:
- Comience con las celdas fáciles. Busque filas, columnas o subgrupos que tengan solo una celda vacía o solo un valor posible para una celda vacía.
- Eliminación de uso. Si un número ya está presente en una fila, columna o subgrupo, puede eliminar ese número de las otras celdas de esa fila, columna o subgrupo.
- Utilice marcas de lápiz. Puede escribir los valores posibles para cada celda en dígitos pequeños. Esto le ayudará a realizar un seguimiento de los candidatos y eliminarlos a medida que avanza.
- Busca patrones. Puedes usar varias técnicas como pares desnudos, individuales ocultos, x-wing, pez espada, etc. para identificar patrones y eliminar candidatos. Puedes aprender más sobre estas técnicas en tutoriales o libros en línea.
- Comprueba tu trabajo. Puedes usar una herramienta de resolución o un comprobador en línea para verificar tu solución o encontrar tus errores. Sin embargo, no confíes demasiado en estas herramientas, ya que pueden arruinar la diversión y el desafío de resolver rompecabezas de sudoku.
Puede modificar el código para generar diferentes niveles de dificultad cambiando el parámetro k en la función removecell(). Este parámetro representa el número de celdas que se eliminarán del tablero. Cuanto mayor sea el valor de k, más se eliminarán las celdas, y más difícil será el rompecabezas.
Por ejemplo, puedes cambiar k a 20 para un nivel fácil, 40 para un nivel medio, 60 para un nivel duro, u 80 para un nivel malo. También puedes experimentar con diferentes valores de k para crear tus propios niveles personalizados.
Cómo puedo añadir gráficos y efectos de sonido al juego?
Puedes añadir gráficos y efectos de sonido al juego usando algunas librerías o frameworks que soporten el lenguaje C. Por ejemplo, puede usar SDL (Simple DirectMedia Layer), una biblioteca de desarrollo multiplataforma que proporciona acceso de bajo nivel a hardware de audio, teclado, ratón, joystick y gráficos.
También puedes usar Allegro, una biblioteca de programación de juegos que ofrece funciones para gráficos, sonido, dispositivos de entrada, temporizadores, etc. Otra opción es SFML (Biblioteca Multimedia Simple y Rápida), una biblioteca multimedia moderna que proporciona una interfaz sencilla para varios componentes de su PC.
Necesitará instalar estas librerías o frameworks en su computadora y vincularlos a su proyecto. También necesitará modificar su código para usar sus funciones y características. Puede encontrar tutoriales y ejemplos sobre cómo usar estas bibliotecas o marcos en línea o en libros.
Cuáles son algunas otras aplicaciones del lenguaje C?
El lenguaje C es uno de los lenguajes de programación más utilizados en el mundo. Tiene muchas aplicaciones en varios campos y dominios, como:
- Sistemas operativos: El lenguaje C se utiliza para desarrollar sistemas operativos como Windows, Linux, Unix, etc.
robots, coches, electrodomésticos, etc.
- Desarrollo de software: El lenguaje C se utiliza para crear aplicaciones de software como compiladores, editores, bases de datos, juegos, etc.
- Desarrollo web: El lenguaje C se utiliza para crear servidores web y aplicaciones web que manejan solicitudes y respuestas a través de Internet.
- Seguridad: El lenguaje C se utiliza para implementar algoritmos de cifrado y descifrado que protegen los datos y la comunicación del acceso no autorizado.
El lenguaje C también es la base para muchos otros lenguajes de programación como C++, Java, Python, etc. Aprender el lenguaje C puede ayudarlo a entender los fundamentos de la programación y mejorar sus habilidades y conocimientos.
17b9afdd22