《八皇后演示软件》设计文档Word文档格式.docx

上传人:b****5 文档编号:16179292 上传时间:2022-11-21 格式:DOCX 页数:20 大小:516.24KB
下载 相关 举报
《八皇后演示软件》设计文档Word文档格式.docx_第1页
第1页 / 共20页
《八皇后演示软件》设计文档Word文档格式.docx_第2页
第2页 / 共20页
《八皇后演示软件》设计文档Word文档格式.docx_第3页
第3页 / 共20页
《八皇后演示软件》设计文档Word文档格式.docx_第4页
第4页 / 共20页
《八皇后演示软件》设计文档Word文档格式.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

《八皇后演示软件》设计文档Word文档格式.docx

《《八皇后演示软件》设计文档Word文档格式.docx》由会员分享,可在线阅读,更多相关《《八皇后演示软件》设计文档Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。

《八皇后演示软件》设计文档Word文档格式.docx

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测试用例

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1