雨天纷纷扰扰,数月里每日有雨,这个夏天不热,写这个数独的动机很简单:实践是最好的成长方式,想要获得自信,必有这么一遭,我躲不过。至于决定记录成博客,则是因为很久没有写文章,经常感觉脑海里很空白,屡次开口却不知道想说什么!我在迷茫啊。

  这是一篇记录摸索过程的文章,主要记录遇到的问题,适合毫无基础的共同探讨,也请路过的高手多指点。

  思路很简单:

    ①数独随机生成算法,打算采用递归遍历方式,满足条件的保存下来,内存数组保存或者写入文件。

    ②MFC实现矩形区域绘制背景和文本,主要是CDC方法的调用。

    ③指定区域生成一个可供输入的编辑框,可设置文本的格式和范围。

    目前只写到这里,先附上代码,其余部分待完工后会附上。

    

    数独生成算法:

 

这个编辑器不智能啊,代码的格式全毁了,InitSudoku是主递归函数,设计思路是,用行、列作为渐变参数,当生成了9*9的数独时会return;unConflict用来检测当前数字是否和已经生成的数独冲突。 

void sudoku::InitSudoku(int row, int col)
{
if(row == 8 && col == 9)
{
return;
}

if(col == 9)
{
row += 1;
col = 0;
}

int bEye = false;

for(int i = 1; i <= 9; i++)
{
if(unConflict(row, col, i))
{
Matrix[row][col].SetNumber(i);
InitSudoku(row, col+1);
}

}
}

bool sudoku::unConflict(int row, int col, int num)
{
int unValidValue[SIZE*2] = {};
int loop = 0;
for(int i = 0; i < row; i++)
{
unValidValue[i] = Matrix[i][col].GetNumber();
loop = i;
}
loop += 1;
for(int j = 0; j < col; j++)
{
unValidValue[loop] = Matrix[row][j].GetNumber();
loop++;
}

bool bEye = true;
for(int index = 0; index < SIZE*2; index++)
{
if(num == unValidValue[index] && unValidValue[index] != 0)
bEye = false;
}

return bEye;
}

绘制一个矩形区域并打印指定格式的文本,DrawText绘制文本的时候遇到了问题,不能垂直居中,查资料的时候发现DT_VCENTER|DT_SINGLELINE必须同时使用,否则窗口无法定位矩形的高度,试验解决之。

void CmfcsudukuDlg::OnBnClickedButtonDraw()
{
// TODO: 在此添加控件通知处理程序代码
CRect rect = CRect(50, 50, 100, 130);
CDC *pDC = GetDC();
pDC->FillSolidRect(rect, RGB(230, 230, 230));
CString val;
val.Format(_T("%d"), 8);
pDC->SetTextColor(RGB(255, 255, 255));
CFont font = CFont();
font.CreateFontW(40, 0, 0, 0, FW_BOLD, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_SWISS, _T("Arival"));
pDC->SelectObject(font);
pDC->DrawText(val, rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
return;
}

创造一个文本输入的编辑框并定义编辑框的文本格式,edit->SetFont这个函数需要注意一下,如果传递的CFont不是成员变量或者全局变量会导致该函数无效,我只验证了成员变量可以使字体生效,未验证全局变量是否可以生效。font作为参数时字体不改变,m_font传递会生效字体。

void CmfcsudukuDlg::OnBnClickedButtonInput()
{
// TODO: 在此添加控件通知处理程序代码
CRect rect = CRect(50, 50, 100, 130);
CString val;
val.Format(_T("%d"),6);
CFont font = CFont();
font.CreateFontW(40, 0, 0, 0, FW_BOLD, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_SWISS, _T("Arival"));
m_font.CreateFontW(40, 0, 0, 0, FW_BOLD, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_SWISS, _T("Arival"));

CEdit *edit = new CEdit;
edit->Create(ES_CENTER ,rect, this, IDC_INPUT);
edit->SetFont(&m_font);
edit->SetFocus();
edit->ShowWindow(true);
edit->SetWindowTextW(val);
}

未完待续......持续更新中

MFC实现数独(1)的更多相关文章

  1. MFC实现数独(2)

    主要功能描述: 运行程序后对话框会显示一个9x9的待输入数独区域,并提供随机生成数独和生成数独按钮,生成数独按钮后会创建数独并随机显示其中一个至数独区域,随机生成数独会从已生成的数独中随机获取一个并显 ...

  2. 蓝桥杯---数独(模拟 || dfs)

    [编程题](满分33分) "数独"是当下炙手可热的智力游戏.一般认为它的起源是"拉丁方块",是大数 学家欧拉于1783年发明的. 如图[1.jpg]所示:6x6 ...

  3. 数独GUI程序项目实现

    数独GUI程序项目实现 导语:最近玩上了数独这个游戏,但是找到的几个PC端数独游戏都有点老了...我就想自己做一个数独小游戏,也是一个不错的选择. 前期我在网上简单地查看了一些数独游戏的界面,代码.好 ...

  4. vs2010静态链接MFC库报链接错误

    由于需要将MFC程序在其它电脑上运行,所以需要将动态链接的MFC改成静态链接,本以为很简单,没想到链接的时候出现下面的链接错误: uafxcw.lib(afxmem.obj) : error LNK2 ...

  5. MFC中成员变量的声明顺序与析构顺序

    第一次用博客,第一篇随笔,就写今天遇到的一个问题吧. 在VS2008的MFC对话框程序,窗口成员变量的声明顺序与其析构顺序相反,即,先声明的变量后析构,后声明的变量先析构.未在其他模式下测试. cla ...

  6. VC中的MFC到底是什么?

    1. 微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API ...

  7. MFC&Halcon之实时视频监控

    上一篇实现了在MFC的窗体内显示图片,本篇介绍如何在MFC窗体内实时显示摄像头的影像. 要实现的功能是点击一个“开始”按钮,可以显示影像,再点击“停止”按钮,可以停止显示. 因为实时显示影像需要在一个 ...

  8. LintCode389.判断数独是否合法

    LintCode简单题:判断数独是否合法 问题描述: 请判定一个数独是否有效. 该数独可能只填充了部分数字,其中缺少的数字用 . 表示. 注意事项: 一个合法的数独(仅部分填充)并不一定是可解的.我们 ...

  9. MFC快速入门 - 菜单

    本文仅用于学习交流,商业用途请支持正版!转载请注明:http://www.cnblogs.com/mxbs/p/6231104.html 打开VS2010,依次打开File – New – Proje ...

随机推荐

  1. UVa 11389 (贪心) The Bus Driver Problem

    题意: 有司机,下午路线,晚上路线各n个.给每个司机恰好分配一个下午路线和晚上路线. 给出行驶每条路线的时间,如果司机开车时间超过d,则要付加班费d×r. 问如何分配路线才能使加班费最少. 分析: 感 ...

  2. LA 2797 (平面直线图PLSG) Monster Trap

    题意: 平面上有n条线段,一次给出这n条线段的两个端点的坐标.问怪兽能否从坐标原点逃到无穷远处.(两直线最多有一个交点,且没有三线共交点的情况) 分析: 首先说明一下线段的规范相交:就是交点唯一而且在 ...

  3. BZOJ3218: a + b Problem

    题解: 先做60分... 考虑最小割,连边容量为需要付出的代价.不妨设在s割为黑色,t割为白色. (s,i,b[i])(i,t,w[i]) 关于奇怪,因为不是按份数来的.所以我们这样建图: (i,i+ ...

  4. Nginx - 指定log_format,常用于 Awstats 分析

    1. vim /etc/nginx/nginx.conf (下面格式, Awstats 使用) log_format new_log '$remote_addr - $remote_user [$ti ...

  5. 03day2

    03day1 不说了,图论题因为没有把加边的过程放到循环里导致只有 10 分.(不要吐槽我啊...)   竞赛排名 排序 [问题描述] [输入] 文件的第一行为参赛总人数 N(1≤N≤1000),从第 ...

  6. android bin目录下的.ap_是神马文件?

    resources.ap_ resources翻译过来是资源的意思 应该就是一种中间文件,可以改成rar.zip等压缩文件的类型,里面包含res.AndroidMainfest.xml.resourc ...

  7. SQLlite(WebSQL)如何排序并分页查询(SQLlite语法)

    SELECT * FROM Table ORDER BY ID DESC Limit 10,9 limit语义:跳过10行,取9行 参考: SQLite的limit用法   如果我要去11-20的Ac ...

  8. [Everyday Mathematics]20150125

    试求极限 $$\bex \lim_{x\to 0^+}\int_x^{2x} \frac{\sin^m t}{t^n}\rd t\quad\sex{m,n\in\bbN}. \eex$$

  9. 仿网易新闻客户端头条ViewPager嵌套实例

    要点: 1.重写组件public boolean onInterceptTouchEvent(MotionEvent event)方法 2.正确使用requestDisallowInterceptTo ...

  10. Islands and Bridges(POJ 2288状压dp)

    题意:给你一个图和每个点的价值,边权值为连接两点权值的积,走哈密顿通路,若到达的点和上上个点相连则价值加三点乘积,求哈密顿通路的最大价值,和最大价值哈密顿通路的条数. 分析:开始看这个题很吓人,但想想 ...