2025年3月22日 星期六 甲辰(龙)年 月廿一 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > VC/VC++

简单数独游戏

时间:09-15来源:作者:点击数:30
城东书院 www.cdsy.xyz

简单数独游戏

在这里插入图片描述

游戏1 完整代码

  • #include <iostream>
  • #include <vector>
  • #include <cstdlib>
  • #include <ctime>
  • using namespace std;
  • class Sudoku {
  • private:
  • vector<vector<int>> board; // 数独游戏的矩阵
  • vector<vector<bool>> fixed; // 是否为固定数字的标记
  • const int N = 9; // 矩阵的大小
  • public:
  • Sudoku() {
  • // 构造函数,生成数独游戏的矩阵
  • srand(time(NULL));
  • board.resize(N, vector<int>(N, 0));
  • fixed.resize(N, vector<bool>(N, false));
  • generateBoard();
  • }
  • void generateBoard() {
  • // 生成数独游戏的矩阵
  • int cnt = 0;
  • while (cnt < 30) {
  • int x = rand() % N;
  • int y = rand() % N;
  • if (board[x][y] == 0) {
  • int num = rand() % N + 1;
  • if (isValid(x, y, num)) {
  • board[x][y] = num;
  • fixed[x][y] = true;
  • cnt++;
  • }
  • }
  • }
  • }
  • bool isValid(int x, int y, int num) {
  • // 判断填入数字是否满足数独游戏的规则
  • for (int i = 0; i < N; i++) {
  • if (board[x][i] == num || board[i][y] == num) {
  • return false;
  • }
  • }
  • int sx = (x / 3) * 3, sy = (y / 3) * 3;
  • for (int i = sx; i < sx + 3; i++) {
  • for (int j = sy; j < sy + 3; j++) {
  • if (board[i][j] == num) {
  • return false;
  • }
  • }
  • }
  • return true;
  • }
  • void printBoard() {
  • // 打印数独游戏的矩阵
  • for (int i = 0; i < N; i++) {
  • for (int j = 0; j < N; j++) {
  • if (fixed[i][j]) {
  • cout << board[i][j] << " ";
  • }
  • else {
  • cout << " ";
  • }
  • }
  • cout << endl;
  • }
  • }
  • bool isComplete() {
  • // 判断数独游戏是否已完成
  • for (int i = 0; i < N; i++) {
  • for (int j = 0; j < N; j++) {
  • if (board[i][j] == 0 || !isValid(i, j, board[i][j])) {
  • return false;
  • }
  • }
  • }
  • return true;
  • }
  • bool solve(int x, int y) {
  • // 递归算法解决数独游戏的矩阵
  • if (x == N) return true;
  • int nx = x, ny = y + 1;
  • if (ny == N) {
  • nx++;
  • ny = 0;
  • }
  • if (fixed[x][y]) {
  • return solve(nx, ny);
  • }
  • for (int i = 1; i <= N; i++) {
  • if (isValid(x, y, i)) {
  • board[x][y] = i;
  • if (solve(nx, ny)) {
  • return true;
  • }
  • board[x][y] = 0;
  • }
  • }
  • return false;
  • }
  • };
  • int main() {
  • Sudoku sudoku;
  • cout << "Welcome to Sudoku!" << endl;
  • cout << "Please enter row, column and number to fill in, separated by spaces." << endl;
  • cout << "For example, \"1 2 3\" means fill in number 3 in row 1, column 2." << endl;
  • sudoku.printBoard();
  • while (!sudoku.isComplete()) {
  • int x, y, num;
  • cin >> x >> y >> num;
  • if (x < 1 || x > 9 || y < 1 || y > 9 || num < 1 || num > 9) {
  • cout << "Invalid input!" << endl;
  • continue;
  • }
  • if (sudoku.isValid(x - 1, y - 1, num)) {
  • sudoku.board[x - 1][y - 1] = num;
  • sudoku.printBoard();
  • }
  • else {
  • cout << "Invalid move!" << endl;
  • }
  • }
  • cout << "Congratulations, you win!" << endl;
  • return 0;
  • }

上述代码中,Sudoku类封装了数独游戏的矩阵、是否为固定数字的标记和相关的操作函数。在构造函数中,先使用time函数来生成随机数种子,然后调用generateBoard函数来生成数独游戏的矩阵。在generateBoard函数中,使用随机数来填充矩阵的一些位置,并使用isValid函数来判断填入数字是否满足数独游戏的规则。

在主函数中,首先创建一个Sudoku对象sudoku,并调用printBoard函数来打印数独游戏的矩阵。然后使用循环来不断读入玩家的输入,直到数独游戏已完成为止。每次读入玩家的输入后,先使用isValid函数来判断填入数字是否满足数独游戏的规则,如果满足则将数字填入矩阵,并调用printBoard函数来打印数独游戏的矩阵。如果不满足,则提示玩家输入无效。最后使用isComplete函数来判断数独游戏是否已完成,如果已完成则输出祝贺信息。

游戏2

  • 以下是一个简单的C++代码实现一个小型数独游戏的示例,包括生成数独游戏和解决数独游戏两个部分:
  • #include <iostream>
  • #include <cstdlib>
  • #include <ctime>
  • using namespace std;
  • const int N = 9;
  • class Sudoku {
  • private:
  • int board[N][N];
  • bool used[N][N];
  • int cnt;
  • public:
  • Sudoku() : cnt(0) {
  • srand(time(NULL));
  • initBoard();
  • }
  • void initBoard() {
  • // 初始化数独游戏的矩阵
  • for (int i = 0; i < N; i++) {
  • for (int j = 0; j < N; j++) {
  • board[i][j] = 0;
  • used[i][j] = false;
  • }
  • }
  • // 生成数独游戏的矩阵
  • generateBoard(0, 0);
  • // 随机挖去一些数字
  • int k = 30;
  • while (k > 0) {
  • int x = rand() % N;
  • int y = rand() % N;
  • if (board[x][y] != 0) {
  • board[x][y] = 0;
  • k--;
  • }
  • }
  • }
  • void generateBoard(int x, int y) {
  • // 回溯算法生成数独游戏的矩阵
  • if (x == N) {
  • cnt++;
  • return;
  • }
  • int nx = x, ny = y + 1;
  • if (ny == N) {
  • nx++;
  • ny = 0;
  • }
  • if (board[x][y] != 0) {
  • generateBoard(nx, ny);
  • return;
  • }
  • for (int i = 1; i <= N; i++) {
  • if (!used[x][i - 1] && !used[i - 1][y] && !used[(x / 3) * 3 + i / 3 - 1][(y / 3) * 3 + i % 3 - 1]) {
  • board[x][y] = i;
  • used[x][i - 1] = true;
  • used[i - 1][y] = true;
  • used[(x / 3) * 3 + i / 3 - 1][(y / 3) * 3 + i % 3 - 1] = true;
  • generateBoard(nx, ny);
  • if (cnt > 1) return;
  • board[x][y] = 0;
  • used[x][i - 1] = false;
  • used[i - 1][y] = false;
  • used[(x / 3) * 3 + i / 3 - 1][(y / 3) * 3 + i % 3 - 1] = false;
  • }
  • }
  • }
  • bool solveBoard(int x, int y) {
  • // 递归算法解决数独游戏的矩阵
  • if (x == N) return true;
  • int nx = x, ny = y + 1;
  • if (ny == N) {
  • nx++;
  • ny = 0;
  • }
  • if (board[x][y] != 0) {
  • return solveBoard(nx, ny);
  • }
  • for (int i = 1; i <= N; i++) {
  • if (!used[x][i - 1] && !used[i - 1][y] && !used[(x / 3) * 3 + i / 3 - 1][(y / 3) * 3 + i % 3 - 1]) {
  • board[x][y] = i;
  • used[x][i - 1] = true;
  • used[i - 1][y] = true;
  • used[(x / 3) * 3 + i / 3 - 1][(y / 3) * 3 + i % 3 - 1] = true;
  • if (solveBoard(nx, ny)) {
  • return true;
  • }
  • board[x][y] = 0;
  • used[x][i - 1] = false;
  • used[i - 1][y] = false;
  • used[(x / 3) * 3 + i / 3 - 1][(y / 3) * 3 + i % 3 - 1] = false;
  • }
  • }
  • return false;
  • }
  • void printBoard() {
  • // 打印数独游戏的矩阵
  • for (int i = 0; i < N; i++) {
  • for (int j = 0; j < N; j++) {
  • cout << board[i][j] << " ";
  • }
  • cout << endl;
  • }
  • }
  • };
  • int main() {
  • Sudoku sudoku;
  • sudoku.printBoard();
  • cout << endl;
  • if (sudoku.solveBoard(0, 0)) {
  • sudoku.printBoard();
  • }
  • else {
  • cout << "No solution!" << endl;
  • }
  • return 0;
  • }

上述代码中,Sudoku类封装了数独游戏的矩阵、已使用数字的标记、计数器和相关的操作函数。在构造函数中,首先使用time函数来生成随机数种子,然后调用initBoard函数来初始化数独游戏的矩阵并生成数独游戏。在initBoard函数中,先将矩阵的所有元素和标记都初始化为0或false,然后调用generateBoard函数来生成数独游戏的矩阵,并随机挖去一些数字。在generateBoard函数中,使用回溯算法来依次填充矩阵的每个位置,并使用标记来判断是否满足数独游戏的规则。如果成功生成一个数独游戏,计数器cnt加1,直到生成两个不同的数独游戏为止。

在主函数中,首先创建一个Sudoku对象sudoku,并调用printBoard函数来打印生成的数独游戏的矩阵。然后调用solveBoard函数来解决数独游戏的矩阵,并调用printBoard函数来打印解决后

城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐