用c语言写一个数独游戏
时间: 2023-11-16 13:04:47 浏览: 274
好的,以下是C语言代码实现数独游戏的完整版,包括生成随机数独游戏和玩家输入填充数独游戏的过程:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
// 初始化数独游戏
void init_sudoku(int sudoku[ROW][COL]) {
int i, j;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
sudoku[i][j] = 0;
}
}
}
// 打印数独游戏
void print_sudoku(int sudoku[ROW][COL]) {
int i, j;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
printf("%d ", sudoku[i][j]);
}
printf("\n");
}
}
// 检查行是否合法
int check_row(int sudoku[ROW][COL], int row, int val) {
int j;
for (j = 0; j < COL; j++) {
if (sudoku[row][j] == val) {
return 0;
}
}
return 1;
}
// 检查列是否合法
int check_col(int sudoku[ROW][COL], int col, int val) {
int i;
for (i = 0; i < ROW; i++) {
if (sudoku[i][col] == val) {
return 0;
}
}
return 1;
}
// 检查3x3的宫格是否合法
int check_box(int sudoku[ROW][COL], int row, int col, int val) {
int i, j, row_start, col_start;
row_start = (row / 3) * 3;
col_start = (col / 3) * 3;
for (i = row_start; i < row_start + 3; i++) {
for (j = col_start; j < col_start + 3; j++) {
if (sudoku[i][j] == val) {
return 0;
}
}
}
return 1;
}
// 检查当前数字是否可行
int check_valid(int sudoku[ROW][COL], int row, int col, int val) {
return check_row(sudoku, row, val) &&
check_col(sudoku, col, val) &&
check_box(sudoku, row, col, val);
}
// 递归填充数独游戏
int fill_sudoku(int sudoku[ROW][COL], int row, int col) {
// 边界条件:填充完最后一行
if (row == 8 && col == 9) {
return 1;
}
// 边界条件:填充完一行
if (col == 9) {
row++;
col = 0;
}
// 如果当前位置已经填充了数字,则跳过
if (sudoku[row][col] > 0) {
return fill_sudoku(sudoku, row, col + 1);
}
// 枚举当前位置可以填充的数字
int val;
for (val = 1; val <= 9; val++) {
// 检查当前数字是否可行
if (check_valid(sudoku, row, col, val)) {
sudoku[row][col] = val;
// 递归填充下一个位置
if (fill_sudoku(sudoku, row, col + 1)) {
return 1;
}
// 回溯
sudoku[row][col] = 0;
}
}
return 0;
}
// 生成数独游戏
void create_sudoku(int sudoku[ROW][COL]) {
// 初始化随机数种子
srand(time(NULL));
// 生成第一行的随机排列
int i, j, k, first_row[9];
for (i = 0; i < 9; i++) {
first_row[i] = i + 1;
}
for (i = 0; i < 9; i++) {
j = rand() % 9;
k = first_row[i];
first_row[i] = first_row[j];
first_row[j] = k;
}
// 填充第一行
for (j = 0; j < 9; j++) {
sudoku[0][j] = first_row[j];
}
// 递归填充数独游戏
fill_sudoku(sudoku, 0, 0);
}
// 获取玩家输入的行列坐标和数字
void get_input(int *row, int *col, int *val) {
printf("请输入行、列、数字(用空格隔开):");
scanf("%d %d %d", row, col, val);
*row -= 1;
*col -= 1;
}
// 检查玩家输入是否合法
int check_input(int sudoku[ROW][COL], int row, int col, int val) {
if (row < 0 || row >= ROW || col < 0 || col >= COL) {
printf("行列输入不合法,请重新输入!\n");
return 0;
}
if (sudoku[row][col] > 0) {
printf("该位置已经有数字了,请重新输入!\n");
return 0;
}
if (!check_valid(sudoku, row, col, val)) {
printf("该数字在当前行、列、宫格中已经存在,请重新输入!\n");
return 0;
}
return 1;
}
int main() {
int sudoku[ROW][COL];
init_sudoku(sudoku);
create_sudoku(sudoku);
print_sudoku(sudoku);
int row, col, val;
while (1) {
// 获取玩家输入
get_input(&row, &col, &val);
// 检查玩家输入是否合法
if (!check_input(sudoku, row, col, val)) {
continue;
}
// 填充数独游戏
sudoku[row][col] = val;
// 打印当前数独游戏
printf("当前数独游戏:\n");
print_sudoku(sudoku);
// 检查是否填满
int i, j, finished = 1;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if (sudoku[i][j] == 0) {
finished = 0;
break;
}
}
if (!finished) {
break;
}
}
if (finished) {
printf("恭喜你,数独游戏已完成!\n");
break;
}
}
return 0;
}
```
运行以上代码,即可体验完整的数独游戏。
阅读全文