⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 thdcalcq.cpp

📁 八皇后问题
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "thdCalcQ.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------

//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall TthdCalc::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------

__fastcall TthdCalc::TthdCalc(bool CreateSuspended)
    : TThread(CreateSuspended)
{
    FreeOnTerminate = true;

    PAnimate = frmQueen->chkAnimation->Checked;
    ErrAnimate = frmQueen->chkError->Checked;
    AniSpeed = frmQueen->tbSpeed->Position * 100;
    Queens.SetFQueen(frmQueen->Queens.GetFQueen(),frmQueen->Queens.GetFQueenPos());

    AnsiString AppPath = ExtractFilePath(Application->ExeName)+"BitMaps\\";

    WQueen = new TPicture;
    GQueen = new TPicture;
    WErrQ  = new TPicture;
    GErrQ  = new TPicture;
    WPoint = new TPicture;
    GPoint = new TPicture;
    
    WQueen->LoadFromFile(AppPath+"WQueen.bmp");
    GQueen->LoadFromFile(AppPath+"GQueen.bmp");
    WErrQ->LoadFromFile(AppPath+"WErrQ.bmp");
    GErrQ->LoadFromFile(AppPath+"GErrQ.bmp");
    WPoint->LoadFromFile(AppPath+"WPoint.bmp");
    GPoint->LoadFromFile(AppPath+"GPoint.bmp");
}
//---------------------------------------------------------------------------
void __fastcall TthdCalc::OnTerminate()
{   
    delete WQueen;
    delete GQueen;
    delete WErrQ;
    delete GErrQ;
    delete WPoint;
    delete GPoint;
}
//---------------------------------------------------------------------------
void __fastcall TthdCalc::Execute()
{
    QPoint CurQ;

    if(Queens.GetFQueenPos() == 1)
        CurQ = TellGrid(1,IMGLEN+1);
    else
        CurQ = TellGrid(1,1);

    while(!Queens.isFull())
    {
        Queens.PushQueen(CurQ);
        

        if(PAnimate)
        {
            PutChessMan(CurQ,QUEEN);
            Sleep(200);
        }

        QPoint temp = Queens.InLine();

        if(temp.ColPos == -1)
        {
            CurQ = TellGrid(1,(CurQ.Y+IMGLEN+1));

            if(CurQ.Y == Queens.GetFQueen().Y)
                CurQ = TellGrid(1,CurQ.Y+IMGLEN+1);
        }
        else
        {
            if(PAnimate && ErrAnimate)
                AnimateError(temp,CurQ);

            do
            {
                CurQ = Queens.PopQueen();

				if(CurQ.ColPos == -1)
				{
					Synchronize(EnableNewQueen);

					return;
				}
				else
				{
					CurQ.ColPos++;

                    if(PAnimate)
                    {
					    TRect rect;
					    rect.Left   = CurQ.X;
					    rect.Top    = CurQ.Y;
					    rect.Right  = rect.Left + IMGLEN;
					    rect.Bottom = rect.Top  + IMGLEN;

                        frmQueen->pbBoard->Canvas->Lock();
					    frmQueen->pbBoard->Canvas->Brush->Color = CurQ.COLOR;
					    frmQueen->pbBoard->Canvas->FillRect(rect);
                        frmQueen->pbBoard->Update();
                        frmQueen->pbBoard->Canvas->Unlock();
                    }
				}
            }
            while(CurQ.ColPos == GRIDCOUNT);

            CurQ = TellGrid(CurQ.X+IMGLEN+1,CurQ.Y);

            if(PAnimate)
                Synchronize(ShowChessMan);
        }
    }

    Synchronize(ShowChessMan);
    Synchronize(CopyQueens);
    Synchronize(EnableNewQueen);
    MessageBox(frmQueen->Handle,"皇后摆完了!","提示",MB_ICONASTERISK);
}
//---------------------------------------------------------------------------
QPoint __fastcall TthdCalc::TellGrid(const int X,const int Y)
{
    QPoint Grid;

    for(int i=0;i<GRIDCOUNT;++i)
    {
        for(int j=0;j<GRIDCOUNT;++j)
        {
            int gLeft   = i*(IMGLEN+1);
            int gTop    = j*(IMGLEN+1);
            int gRight  = (i+1)*(IMGLEN+1);
            int gBottom = (j+1)*(IMGLEN+1);

            if(X>=gLeft && X<gRight && Y>=gTop && Y<gBottom)
            {
                Grid.X = gLeft+1;
                Grid.Y = gTop+1;
                Grid.ColPos = i;

                if((i%2) == (j%2))
                    Grid.COLOR = clGreen;
                else
                    Grid.COLOR = clWhite;

                return Grid;
            }
        }
    }

    return Grid;
}
//---------------------------------------------------------------------------
void __fastcall TthdCalc::PutChessMan(const QPoint &Grid,const QImage myImage,bool isQ)
{
    TGraphic *Image;

    switch(myImage)
    {
    case QUEEN:
        {
            if(Grid.COLOR == clWhite)
                Image = WQueen->Graphic;
            else
                Image = GQueen->Graphic;

            break;
        }
    case ERRQUEEN:
        {
            if(Grid.COLOR == clWhite)
                Image = WErrQ->Graphic;
            else
                Image = GErrQ->Graphic;

            break;
        }
    case QPOINT:
        {
            if(Grid.COLOR == clWhite)
                Image = WPoint->Graphic;
            else
                Image = GPoint->Graphic;

            break;
        }
    }

    frmQueen->pbBoard->Canvas->Lock();
    frmQueen->pbBoard->Canvas->Draw(Grid.X,Grid.Y,Image);
    frmQueen->pbBoard->Canvas->Unlock();

    if(isQ)
    {
        frmQueen->pbBoard->Canvas->Lock();
        frmQueen->pbBoard->Canvas->Pen->Color = clRed;
        frmQueen->pbBoard->Canvas->MoveTo(Grid.X+1,Grid.Y+1);
        frmQueen->pbBoard->Canvas->LineTo(Grid.X+IMGLEN-1,Grid.Y+1);
        frmQueen->pbBoard->Canvas->LineTo(Grid.X+IMGLEN-1,Grid.Y+IMGLEN-1);
        frmQueen->pbBoard->Canvas->LineTo(Grid.X+1,Grid.Y+IMGLEN-1);
        frmQueen->pbBoard->Canvas->LineTo(Grid.X+1,Grid.Y+1);
        frmQueen->pbBoard->Canvas->Unlock();
    }

    frmQueen->pbBoard->Canvas->Lock();
    frmQueen->pbBoard->Update();  
    frmQueen->pbBoard->Canvas->Unlock();
}
//---------------------------------------------------------------------------
void __fastcall TthdCalc::AnimateError(const QPoint &FromGrid,const QPoint &ToGrid)
{
    QPoint Grid = FromGrid;

    if(FromGrid.X == ToGrid.X)
    {
        if(FromGrid.Y < ToGrid.Y)
        {
            Grid.Y += IMGLEN + 1;
            Grid.COLOR = Grid.COLOR==clGreen?clWhite:clGreen;

            while(Grid.Y != ToGrid.Y)
            {
                PutChessMan(Grid,QPOINT);
                Grid.Y += IMGLEN + 1;
                Grid.COLOR = Grid.COLOR==clGreen?clWhite:clGreen;
                Sleep(AniSpeed);
            }

            TRect rect;
            rect.Left   = ToGrid.X;
            rect.Top    = ToGrid.Y;
            rect.Right  = rect.Left + IMGLEN;
            rect.Bottom = rect.Top  + IMGLEN;

            frmQueen->pbBoard->Canvas->Lock();
            frmQueen->pbBoard->Canvas->Brush->Color = ToGrid.COLOR;
            frmQueen->pbBoard->Canvas->Unlock();

            for(int i=0;i<2;++i)
            {
                PutChessMan(ToGrid,ERRQUEEN);
                Sleep(AniSpeed);
                frmQueen->pbBoard->Canvas->Lock();
                frmQueen->pbBoard->Canvas->FillRect(rect);
                frmQueen->pbBoard->Canvas->Unlock();
                PutChessMan(ToGrid,QUEEN);
                Sleep(AniSpeed);
            }

            frmQueen->pbBoard->Canvas->Lock();
            frmQueen->pbBoard->Canvas->FillRect(rect);

            while(rect.Top != FromGrid.Y)
            {
                rect.Top    -= IMGLEN + 1;
                rect.Bottom -= IMGLEN + 1;

                if(frmQueen->pbBoard->Canvas->Brush->Color == clGreen)
                    frmQueen->pbBoard->Canvas->Brush->Color = clWhite;
                else
                    frmQueen->pbBoard->Canvas->Brush->Color = clGreen;
                frmQueen->pbBoard->Canvas->FillRect(rect);
            }

            frmQueen->pbBoard->Update();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -