用C语言编写完整的数独游戏
时间: 2024-03-05 17:54:33 浏览: 38
以下是一个完整的C语言数独游戏的代码实现,包括打印数独、生成数独、解决数独和用户交互等功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 9 // 数独的阶数
void print_sudoku(int sudoku[N][N]) // 打印数独
{
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%d ", sudoku[i][j]);
}
printf("\n");
}
}
int is_valid(int sudoku[N][N], int row, int col, int num) // 判断填入的数字是否有效
{
// 检查行
for (int i = 0; i < N; i++) {
if (sudoku[row][i] == num) {
return 0;
}
}
// 检查列
for (int i = 0; i < N; i++) {
if (sudoku[i][col] == num) {
return 0;
}
}
// 检查 3x3 方格
int start_row = (row / 3) * 3;
int start_col = (col / 3) * 3;
for (int i = start_row; i < start_row + 3; i++) {
for (int j = start_col; j < start_col + 3; j++) {
if (sudoku[i][j] == num) {
return 0;
}
}
}
return 1;
}
int solve_sudoku(int sudoku[N][N], int row, int col) // 解决数独
{
if (row == N) { // 找到解决方案
return 1;
}
if (col == N) { // 列遍历结束,继续下一行
return solve_sudoku(sudoku, row + 1, 0);
}
if (sudoku[row][col] != 0) { // 如果当前位置已经有数字,跳过
return solve_sudoku(sudoku, row, col + 1);
}
for (int i = 1; i <= N; i++) { // 尝试填入数字
if (is_valid(sudoku, row, col, i)) {
sudoku[row][col] = i;
if (solve_sudoku(sudoku, row, col + 1)) {
return 1;
}
sudoku[row][col] = 0;
}
}
return 0; // 没有找到解决方案
}
void generate_sudoku(int sudoku[N][N], int level) // 生成数独
{
// 先生成一个完整的数独
solve_sudoku(sudoku, 0, 0);
// 随机去掉一些数字
srand(time(NULL));
int count = level * 10;
while (count > 0) {
int row = rand() % N, col = rand() % N;
if (sudoku[row][col] != 0) {
sudoku[row][col] = 0;
count--;
}
}
}
int check_sudoku(int sudoku[N][N]) // 检查数独是否合法
{
// 检查行和列
for (int i = 0; i < N; i++) {
int row_flags[N] = {0}, col_flags[N] = {0};
for (int j = 0; j < N; j++) {
if (sudoku[i][j] != 0) {
if (row_flags[sudoku[i][j] - 1]) {
return 0;
} else {
row_flags[sudoku[i][j] - 1] = 1;
}
}
if (sudoku[j][i] != 0) {
if (col_flags[sudoku[j][i] - 1]) {
return 0;
} else {
col_flags[sudoku[j][i] - 1] = 1;
}
}
}
}
// 检查 3x3 方格
for (int i = 0; i < N; i += 3) {
for (int j = 0; j < N; j += 3) {
int flags[N] = {0};
for (int k = i; k < i + 3; k++) {
for (int l = j; l < j + 3; l++) {
if (sudoku[k][l] != 0) {
if (flags[sudoku[k][l] - 1]) {
return 0;
} else {
flags[sudoku[k][l] - 1] = 1;
}
}
}
}
}
}
return 1;
}
int main()
{
int sudoku[N][N] = {0};
int level;
printf("请输入难度等级(1 ~ 3):");
scanf("%d", &level);
generate_sudoku(sudoku, level);
printf("欢迎来到数独游戏!\n");
printf("输入坐标和数字以填入数独(例如 1 2 3 表示在第 1 行第 2 列填入数字 3),输入 0 0 0 以退出游戏。\n");
printf("当前数独:\n");
print_sudoku(sudoku);
while (1) {
int row, col, num;
printf("请输入:");
scanf("%d %d %d", &row, &col, &num);
if (row == 0 && col == 0 && num == 0) {
printf("谢谢游玩,再见!\n");
break;
}
if (row < 1 || row > N || col < 1 || col > N || num < 0 || num > N) {
printf("输入不合法,请重新输入。\n");
continue;
}
if (sudoku[row - 1][col - 1] != 0) {
printf("该位置已经填入数字,请重新输入。\n");
continue;
}
sudoku[row - 1][col - 1] = num;
if (check_sudoku(sudoku)) {
printf("当前数独:\n");
print_sudoku(sudoku);
} else {
printf("填入数字后不符合数独规则,请重新输入。\n");
sudoku[row - 1][col - 1] = 0;
}
int finished = 1;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (sudoku[i][j] == 0) {
finished = 0;
break;
}
}
if (!finished) {
break;
}
}
if (finished) {
printf("恭喜您,已经完成数独!\n");
break;
}
}
return 0;
}
```
这个程序中,`print_sudoku` 函数用于打印数独,`is_valid` 函数用于判断填入的数字是否有效,`solve_sudoku` 函数用于解决数独,`generate_sudoku` 函数用于生成数独,`check_sudoku` 函数用于检查数独是否合法。程序通过用户交互的方式实现游戏功能,用户可以输入坐标和数字以填入数独,程序会检查填入的数字是否合法,并打印当前数独。如果填入的数字导致数独不符合规则,程序会提示用户重新输入。如果用户完成数独,程序会打印恭喜的信息并退出游戏。
相关推荐
![text/x-c](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)