⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nummatrix.h

📁 用C++写的数独游戏。提供了各种功能
💻 H
字号:
#pragma once

#define NM_MAX_SIZE         16
#define NM_MAKE_MASK(n)     (n < 3 ? n : 1 << (n - 1))
#define NM_GRID_WIDTH       36
#define NM_GRID_HEIGHT      36
#define NM_FONT_WIDTH       28
#define NM_FONT_DW          10
#define NM_FONT_DH          4

class CNumMatrix
{
public:
    CNumMatrix(void);
    ~CNumMatrix(void);

public:
    // 矩阵大小
    int     m_iSize;
    // 矩阵
    __int16 m_i16mMatrix[NM_MAX_SIZE][NM_MAX_SIZE];
    // 可能性矩阵
    char    m_cmPossible[NM_MAX_SIZE][NM_MAX_SIZE];
    // 区域矩阵
    char    m_cmRegion[NM_MAX_SIZE][NM_MAX_SIZE];
    // 区域系数
    int     m_ivRegion[2];
    // 确定的元素个数
    int     m_iAssured;

    // 选定的点
    int     m_ivSel[2];

public:
    // 从文件读取
    bool ReadFile(LPCTSTR fileName);
    // 导出到文件
    bool WriteFile(LPCTSTR fileName);
    // 初始化
    inline bool Init()
    {
        m_ivSel[0] = -1;
        m_ivSel[0] = -1;
        memset(m_i16mMatrix, -1, sizeof(m_i16mMatrix));
        memset(m_cmPossible, m_iSize, sizeof(m_cmPossible));
        m_iAssured = 0;
        return SetRegion(m_ivRegion[0], m_ivRegion[1]);
    }
    // 设置区域
    bool SetRegion(int nx, int ny);
    // 设置值
    inline void SetVal(int x, int y, __int16 mask)
    {
        m_i16mMatrix[x][y] = mask;
        m_cmPossible[x][y] = 0;
        m_iAssured++;
    }
    // 可能性检查
    bool CheckPossibility();
    // 取得可能值
    int GetPossibleVal(int x, int y, __int16 possible[]);
    // 减少可能性
    inline int RemovePossible(int x, int y, __int16 mask)
    {
        mask &= ~(0xffff << m_iSize);
        if(m_i16mMatrix[x][y] & mask)
        {
            m_i16mMatrix[x][y] &= ~mask;
            m_cmPossible[x][y]--;
        }
        return m_cmPossible[x][y];
    }
    // 减少区域可能性
    bool RemoveRegionPossible(char region, __int16 mask);
    // 优化
    int Optimize();

    // 查找解
    bool FindSolution();

    // 绘制
    void Paint(CDC * pDC);

    // 数字翻译
    int NumTrans(__int16 mask);

    // 点选
    bool HitAndSel(int x, int y)
    {
        m_ivSel[0] = x / NM_GRID_WIDTH;
        m_ivSel[1] = y / NM_GRID_HEIGHT;
        if(m_ivSel[0] < 0 || m_ivSel[0] >= m_iSize)
        {
            m_ivSel[0] = -1;
        }
        if(m_ivSel[1] < 0 || m_ivSel[1] >= m_iSize)
        {
            m_ivSel[1] = -1;
        }
        return (m_ivSel[0] >= 0 && m_ivSel[1] >= 0);
    }
    // 选择是否为确定值
    inline bool IsSelAssured()
    {
        return m_cmPossible[m_ivSel[0]][m_ivSel[1]] == 0;
    }
    // 取得选择
    inline __int16 GetSelVal()
    {
        return m_i16mMatrix[m_ivSel[0]][m_ivSel[1]];
    }
    // 设置选择
    inline void SetSel(__int16 mask)
    {
        if(mask == -1)
        {
            m_i16mMatrix[m_ivSel[0]][m_ivSel[1]] = -1;
            m_cmPossible[m_ivSel[0]][m_ivSel[1]] = m_iSize;
        }
        else
        {
            SetVal(m_ivSel[0], m_ivSel[1], mask);
        }
        CheckPossibility();
    }
    // 取得选择可能性
    inline int GetSelPossibleVal(__int16 possible[])
    {
        return GetPossibleVal(m_ivSel[0], m_ivSel[1], possible);
    }
    // 取得绘图大小
    inline void GetPaintSize(int & cx, int & cy)
    {
        cx = m_iSize * NM_GRID_WIDTH + 1;
        cy = m_iSize * NM_GRID_HEIGHT + 1;
    }
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -