1、定义全局常量和初始化数独棋盘
#define SIZE 9
定义棋盘的大小为 9x9。int board[SIZE][SIZE]
初始化数独棋盘,用二维数组表示。0
表示空位,需要玩家填入数字,其他数字为预设的数字。
#include <stdio.h> #include <stdbool.h> #define SIZE 9 // 预设的数独谜题,0 表示空格 int board[SIZE][SIZE] = { {5, 3, 0, 0, 7, 0, 0, 0, 0}, {6, 0, 0, 1, 9, 5, 0, 0, 0}, {0, 9, 8, 0, 0, 0, 0, 6, 0}, {8, 0, 0, 0, 6, 0, 0, 0, 3}, {4, 0, 0, 8, 0, 3, 0, 0, 1}, {7, 0, 0, 0, 2, 0, 0, 0, 6}, {0, 6, 0, 0, 0, 0, 2, 8, 0}, {0, 0, 0, 4, 1, 9, 0, 0, 5}, {0, 0, 0, 0, 8, 0, 0, 7, 9} };
2、打印数独棋盘的函数 printBoard()
printBoard()
函数用于打印当前的数独棋盘,包括将每个 3x3 小网格用竖线和横线进行分割,帮助玩家直观地查看棋盘。如果棋盘某列处于第 3 列或第 6 列时,会在该列前加一个竖线分隔符。打印分割线 ---------------------
,形成 3x3 子网格的视觉效果。
#include <stdio.h> #include <stdbool.h> #define SIZE 9 // 预设的数独谜题,0 表示空格 int board[SIZE][SIZE] = { {5, 3, 0, 0, 7, 0, 0, 0, 0}, {6, 0, 0, 1, 9, 5, 0, 0, 0}, {0, 9, 8, 0, 0, 0, 0, 6, 0}, {8, 0, 0, 0, 6, 0, 0, 0, 3}, {4, 0, 0, 8, 0, 3, 0, 0, 1}, {7, 0, 0, 0, 2, 0, 0, 0, 6}, {0, 6, 0, 0, 0, 0, 2, 8, 0}, {0, 0, 0, 4, 1, 9, 0, 0, 5}, {0, 0, 0, 0, 8, 0, 0, 7, 9} }; // 打印数独棋盘 void printBoard() { for (int row = 0; row < SIZE; row++) { for (int col = 0; col < SIZE; col++) { if (col == 3 || col == 6) printf("| "); // 3x3 网格分割线 printf("%d ", board[row][col]); } if (row == 2 || row == 5) { printf("\n---------------------"); // 3x3 网格分割线 } printf("\n"); } } int main() { printf("Hello, World!"); return 0; }
3、验证输入数字是否合法的函数 isValid()
isValid(int row, int col, int num)
函数用于检查玩家输入的数字 num
是否可以放在 (row, col)
位置。
#include <stdio.h> #include <stdbool.h> #define SIZE 9 // 预设的数独谜题,0 表示空格 int board[SIZE][SIZE] = { {5, 3, 0, 0, 7, 0, 0, 0, 0}, {6, 0, 0, 1, 9, 5, 0, 0, 0}, {0, 9, 8, 0, 0, 0, 0, 6, 0}, {8, 0, 0, 0, 6, 0, 0, 0, 3}, {4, 0, 0, 8, 0, 3, 0, 0, 1}, {7, 0, 0, 0, 2, 0, 0, 0, 6}, {0, 6, 0, 0, 0, 0, 2, 8, 0}, {0, 0, 0, 4, 1, 9, 0, 0, 5}, {0, 0, 0, 0, 8, 0, 0, 7, 9} }; // 检查数字能否放置在特定位置 bool isValid(int row, int col, int num) { // 检查行 for (int i = 0; i < SIZE; i++) { if (board[row][i] == num) return false; } // 检查列 for (int i = 0; i < SIZE; i++) { if (board[i][col] == num) return false; } // 检查 3x3 子网格 int startRow = row / 3 * 3; int startCol = col / 3 * 3; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (board[startRow + i][startCol + j] == num) return false; } } return true; } int main() { printf("Hello, World!"); return 0; }
4、检查数独是否完成的函数 isComplete()
isComplete()
函数用于检查数独是否已经完成。遍历整个数独棋盘,检查是否还有空位(值为 0
),如果有空位返回 false
,表示游戏还未完成;如果没有空位则返回 true
,表示数独已经完成。
#include <stdio.h> #include <stdbool.h> #define SIZE 9 // 预设的数独谜题,0 表示空格 int board[SIZE][SIZE] = { {5, 3, 0, 0, 7, 0, 0, 0, 0}, {6, 0, 0, 1, 9, 5, 0, 0, 0}, {0, 9, 8, 0, 0, 0, 0, 6, 0}, {8, 0, 0, 0, 6, 0, 0, 0, 3}, {4, 0, 0, 8, 0, 3, 0, 0, 1}, {7, 0, 0, 0, 2, 0, 0, 0, 6}, {0, 6, 0, 0, 0, 0, 2, 8, 0}, {0, 0, 0, 4, 1, 9, 0, 0, 5}, {0, 0, 0, 0, 8, 0, 0, 7, 9} }; // 检查数独是否已经完成 bool isComplete() { for (int row = 0; row < SIZE; row++) { for (int col = 0; col < SIZE; col++) { if (board[row][col] == 0) return false; } } return true; } int main() { printf("Hello, World!"); return 0; }
5、完整代码
一个简易的数独游戏,可以根据自己的需求进行扩展和完善。
#include <stdio.h> #include <stdbool.h> #define SIZE 9 // 预设的数独谜题,0 表示空格 int board[SIZE][SIZE] = { {5, 3, 0, 0, 7, 0, 0, 0, 0}, {6, 0, 0, 1, 9, 5, 0, 0, 0}, {0, 9, 8, 0, 0, 0, 0, 6, 0}, {8, 0, 0, 0, 6, 0, 0, 0, 3}, {4, 0, 0, 8, 0, 3, 0, 0, 1}, {7, 0, 0, 0, 2, 0, 0, 0, 6}, {0, 6, 0, 0, 0, 0, 2, 8, 0}, {0, 0, 0, 4, 1, 9, 0, 0, 5}, {0, 0, 0, 0, 8, 0, 0, 7, 9} }; // 打印数独棋盘 void printBoard() { for (int row = 0; row < SIZE; row++) { for (int col = 0; col < SIZE; col++) { if (col == 3 || col == 6) printf("| "); // 3x3 网格分割线 printf("%d ", board[row][col]); } if (row == 2 || row == 5) { printf("\n---------------------"); // 3x3 网格分割线 } printf("\n"); } } // 检查数字能否放置在特定位置 bool isValid(int row, int col, int num) { // 检查行 for (int i = 0; i < SIZE; i++) { if (board[row][i] == num) return false; } // 检查列 for (int i = 0; i < SIZE; i++) { if (board[i][col] == num) return false; } // 检查 3x3 子网格 int startRow = row / 3 * 3; int startCol = col / 3 * 3; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (board[startRow + i][startCol + j] == num) return false; } } return true; } // 检查数独是否已经完成 bool isComplete() { for (int row = 0; row < SIZE; row++) { for (int col = 0; col < SIZE; col++) { if (board[row][col] == 0) return false; } } return true; } int main() { int row, col, num; printf("欢迎来到数独游戏!\n\n"); while (!isComplete()) { printBoard(); // 提示玩家输入 printf("输入行(1-9), 列(1-9), 和数字(1-9): "); scanf("%d %d %d", &row, &col, &num); // 将输入转换为 0 索引的坐标 row--; col--; // 检查输入是否有效 if (row >= 0 && row < SIZE && col >= 0 && col < SIZE && num >= 1 && num <= 9) { if (board[row][col] == 0) { // 只允许填入空格 if (isValid(row, col, num)) { board[row][col] = num; // 如果合法,放入数字 } else { printf("无效输入,数字 %d 不能放在(%d, %d)\n", num, row + 1, col + 1); } } else { printf("该位置已经有数字,请选择其他位置\n"); } } else { printf("无效输入,请输入正确的行、列和数字(1-9)\n"); } } printf("恭喜你!你完成了数独!\n"); printBoard(); return 0; }