首页 > 编程语言 >C++实现的数独游戏

C++实现的数独游戏

时间:2024-08-26 19:58:09浏览次数:10  
标签:return 游戏 int C++ num col 数独 row

数独游戏是什么

数独(Sudoku)是一种基于数字的逻辑推理游戏,起源于18世纪的瑞士数学家莱昂哈德·欧拉(Leonhard Euler)的拉丁方阵,但现代数独的规则由美国架桥杂志在20世纪后半叶所推广,随后在日本得到了广泛流行,并被命名为“数独”(意为“数字独立”)。如今,数独已经成为一种在世界各地都非常受欢迎的智力游戏。

游戏规则

  1. 游戏棋盘: 数独棋盘是一个9x9的网格,整个棋盘分为9个3x3的小方格(称为“宫”)。

  2. 填充规则:

    • 游戏开始时,部分格子里会预先填入数字1到9中的一些。
    • 玩家需要将剩余的格子填满数字,要求:
      • 每行(Row)必须包含数字1到9,不得重复。
      • 每列(Column)必须包含数字1到9,不得重复。
      • 每个3x3的小方格(宫)也必须包含数字1到9,不得重复。
  3. 目标: 游戏的目标是在遵守上述规则的前提下,将整个9x9的网格正确填满。

游戏的特点

  • 难度变化: 数独的难度主要取决于初始已填入数字的数量和位置。数字越少且分布越散乱,数独的难度通常越高。
  • 唯一解: 标准的数独问题通常有且仅有一个解。如果一个数独问题有多个解或无解,那么它就不符合标准数独的定义。

代码实现

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>

using namespace std;

const int N = 9;

class Sudoku {
private:
    vector<vector<int>> board;

    // 检查给定数字在行、列和3x3子宫格中是否有效
    bool isValid(int row, int col, int num) {
        // 检查行
        for (int x = 0; x < N; x++) {
            if (board[row][x] == num) {
                return false;
            }
        }

        // 检查列
        for (int x = 0; x < N; x++) {
            if (board[x][col] == num) {
                return false;
            }
        }

        // 检查3x3子宫格
        int startRow = row - row % 3;
        int startCol = col - col % 3;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (board[i + startRow][j + startCol] == num) {
                    return false;
                }
            }
        }

        return true;
    }

    // 使用回溯法解决数独问题
    bool solveSudoku() {
        int row, col;
        if (!findUnassignedLocation(row, col)) {
            return true; // 所有位置都已分配
        }

        for (int num = 1; num <= 9; num++) {
            if (isValid(row, col, num)) {
                board[row][col] = num;

                if (solveSudoku()) {
                    return true;
                }

                board[row][col] = 0; // 回溯
            }
        }
        return false; // 触发回溯
    }

    // 找到未分配的棋盘位置
    bool findUnassignedLocation(int &row, int &col) {
        for (row = 0; row < N; row++) {
            for (col = 0; col < N; col++) {
                if (board[row][col] == 0) {
                    return true;
                }
            }
        }
        return false;
    }

public:
    Sudoku() {
        board = vector<vector<int>>(N, vector<int>(N, 0));
    }

    // 简单的数独生成器
    void generateSudoku() {
        srand(time(0));
        for (int i = 0; i < 9; i++) {
            int row = rand() % 9;
            int col = rand() % 9;
            int num = rand() % 9 + 1;
            if (isValid(row, col, num)) {
                board[row][col] = num;
            }
        }
    }

    // 打印数独棋盘
    void printSudoku() {
        for (int r = 0; r < N; r++) {
            for (int d = 0; d < N; d++) {
                cout << board[r][d] << " ";
            }
            cout << endl;
        }
    }

    // 尝试求解数独
    bool solve() {
        return solveSudoku();
    }

    // 生成数独、打印、求解并打印解答
    void play() {
        generateSudoku();
        cout << "Sudoku Puzzle:" << endl;
        printSudoku();

        if (solve()) {
            cout << "Solution:" << endl;
            printSudoku();
        } else {
            cout << "No solution exists." << endl;
        }
    }
};

int main() {
    Sudoku sudoku;
    sudoku.play();
    return 0;
}

思路分析

类的设计
  • Sudoku类封装了数独游戏的所有逻辑,包括棋盘的生成、求解和输出。
  • 类的设计有助于代码的模块化,使得每个功能都可以被独立测试和修改。
  • 这种封装方式也提高了代码的可维护性和可扩展性,因为可以在不影响其他部分的情况下对特定功能进行改进或修复。
核心算法 - 回溯法
  • solveSudoku()方法使用回溯算法来解决数独问题。回溯法是一种经典的穷举搜索算法,尤其适用于解答数独这类问题。
  • 该算法的基本思想是逐个尝试每个可能的数字,检查其有效性。如果某一步无法继续(即所有数字都不符合要求),则“回溯”到上一步,尝试其他可能性。
  • 通过递归和回溯,算法可以在解空间中进行深度优先搜索,直到找到正确的解。
有效性检查
  • isValid()方法用于检查在指定的行、列和3x3子宫格内,某个数字是否可以放置。
  • 有效性检查是数独求解的关键步骤,确保每一步都满足数独的规则。
  • 该方法通过遍历相关的行、列和子宫格来判断数字是否符合规则,从而帮助solveSudoku()方法做出正确的选择。
棋盘生成
  • generateSudoku()生成一个初步的数独问题。该方法较为简单,仅随机填充一些数字,可以根据需求进一步扩展,使其生成更具挑战性的数独问题。
  • 目前的生成方式并不复杂,主要是为了展示数独的基本功能。未来可以通过调整生成算法来提高数独问题的难度,如控制已填数字的数量和位置,或生成唯一解的数独棋盘。
用户界面
  • 代码提供了基本的用户界面,通过play()方法展示生成的数独问题并尝试求解。用户可以看到生成的初始问题以及最终的解答。
  • 这种设计使得代码可以直接运行,展示数独游戏的完整流程。未来可以进一步开发图形用户界面(GUI)或命令行界面(CLI)来增强用户体验。

标签:return,游戏,int,C++,num,col,数独,row
From: https://blog.csdn.net/PeterClerk/article/details/141571915

相关文章

  • 国产游戏技术:突破与展望
    国产游戏技术能否引领全球?近年来,国产游戏行业蓬勃发展,技术水平不断提升,多款作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,中国游戏开发者在各个领域都取得了显著进步。面对全球游戏市场的激烈竞争,国产游戏技术还面临哪些挑战?未来又有哪些机遇?IT技术......
  • C++ 设计模式——享元模式
    C++设计模式——享元模式C++设计模式——享元模式1.主要组成成分2.享元模式内部状态3.享元模式外部状态4.逐步构建享元模式4.1抽象享元类定义4.2具体享元类实现4.3享元工厂类实现4.4主函数5.享元模式UML图享元模式UML图解析6.享元模式的优点7.享元模......
  • 《欧洲卡车模拟2》游戏启动时闪退提示缺少Core_ets2mp.dll文件怎么解决?欧卡2游戏崩溃
    在玩《欧洲卡车模拟2》时,游戏启动时出现闪退,并提示缺少Core_ets2mp.dll文件,这着实令人困扰。玩家可以尝试重新安装游戏、更新驱动程序,或者从可靠来源获取该文件并正确放置,以解决这一问题。本篇将为大家带来《欧洲卡车模拟2》游戏启动时闪退提示缺少Core_ets2mp.dll文件怎么解决......
  • 《魔兽世界》游戏崩溃弹窗“找不到gamede.dll文件”该怎么办?魔兽世界游戏闪退提示缺少
    在玩《魔兽世界》时,游戏崩溃并弹窗提示“找不到gamede.dll文件”,这十分令人头疼。玩家可以尝试重新安装游戏、检查文件完整性,或者在网上查找可靠的该文件资源进行补充,以此来解决这个棘手的问题。本篇将为大家带来《魔兽世界》游戏崩溃弹窗“找不到gamede.dll文件”该怎么办的内......
  • 《黑神话:悟空》提示Steam_API.dll缺失?六种方案解决游戏启动障碍
    Steam_API.dll是一个与Steam平台相关的动态链接库(DLL)文件,通常与使用SteamAPI的游戏或应用程序的功能实现有关。这个DLL文件包含了一些Steam平台功能的辅助函数,例如成就系统、云存储、社交功能等,对于确保游戏或应用程序的正常运行非常重要。当Steam_API.dll文件缺失时,可能......
  • 在 C/C++ 中使用 MY_API 宏封装动态库:一种高效的跨平台接口实现方法
    目录1.背景介绍2.MY_API宏的定义3.使用MY_API宏封装动态库4.编译和使用动态库5.结论在现代软件开发中,封装动态库(DynamicLinkLibrary,DLL)以提供可复用的功能模块已经成为一种常见的实践。然而,在开发跨平台库时,由于不同操作系统对于动态库的导出和导入机制有......
  • C++面向对象三大特性之一(继承)
    面向对象思维是编程中很重要的一个思维,众所周知面向对象编程有三大特性封装、继承、多态,今天我就来分享一下三大特性之一的继承。一、什么是继承?我们举例说明,比如你老爸的财产你可以使用,这就是继承,在面向对象中,体现为一个子类可以使用父类的成员属性和成员函数,自己不用在......
  • 什么是友元?什么可以做友元?友元能干什么?(全局函数做友元,类做友元,成员函数做友元)c/c++
    一、什么是友元例如:你的生活中有一个特别好的朋友,你允许它进入你的房间(私有场所)也允许他进入客厅(相对公有场所),但是对于其他人你是不会允许他进入你的房间的,只允许他进入客厅。类对象也有这样类似的好朋友类,可以访问本类的私有成员,这个好朋友类就叫做这个类的友元,友元也可......
  • 【NOI】C++数据结构入门之一维数组(三)元素移动
    文章目录前言一、概念1.导入2.元素移动2.1逆序2.2删除2.3插入二、例题讲解问题:1009-数组逆序问题:1162-数组元素的删除问题:1211-数组元素的插入问题:1161.元素插入有序数组问题:1159.数组元素的移动三、总结四、感谢前言在继续我们的C++数据结构学习之旅......
  • UE5蓝图 离线实时语音转文字插件 教程 c/c++插件 毫秒级响应 比http更节约资源
    UE5蓝图实现离线实时语音转文字插件教程如何用UE5蓝图实现离线实时语音转文字,实时接收麦克风音频并且快速的转换成文字。那么我来分享一下ez2txt这个插件。bilibili使用教程效果展示:蓝图:只要启动麦克风就可以了,其他的繁琐步骤插件都封装好了。参数说明Rule1_m......