《八皇后演示软件》设计文档Word文档格式.docx
- 文档编号:16179292
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:20
- 大小:516.24KB
《八皇后演示软件》设计文档Word文档格式.docx
《《八皇后演示软件》设计文档Word文档格式.docx》由会员分享,可在线阅读,更多相关《《八皇后演示软件》设计文档Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
1.3定义
专门术语
原文
涵义
queen
皇后
flag
标示
count
计数
FindQueen
Findqueen
找皇后
OutAlgorithm
Outalgorithm
输入算法
2任务概述
2.1需求分析
在初始状态下在国际象棋上没有任何棋子。
然后顺序在第1行,第2行,…,第8行上布放棋子。
在每一行中有8个可选择位置,但在任一时刻,棋盘的合法布局都必须满足3个限制条件:
即任何两个棋子不得放在棋盘上的同一行、或者同一列、或者同一斜线上。
用回溯法。
在第n行第j列安放一个棋子时,需要记录在行方向、列方向、正斜线方向、反斜线方向的安放状态,若当前布局合法,可向下一行递规求解,否则可移走这个棋子,回复安放此棋子前的状态,试探本行的j+1列。
2.2概要设计
首先定义一个递归找全部解的递归函数FindQueen(inti),设有一个参数i,表示在1至i-1行都已有皇后合理放置的情况下,寻找第i行的合理放置。
在i行上,有8种可能的放置,列j顺次选择第1列、第2列……直至第8列。
当i行j列的放置是合理的时候,就设置与i行j列相对应的列、斜线有皇后的标志并输出皇后,并在i=7(i从0开始计算)的情况下,看皇后位置是否合适,合适则弹出对话框,并把标记flag置为1;
否则递归调用FindQueen(i+1),在第i+1行上寻找合理的放置。
一列试探结束,再试探下一列之前,清除已设置的与i行j列相对应的列、斜线有皇后的标志,让j增加1,在下一列寻找解。
要关心的是一个皇后是否已经合理的沿着每一行、每一列的斜线安置。
因此在每一列上恰好安置一个皇后,引入一个数组queen[],queen[i]记录第i行皇后的列的位置j。
另外,为了使程序在检查皇后放置的合理性
方面简易方便,引入以下三个工作数组(k仅代表其中一个元素):
●数组mk[],mk[k]=1表示第k列上有皇后;
●数组lk[],lk[k]=1表示第k条主对角线上有皇后;
●数组rk[],rk[k]=1表示第k条反对角线上有皇后;
棋盘中的行与列有如下规律:
同一条主对角线上的方格,它们的行号与列号之间的关系:
i-j+7均相等;
同一条反对角线上的方格,它们的行号与列号之间的关系:
i+j均相等。
初始化时,所有行和斜线上均没有皇后。
在第i行的j列方格放置一个合理的皇后后,准备考察第i+1行时,应在数组mk[],lk[],rk[]中为第i行、第j列的方格设定有皇后的标志;
如果前次的皇后放置导致后面的放置无论如何都不能满足要求,则回溯,重置,这时,应先清除原先在数组mk[],lk[],rk[]中设置的关于第i行、第j列有皇后的标志;
一个皇后在第i行、第j列方格内放置是合理的,由数组mk[],lk[],rk[]对应位置都没有皇后来确定。
2.3运行环境
本程序在MicrosoftVisualStudio2008环境下写成,可直接通过EXE文件直接运行。
3需求
3.1功能需求
功能类别
功能类型名称、标识符
描述
八皇后类
保护成员queen[8]
queen[i]表示第i行皇后的列的位置
保护成员flag
用来做标记
保护成员mk[8],rk[15],lk[15];
用于存放判断皇后位置后变量存放
公有成员函数C八皇后View()
用于构造八皇后视图函数并初始化
公有成员函数CBrushmy_brush
构造一个矩形画刷,将一个Bit图背景刷到框里
公有成员函数FindQueen(inti)
通过算法为八皇后定位
公有成员函数Onput(intqueen[])
找到皇后位置后输出皇后
公有成员函数OnDraw(CDC*pDC)
显示棋盘在窗口中,并重写以绘制该视图
公有成员函数afx_msgvoidOnFileNew()
建立一个响应,通过点击开始键实现摆皇后启动
3.2性能需求
3.2.1数据精确度
【说明对该软件的输入、输出数据精度的要求,可能包括传输过程中的精度。
如无此要求,可省略。
】
3.2.2时间特性要求
【说明对于该软件的时间特性要求,如对响应时间、更新处理时间、数据的转换和传送时间、解题时间等的要求。
说明软件支持的终端数和应支持的并行操作的用户数。
4总体设计
4.1基本设计概念和处理流程
4.11FindQueen()流程图
4.12Onput()流程图
5类设计
classC八皇后View:
publicCView
{
protected:
//仅从序列化创建
C八皇后View();
public:
//属性
C八皇后Doc*GetDocument()const;
intqueen[8],flag;
//queen[i]表示第i行皇后的列的位置
intmk[8],rk[15],lk[15];
//标记
CBrushmy_brush;
//笔刷
intcount;
//计数
private:
CFontm_newfont,*m_oldfont;
//字体对象
//操作
voidFindQueen(inti);
//查找皇后位置
voidOnput(intqueen[]);
//输入皇后
voidOutAlgorithm(CDC*pDC);
//输出算法
//重写
virtualvoidOnDraw(CDC*pDC);
//重写以绘制该视图
//实现
virtual~C八皇后View();
//生成的消息映射函数
afx_msgvoidOn32771();
//开始,在窗口单击以实现查找皇后
};
6数据结构设计
6.1逻辑结构设计
类图:
八皇后
#CFontm_newfont,*m_oldfont;
+intqueen[8],flag,count;
//queen[i]表示第i行皇后的列位置
+intmk[8],rk[15],lk[15];
+C八皇后Doc*GetDocument()const;
//构造函数
+virtual~C八皇后View();
//析构函数
+CBrushmy_brush;
//构造刷子
+voidFindQueen(inti);
+voidOnput(intqueen[]);
//输出皇后
+virtualvoidOnDraw(CDC*pDC);
+afx_msgvoidOn32771();
6.1.1表汇总
模块名称
功能说明
构造函数
为函数初始化
析构函数
释放数据,空间
查找皇后函数
通过算法查找出皇后位置
输出皇后函数
在相应皇后位置输入皇后
重绘
实现棋盘和算法的重绘视图
消息处理函数
通过单击窗口中相应按钮实现启动摆皇后
7模块设计
7.1
构造函数C八皇后View()
功能描述
初始化queen[],count,flag,笔刷
接口与属性
数据结构
与算法
C八皇后View:
:
C八皇后View()
CBitmapbmp;
bmp.LoadMappedBitmap(IDB_BITMAP1);
my_brush.CreatePatternBrush(&
bmp);
count=0;
inti;
flag=0;
for(i=0;
i<
=7;
i++)
{
mk[i]=0;
queen[i]=-1;
}
=14;
rk[i]=0;
lk[i]=0;
}
补充说明
7.2
消息处理程序On32771()
通过在窗口单击开始进入该函数,实现启动定位皇后和摆放皇后
voidC八皇后View:
On32771()
FindQueen(0);
if(flag==1)
AfxGetMainWnd()->
SendMessage(WM_CLOSE);
//结束项目
7.3
查找皇后FindQueen(inti)
通过递归查找全部解的算法查找皇后位置
传入0值开始重头开始查找
FindQueen(inti)
for(intj=0;
j<
8;
j++)
{
if(mk[j]==0&
&
rk[i+j]==0&
lk[7+i-j]==0)//如无冲突
queen[i]=j;
//记录第i行皇后的列的位置j
rk[i+j]=1;
//标记,下一次该反对角线上不能放皇后
mk[j]=1;
//标记,下一次该列上不能放皇后
lk[8-1+i-j]=1;
//标记,下一次该主对角线上不能放皇后
Sleep(100);
Onput(queen);
//摆放皇后
if(i==7)
STOPdl;
count++;
//计数
//MessageBox(_T("
总共种摆法!
"
));
if(dl.DoModal()==IDOK)//弹出对话框
else
flag=1;
break;
FindQueen(i+1);
//递归
if(flag==1)
//如果前次的皇后放置导致后面的放置无论如何都不能满足要求,则回溯,重置
rk[i+j]=0;
lk[8-1+i-j]=0;
mk[j]=0;
if(count==92)//当计数为92时,弹出MessageBox
Sleep(1000);
MessageBox(_T("
exit(0);
7.4
输出皇后Onput()
每次调用输入皇后并调用OnDraw()重绘棋盘
传入queen[]
Onput(intqueen[])
{
CDC*pDC=GetDC();
CBitmapbitmap;
bitmap.LoadBitmap(IDB_BITMAP2);
CDCdeMemory;
deMemory.CreateCompatibleDC(pDC);
CBitmap*poldBitmap=deMemory.SelectObject(&
bitmap);
OnDraw(pDC);
//重绘棋盘
inti;
for(i=0;
{
if(queen[i]!
=-1)
if(queen[i]==0)
pDC->
StretchBlt((i+1)*60,1*60,60,60,&
deMemory,0,0,60,60,SRCCOPY);
else
StretchBlt((i+1)*60,(queen[i]+1)*60,60,60,&
}
deMemory.SelectObject(poldBitmap);
7.5
重写绘制视图OnDraw()
重写以绘制该视图,输出背景图和棋盘
传入CDC*pDC
OnDraw(CDC*pDC)
C八皇后Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
if(!
pDoc)
return;
//刷背景图
CRectrect;
GetClientRect(rect);
///取得客户区域
pDC->
FillRect(rect,&
my_brush);
///用背景画刷填充区域
//画棋盘
CBrushbrush1;
brush1.CreateSolidBrush(RGB(0,0,0));
//黑色画笔
CBrushbrush2;
brush2.CreateSolidBrush(RGB(200,200,200));
//灰色画笔
for(inti=1;
9;
for(intj=1;
j++)
CRectrc(i*60,j*60,i*60+60,j*60+60);
if((i+j)%2==0)
FillRect(rc,&
brush1);
brush2);
//在窗口中显示算法
m_oldfont=pDC->
SelectObject(&
m_newfont);
TextOut(580,50,_T("
算法:
),strlen("
SelectObject(m_oldfont);
TextOut(580,70,_T("
voidFindQueen(inti){"
TextOut(580,90,_T("
for(intj=0;
j<
8;
j++){"
TextOut(580,110,_T("
mk[j]&
!
rk[i+j]&
lk[7+i-j]){//判断是否符合放入皇后的条件"
TextOut(580,130,_T("
queen[i]=j;
//记录第i行皇后的列的位置j"
TextOut(580,150,_T("
rk[i+j]=TRUE;
//记录从右上到左下的斜线上有皇后"
//记录从右上到左下的斜线上有皇后"
TextOut(580,170,_T("
mk[j]=TRUE;
//记录第j列有皇后"
TextOut(580,190,_T("
lk[8-1+i-j]=TRUE;
//记录从左上到右下的斜线上有皇后"
TextOut(580,210,_T("
if(i==7)"
if(i==7)"
TextOut(580,230,_T("
OnPut();
//输出摆放的方法"
//输出摆放的方法"
TextOut(580,250,_T("
else"
TextOut(580,270,_T("
FindQueen(i+1);
//递归调用"
TextOut(580,290,_T("
queen[i]=-1;
"
TextOut(580,310,_T("
rk[i+j]=FALSE;
TextOut(580,330,_T("
lk[i+8-1-j]=FALSE;
TextOut(580,350,_T("
mk[j]=FALSE;
TextOut(580,370,_T("
}"
TextOut(580,390,_T("
TextOut(580,410,_T("
}"
7接口设计
7.1外部接口
单击窗口中的开始键,使棋子摆放开始。
7.2内部接口
1.通过消息处理程序开始整个程序,先调用FindQueen();
2.FindQueen()在算法中调用Onput()实现皇后摆放;
3.Onput()中又调用OnDraw()实现棋盘重绘;
4.在FindQueen()不断递归调用,最终将所有结果找出。
8使用说明
8.1安装与初始化
【一步一步地说明为使用本软件而需要进行的安装与初始化过程,包括程序的存载形式,安装与初始化过程中的全部操作命令,系统对这些命令的反应与答复,表征安装工作完成的测试实例等。
如果有的话,还应说明安装过程中所需用到的专用软件。
8.2软件主要功能的使用说明
【对软件主要功能的操作和输入输出做简要的说明】
9设计小结
通过本次课程设计,我运用到了很多C++课本中的知识,特别是此次实训强调的类的运用。
使我们慢慢培养面向对象的设计思想,并且学习了MicrosoftVisualStudio2008中MFC可视化的常规运用,是我们在实践中慢慢积累经验。
程序采用可视化界面,易于操作,对于用户可以可选择行进行操作。
10测试用例
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 八皇后演示软件 皇后 演示 软件 设计 文档