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 ...
随机推荐
- Ajax、Comet与Websocket
从 http 协议说起 1996年IETF HTTP工作组发布了HTTP协议的1.0版本 ,到现在普遍使用的版本1.1,HTTP协议经历了17 年的发展.这种分布式.无状态.基于TCP的请求/响应式 ...
- 获取某月第一天,最后一天的sql server脚本 【转】http://blog.csdn.net/chaoowang/article/details/9167969
这是计算一个月第一天的SQL 脚本: SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) --当月的第一天 SELECT DATEADD(mm, DA ...
- Mysql线程池优化笔记
Mysql线程池优化我是总结了一个站长的3篇文章了,这里我整理到一起来本文章就分为三个优化段了,下面一起来看看. Mysql线程池系列一(Thread pool FAQ) 首先介绍什么是mys ...
- Java 7爆最新漏洞,10年前的攻击手法仍有效
英文原文:New Reflection API affected by a known 10+ years old attack 据 SECLISTS 透露,他们发现新的 Reflection API ...
- java正则表达式Pattern和Matcher
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...
- redis错误汇总
1.redis因为内存不够而启动失败 Microsoft Open Tech group 在 GitHub上开发了一个REDIS Win64的版本,项目地址是:https://github.com/M ...
- CXF之八 RESTFul服务
JAX-RS概述 JAX-RS是Java提供用于开发RESTful Web服务基于注解(annotation)的API.JAX-RS旨在定义一个统一的规范,使得Java程序员可以使用一套固定的接口来开 ...
- 《Python基础教程(第二版)》学习笔记 -> 第九章 魔法方法、属性和迭代器
准备工作 >>> class NewStyle(object): more_code_here >>> class OldStyle: more_code_here ...
- 学习笔记 - 深究Bitmap压缩避免OOM的核心inSampleSize的最佳取值
/** * 测试代码,通过在SDCard根目录放置几种不同大小的图片, 来自动测试压缩方式是否有效同时看是否会内存不够. * * @since * By:AsionTang * At:2014年3月2 ...
- python 常用模块
1.os模块 os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果. os.name:返回当前操作系统名称('posix', 'nt', 'os2' ...