C语言编程题,实现一个简易的数独游戏。数独游戏是一个经典的逻辑益智游戏,要求玩家在9x9的棋盘上填入数字1-9,使得每一行、每一列以及每一个3x3的小九宫格内的数字都不重复。

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;
}

推荐文档

相关文档

大家感兴趣的内容

随机列表