int tile; //当前方块
int **board; //指向棋盘的指针
int m_dw; //棋盘每一格的宽度
void chessBoard(int tr,int tc, int dr, int dc,int size); //棋盘覆盖算法
void DrawSubBoard(int x,int y,int w,int c); //画棋盘的x行,y列的方块,w表示宽度,c表示颜色值

void CEx0420ChessDlg::DrawSubBoard(int x, int y, int w, int c)

{
CClientDC dc(this);
COLORREF clr;
clr = RGB(c*c/256,c*c*c/256,c*c*c*c/256); //将c值转换成颜色值
CBrush br(clr);
CRect r;
r.top = 10 + x*m_dw;
r.bottom = r.top + m_dw;
r.left = 10+ y*m_dw;
r.right = r.left + m_dw;
dc.FillRect(&r,&br);
}
void CEx0420ChessDlg::chessBoard(int tr, int tc, int dr, int dc, int size)

{
if(1 == size)
{
return;
}
Sleep(500); //覆盖L型骨牌后停顿0.5秒,以便观察
int t = this->tile++;
int s = size/2;
if(dr < tr+s && dc < tc+s)
chessBoard(tr,tc,dr,dc,s);
else
{
board[tr+s-1][tc+s-1] = t;
chessBoard(tr,tc,tr+s-1,tc+s-1,s);
this->DrawSubBoard(tr+s-1,tc+s-1,m_dw,t);//递归过程中,此子棋盘中没有特殊方格,调用DrawSubBoard()函数画一个方格,并填充颜色
}
if(dr < tr+s && dc >= tc+s)
chessBoard(tr,tc+s,dr,dc,s);
else
{
board[tr+s-1][tc+s] = t;
chessBoard(tr,tc+s,tr+s-1,tc+s,s);
this->DrawSubBoard(tr+s-1,tc+s,m_dw,t);
}
if(dr >= tr+s && dc < tc+s)
chessBoard(tr+s,tc,dr,dc,s);
else
{
board[tr+s][tc+s-1] = t;
chessBoard(tr+s,tc,tr+s,tc+s-1,s);
this->DrawSubBoard(tr+s,tc+s-1,m_dw,t);
}
if(dr >= tr+s && dc >= tc+s)
chessBoard(tr+s,tc+s,dr,dc,s);
else
{
board[tr+s][tc+s] = t;
chessBoard(tr+s,tc+s,tr+s,tc+s,s);
this->DrawSubBoard(tr+s,tc+s,m_dw,t);
}
}
//点击"画棋盘"按钮消息响应函数
void CEx0420ChessDlg::OnDraw() 

{
UpdateData(); //更新编辑框中数据,重要
if(m_k > 5)
{
this->MessageBox("为了方便演示,建议输入1-5的整数!");
}
else
{
this->OnClear(); //当输入一个新的k值时,清空原有图形
CClientDC dc(this);
int k = this->m_k;
this->m_dw = 256/(int)pow(2,k); //棋盘区域大小固定为256*256,根据k值计算方格宽度
for(int i = 10;i<=267;i+=m_dw) //画棋盘
{
dc.MoveTo(10,i);
dc.LineTo(267,i);
dc.MoveTo(i,10);
dc.LineTo(i,267);
}
}
}
//点击"覆盖"按钮消息响应函数
void CEx0420ChessDlg::OnDrawboard() 

{
UpdateData();
if(m_dr >= (int)pow(2,m_k) || m_dc >= (int)pow(2,m_k) || m_dr < 0 || m_dc < 0)
//判断dr,dc中数据是否溢出
{
this->MessageBox("特殊方格行号或列号错误,请重新输入!");
}
else
{
//调用以下两个函数重新进行覆盖
this->OnClear();
this->OnDraw();
//得到特殊方格的行号和列号后,将它用黑色填充,以作标记
CClientDC dc(this);
COLORREF clr;
clr = RGB(0,0,0);
CBrush br(clr);
CRect r;
int w = 256/(int)pow(2,m_k);
r.top = 10 + m_dr*w;
r.bottom = r.top + w;
r.left = 10 + m_dc*w;
r.right = r.left + w;
dc.FillRect(&r,&br);
Sleep(1000);
this->chessBoard(0,0,this->m_dr,this->m_dc,(int)pow(2,this->m_k));
}
}
//点击“清空”按钮清空棋盘区域原有图形
void CEx0420ChessDlg::OnClear() 

{
CClientDC dc(this);
dc.Rectangle(10,10,267,267);
}
board = new int*[50];
for(int i = 0;i<50;i++)
board[i] = new int[50];四、运行结果
k=3,dr=0,dc=7时结果如下:

发表于 @ 2007年08月17日 17:40:00 | 评论( loading... ) | 举报| 收藏