MFC实现数独(1)
雨天纷纷扰扰,数月里每日有雨,这个夏天不热,写这个数独的动机很简单:实践是最好的成长方式,想要获得自信,必有这么一遭,我躲不过。至于决定记录成博客,则是因为很久没有写文章,经常感觉脑海里很空白,屡次开口却不知道想说什么!我在迷茫啊。
这是一篇记录摸索过程的文章,主要记录遇到的问题,适合毫无基础的共同探讨,也请路过的高手多指点。
思路很简单:
①数独随机生成算法,打算采用递归遍历方式,满足条件的保存下来,内存数组保存或者写入文件。
②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)的更多相关文章
- MFC实现数独(2)
		主要功能描述: 运行程序后对话框会显示一个9x9的待输入数独区域,并提供随机生成数独和生成数独按钮,生成数独按钮后会创建数独并随机显示其中一个至数独区域,随机生成数独会从已生成的数独中随机获取一个并显 ... 
- 蓝桥杯---数独(模拟 || dfs)
		[编程题](满分33分) "数独"是当下炙手可热的智力游戏.一般认为它的起源是"拉丁方块",是大数 学家欧拉于1783年发明的. 如图[1.jpg]所示:6x6 ... 
- 数独GUI程序项目实现
		数独GUI程序项目实现 导语:最近玩上了数独这个游戏,但是找到的几个PC端数独游戏都有点老了...我就想自己做一个数独小游戏,也是一个不错的选择. 前期我在网上简单地查看了一些数独游戏的界面,代码.好 ... 
- vs2010静态链接MFC库报链接错误
		由于需要将MFC程序在其它电脑上运行,所以需要将动态链接的MFC改成静态链接,本以为很简单,没想到链接的时候出现下面的链接错误: uafxcw.lib(afxmem.obj) : error LNK2 ... 
- MFC中成员变量的声明顺序与析构顺序
		第一次用博客,第一篇随笔,就写今天遇到的一个问题吧. 在VS2008的MFC对话框程序,窗口成员变量的声明顺序与其析构顺序相反,即,先声明的变量后析构,后声明的变量先析构.未在其他模式下测试. cla ... 
- VC中的MFC到底是什么?
		1. 微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API ... 
- MFC&Halcon之实时视频监控
		上一篇实现了在MFC的窗体内显示图片,本篇介绍如何在MFC窗体内实时显示摄像头的影像. 要实现的功能是点击一个“开始”按钮,可以显示影像,再点击“停止”按钮,可以停止显示. 因为实时显示影像需要在一个 ... 
- LintCode389.判断数独是否合法
		LintCode简单题:判断数独是否合法 问题描述: 请判定一个数独是否有效. 该数独可能只填充了部分数字,其中缺少的数字用 . 表示. 注意事项: 一个合法的数独(仅部分填充)并不一定是可解的.我们 ... 
- MFC快速入门 - 菜单
		本文仅用于学习交流,商业用途请支持正版!转载请注明:http://www.cnblogs.com/mxbs/p/6231104.html 打开VS2010,依次打开File – New – Proje ... 
随机推荐
- UVa 1647 (递推) Computer Transformation
			题意: 有一个01串,每一步都会将所有的0变为10,将所有的1变为01,串最开始为1. 求第n步之后,00的个数 分析: 刚开始想的时候还是比较乱的,我还纠结了一下000中算是有1个00还是2个00 ... 
- BZOJ2337: [HNOI2011]XOR和路径
			题解: 异或操作是每一位独立的,所以我们可以考虑每一位分开做. 假设当前正在处理第k位 那令f[i]表示从i到n 为1的概率.因为不是有向无环图(绿豆蛙的归宿),所以我们要用到高斯消元. 若有边i-& ... 
- WinDbg调试命令汇总
			一. 1. !address eax 查看对应内存页的属性 2. vertarget 显示当前进程的大致信息 3 !peb 显示process Environment Block 4. lmvm 可以 ... 
- POJ 3469 Dual Core CPU (最小割建模)
			题意 现在有n个任务,两个机器A和B,每个任务要么在A上完成,要么在B上完成,而且知道每个任务在A和B机器上完成所需要的费用.然后再给m行,每行 a,b,w三个数字.表示如果a任务和b任务不在同一个机 ... 
- java读取照片信息 获取照片拍摄时的经纬度
			项目结构 源码:ImageInfo.zip 第一步:添加需要的架包metadate-extractor.jar 架包下载地址:https://code.google.com/p/metadata-ex ... 
- zoj  2027 Travelling Fee
			// 题意 : 一个人要去旅行 给你起点和终点 求最少花费 其中花费为经过路径的总费用减去该路径的中的最大花费段// 直接搜索 稍微加了个剪枝 主要是数据规模小#include <iostrea ... 
- Solr DIH以Mysql为数据源批量创建索引
			演示使用solr管理后台,以mysql为数据源,批量建索引的方法 测试于:Solr 4.5.1, mmseg4j 1.9.1, Jdk 1.6.0_45, Tomcat 6.0.37 | CentOS ... 
- hadoop中日志聚集问题
			遇到的问题: 当点击上面的logs时,会出现下面问题: 这个解决方案为: By default, Hadoop stores the logs of each container in the nod ... 
- 陈发树云南白药股权败诉真相 取胜仅差三步 z
			22亿元现金,三年只拿到750多万元的利息.福建富豪陈发树的云南生意可谓失望之极.在漫长的官司中,曾经有绝处逢生之机的陈发树,连告状的主体都没有找准,岂能同强大的国企扳手腕?陈发树律师团距取胜只有三步 ... 
- setImageResource和setImageDrawable区别
			ImageView设置图片的方式有很多钟,可以在xml里面写android:src=”@drawable/xxx”,也可以在java代码里面设置. 在java里面的设置方式也有多种,方法包括:setI ... 
