用c语言制作一个简单的数独小游戏
时间: 2023-11-11 20:06:43 浏览: 150
简单的数独小游戏
4星 · 用户满意度95%
好的,以下是一个简单的数独游戏的代码,其中包括生成数独谜题、输出数独谜题、玩家输入填写数独谜题、检查填写是否正确等功能。代码会比较长,请耐心阅读。
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROWS 9
#define COLS 9
#define EMPTY 0
void print_sudoku(int sudoku[ROWS][COLS]);
void generate_sudoku(int sudoku[ROWS][COLS], int level);
int solve_sudoku(int sudoku[ROWS][COLS], int row, int col);
int check_sudoku(int sudoku[ROWS][COLS]);
int main() {
int sudoku[ROWS][COLS];
int level = 1;
int choice = 0;
srand(time(NULL));
printf("欢迎来到数独游戏!\n");
printf("--------------------\n");
printf("请选择难度等级(1~3):");
scanf("%d", &level);
// 生成数独谜题
generate_sudoku(sudoku, level);
// 输出数独谜题
print_sudoku(sudoku);
// 玩家填写数独谜题
printf("请填写数独谜题(用空格隔开每个数字):\n");
while (choice != -1) {
int row, col, num;
printf("请输入行、列和数字(输入-1结束):");
scanf("%d %d %d", &row, &col, &num);
if (row == -1 || col == -1 || num == -1) {
choice = -1;
break;
}
if (row < 1 || row > 9 || col < 1 || col > 9 || num < 1 || num > 9) {
printf("输入无效,请重新输入!\n");
continue;
}
if (sudoku[row-1][col-1] != EMPTY) {
printf("该位置已经有数字了,请重新输入!\n");
continue;
}
sudoku[row-1][col-1] = num;
print_sudoku(sudoku);
}
// 检查填写是否正确
if (check_sudoku(sudoku)) {
printf("恭喜你,数独填写正确!\n");
} else {
printf("很遗憾,数独填写错误!\n");
}
return 0;
}
// 输出数独谜题
void print_sudoku(int sudoku[ROWS][COLS]) {
printf("--------------------\n");
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
printf("%d ", sudoku[i][j]);
}
printf("\n");
}
}
// 生成数独谜题
void generate_sudoku(int sudoku[ROWS][COLS], int level) {
// 先清空数独谜题
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
sudoku[i][j] = EMPTY;
}
}
// 随机填充数字
int count = 0;
while (count < 81) {
int row = rand() % 9;
int col = rand() % 9;
int num = rand() % 9 + 1;
if (sudoku[row][col] == EMPTY && solve_sudoku(sudoku, row, col) && check_sudoku(sudoku)) {
sudoku[row][col] = num;
count++;
}
}
// 按照难度等级删除数字
int delete_count = level * 10;
while (delete_count > 0) {
int row = rand() % 9;
int col = rand() % 9;
if (sudoku[row][col] != EMPTY) {
int temp = sudoku[row][col];
sudoku[row][col] = EMPTY;
if (!check_sudoku(sudoku)) {
sudoku[row][col] = temp;
} else {
delete_count--;
}
}
}
}
// 检查数独谜题是否填写正确
int check_sudoku(int sudoku[ROWS][COLS]) {
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
if (sudoku[i][j] == EMPTY) {
return 0;
}
for (int k = 0; k < ROWS; k++) {
if (k != i && sudoku[k][j] == sudoku[i][j]) {
return 0;
}
}
for (int k = 0; k < COLS; k++) {
if (k != j && sudoku[i][k] == sudoku[i][j]) {
return 0;
}
}
int row_start = (i / 3) * 3;
int col_start = (j / 3) * 3;
for (int m = row_start; m < row_start+3; m++) {
for (int n = col_start; n < col_start+3; n++) {
if (m != i && n != j && sudoku[m][n] == sudoku[i][j]) {
return 0;
}
}
}
}
}
return 1;
}
// 解决数独谜题
int solve_sudoku(int sudoku[ROWS][COLS], int row, int col) {
int next_row = row;
int next_col = col + 1;
if (next_col == 9) {
next_row++;
next_col = 0;
}
if (row == 9 && col == 0) {
return 1;
}
if (sudoku[row][col] != EMPTY) {
return solve_sudoku(sudoku, next_row, next_col);
}
for (int i = 1; i <= 9; i++) {
sudoku[row][col] = i;
if (check_sudoku(sudoku) && solve_sudoku(sudoku, next_row, next_col)) {
return 1;
} else {
sudoku[row][col] = EMPTY;
}
}
return 0;
}
```
请注意,这个代码仅仅是一个简单的数独小游戏,还有很多可以优化的地方。比如,生成数独谜题的算法可以使用更加高效的方法,检查数独填写是否正确的算法也可以更加简洁明了。如果你有兴趣,可以进一步探索优化这个代码。
阅读全文