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

📄 eightnumberfrm.pas

📁 此软件是八数码软件
💻 PAS
📖 第 1 页 / 共 5 页
字号:
            BFSMemo.Lines.Add( '   |');
            BFSMemo.Lines.Add( ' ' + inttostr(Queue[BFSPath[i]].status[1,1]) + ' ' + inttostr(Queue[BFSPath[i]].status[1,2]) + ' ' + inttostr(Queue[BFSPath[i]].status[1,3]) );
            BFSMemo.Lines.Add( ' ' + inttostr(Queue[BFSPath[i]].status[2,1]) + ' ' + inttostr(Queue[BFSPath[i]].status[2,2]) + ' ' + inttostr(Queue[BFSPath[i]].status[2,3]) );
            BFSMemo.Lines.Add( ' ' + inttostr(Queue[BFSPath[i]].status[3,1]) + ' ' + inttostr(Queue[BFSPath[i]].status[3,2]) + ' ' + inttostr(Queue[BFSPath[i]].status[3,3]) );
        end;//end of for i

    end;//end of if ( BFSPathTop <> 0 )----找到路径

   //路径结点总数和访问结点总数赋予对应的Label
     BFSRoadLabel.Caption := inttostr(BFSPathTop) + '  ';
     BFSVisitedLabel.Caption := inttostr(BFSTail)+ '  ';

   //设置显示路径结点总数和访问结点总数的Label为可见
     BFSRoadLabel.Visible := True;
     BFSVisitedLabel.Visible := True;

end;

/////////////////////////////////////////////////////
////BFSExist函数判断新增结点是否在之前已经生成
////之前已经生成则返回已经生成的结点的下标
////还没有生成则返回0
////入口:function----BFS(): integer
////参数:无,因为判断的是新增结点,下标必为BFSTail
/////////////////////////////////////////////////////
function TEightNumber.BFSExist: integer;
var  i,j,k : integer;        //循环变量
     same : boolean;         //标识新增结点是否与已有结点相同
     SameNumber : integer;   //如果same为True,则表示与新增结点相同的结点的下标,否则为0
begin
       SameNumber := 0;
       for k := 1 to BFSTail - 1 do
       begin
           same := True;
           for i := 1 to 3 do
           begin
              for j := 1 to 3 do
              begin
                 if (Queue[BFSTail].status[i,j] <> Queue[k].status[i,j]) then
                 begin
                     same := False;  //不相同则设置same为False
                     break;   //exit for j  ******  不相同则跳出循环
                 end;//end of if
              end;//end of for j

           if not same then break; //exit for i  ******  不相同则跳出循环

           end;//end of for i

       if same then
       begin
          SameNumber := k;    //令SameNumber记住和新增结点相同的结点的下标
          break; //exit for k
       end;//end of if

       end;//end of for k

      BFSExist := SameNumber;  //返回是否已有结点与新增结点相同,返回0和已有结点下标
end;


////////////////////////////////////////////////////////////////////
////ControlBtnClick过程显示本窗体的控件数组的序列,
////本过程只是辅助程序开发而创建的,在真正的程序中并没有使用此过程
////入口:用户点击
////参数:无
////////////////////////////////////////////////////////////////////
procedure TEightNumber.ControlBtnClick(Sender: TObject);
var i: integer; //循环变量
begin
    for i := 0 to EightNumber.ControlCount - 1 do
    begin
        showmessage(EightNumber.Controls[i].Name);
    end;

end;

//////////////////////////////////////////////////////////////
////InitializeImage过程按照初始结点的数字初始化9个Image,
////在其中画上初始结点的8个数字和空格
////入口:procedure----AStar1BtnClick()
////      procedure----AStar2BtnClick()
////      procedure----BFSBtnClick()
////参数:无
//////////////////////////////////////////////////////////////
procedure TEightNumber.InitializeImage;
var i,j:integer; //循环变量
    Image : TImage;  //指定每一个PaintBox之用
    ImageHDC : HDC;     //PaintBox的句柄
    HDCI : HDC;            //AllNumberImage的句柄
begin

    //将AllNumberImage的句柄赋值给HDCI,留作下面BitBlt之用
    HDCI := AllNumberImage.Canvas.Handle;

    for i := 1 to 3 do
    begin
       for j := 1 to 3 do
       begin
       //*********按照从上至下,从左至右的顺序依次指定PaintBox*********

       //3*i+j-3就是Image的下标
       Image := EightNumber.Controls[3*i+j-3] AS TImage;

       //将Image的句柄赋值给ImageHDC,留作下面BitBlt之用
       ImageHDC := Image.Canvas.Handle;

       //将初始结点的数字放入对应的Image中
       BitBlt(ImageHDC, 0, 0, 91, 91, HDCI, 0, Queue[1].status[i,j]*90, SRCCOPY);

       end;//end of for j

    end;//end of for i


    //*******************************************
    //ImageRepaint过程重绘9个Image,刷新9个Image
    ImageRepaint();

end;


/////////////////////////////////////////////////////
////ImageRepaint过程重绘9个Image,刷新9个Image
////入口:procedure----InitializeImage()
////参数:无
/////////////////////////////////////////////////////
procedure TEightNumber.ImageRepaint;
begin
    Image1.Repaint;
    Image2.Repaint;
    Image3.Repaint;
    Image4.Repaint;
    Image5.Repaint;
    Image6.Repaint;
    Image7.Repaint;
    Image8.Repaint;
    Image9.Repaint;
end;



/////////////////////////////////////////////////////
////MoveUp过程演示空格上移的动画
////虽然名称叫MoveUp上移,但是实际上操作过程是空格上方的数字下移
////由于PaintBox不会自动重绘,所以此算法用Paintbox实现动画,Image存储图象
////入口:procedure----AStar1ShowResult
////      procedure----AStar2ShowResult
////      procedure----BFSShowResult
////参数:row,col----当前结点的空格的行列坐标,movenumber----空格上方的数字
/////////////////////////////////////////////////////
procedure TEightNumber.MoveUp(row, col, movenumber: integer);
var i: integer; //循环变量
    HDCPaintBoxBlank : HDC;  //原来是空格Blank的PaintBox的HDC
    HDCPaintBoxNumber : HDC; //原来是数字Number的PaintBox的HDC
    HDCAllNumberImage : HDC; //存储所有空格和数字的Image的HDC
    HDCImageBlank : HDC;     //原来是空格Blank的Image的HDC
    HDCImageNumber : HDC;    //原来是数字Number的Image的HDC
    ImageBlank : TImage;     //原来是空格Blank的Image
    ImageNumber : TImage;    //原来是数字Number的Image
begin

    //*************指定空格所在的Image和空格上方数字所在的Image*************
    //指定空格所在的Image----ImageBlank
    //3*row+col-3就是空格所在的Image----ImageBlank的下标
    ImageBlank := EightNumber.Controls[3*row+col-3] AS TImage;

    //指定空格上方数字所在的Image----ImageNumber
    //3*row+col-3-3就是空格上方数字所在的Image----ImageNumber的下标
    ImageNumber := EightNumber.Controls[3*row+col-3-3] AS TImage;


    //*************将PaintBox放在与Image重合的地方*************
    //这段代码必须放在句柄赋值之前,因为PaintBox是一个指定一个区域范围的控件
    //因此要先将PaintBox定位在赋值句柄
    PaintBoxBlank.Top := ImageBlank.Top;
    PaintBoxBlank.Left := ImageBlank.Left;
    PaintBoxNumber.Top := ImageNumber.Top;
    PaintBoxNumber.Left := ImageNumber.Left;

    //*************将句柄赋值给各自的HDC,留作下面BitBlt之用*************
    HDCImageBlank := ImageBlank.Canvas.Handle;
    HDCImageNumber := ImageNumber.Canvas.Handle;
    HDCAllNumberImage := AllNumberImage.Canvas.Handle;
    HDCPaintBoxBlank := PaintBoxBlank.Canvas.Handle;
    HDCPaintBoxNumber := PaintBoxNumber.Canvas.Handle;

    //实现将空格和空格上方的数字的Image图象COPY到对应的PaintBox中的效果
    //但是不是将Image的图象直接COPY到PaintBox中
    //而是根据Image的图象在AllNumberImage的位置而将AllNumberImage的图象COPY到PaintBox中
    //这样做可以防止Image图象的不断变化特别是图象重现后而造成的图象残缺现象
    BitBlt(HDCPaintBoxBlank, 0, 0, 91, 91, HDCAllNumberImage, 0, 0, SRCCOPY);
    BitBlt(HDCPaintBoxNumber, 0, 0, 91, 91, HDCAllNumberImage, 0, 90*movenumber, SRCCOPY);

    //通过两个PaintBox实现动画效果
    for i := 0 to 90 do   //91是一个PaintBox的Height和Width
    begin
       //原来数字的PaintBoxNumber移入空格
       BitBlt(HDCPaintBoxNumber, 0, -90 + i, 91, 91, HDCAllNumberImage, 0, 0, SRCCOPY);

       //原来数字的PaintBoxNumber数字逐渐移出过程中剩下的数字
       BitBlt(HDCPaintBoxNumber, 0, i, 91, 91, HDCAllNumberImage, 0, 90*movenumber, SRCCOPY);

       //原来空格的PaintBoxBlank移入数字
       BitBlt(HDCPaintBoxBlank, 0, -90 + i, 91, 91, HDCAllNumberImage, 0, 90*movenumber, SRCCOPY);

       //由于移入空格会导致失去边界,所以画上
       PaintBoxNumber.Canvas.MoveTo(0,0);
       PaintBoxNumber.Canvas.LineTo(90,0);

       //休眠,减慢移动速度
       sleep(5);

    end; //end of for i

    //实现将两个PaintBox的图象COPY回到对应的Image中的效果
    //但是不是将PaintBox的图象直接COPY到Image中
    //而是根据PaintBox的图象在AllNumberImage的位置而将AllNumberImage的图象COPY到Image中
    //这样做可以防止PaintBox图象的不断变化特别是图象重现后而造成的图象残缺现象
    BitBlt(HDCImageBlank, 0, 0, 91, 91, HDCAllNumberImage, 0, 90*movenumber, SRCCOPY);
    BitBlt(HDCImageNumber, 0, 0, 91, 91, HDCAllNumberImage, 0, 0, SRCCOPY);

end;

/////////////////////////////////////////////////////
////MoveDown过程演示空格下移的动画
////虽然名称叫MoveDown下移,但是实际上操作过程是空格下方的数字上移
////由于PaintBox不会自动重绘,所以此算法用Paintbox实现动画,Image存储图象
////入口:procedure----AStar1ShowResult
////      procedure----AStar2ShowResult
////      procedure----BFSShowResult
////参数:row,col----当前结点的空格的行列坐标,movenumber----空格下方的数字
/////////////////////////////////////////////////////
procedure TEightNumber.MoveDown(row, col, movenumber: integer);
var i: integer; //循环变量
    HDCPaintBoxBlank : HDC;  //原来是空格Blank的PaintBox的HDC
    HDCPaintBoxNumber : HDC; //原来是数字Number的PaintBox的HDC
    HDCAllNumberImage : HDC; //存储所有空格和数字的Image的HDC
    HDCImageBlank : HDC;     //原来是空格Blank的Image的HDC
    HDCImageNumber : HDC;    //原来是数字Number的Image的HDC
    ImageBlank : TImage;     //原来是空格Blank的Image
    ImageNumber : TImage;    //原来是数字Number的Image
begin

    //*************指定空格所在的Image和空格下方数字所在的Image*************
    //指定空格所在的Image----ImageBlank
    //3*row+col-3就是空格所在的Image----ImageBlank的下标
    ImageBlank := EightNumber.Controls[3*row+col-3] AS TImage;

    //指定空格下方数字所在的Image----ImageNumber
    //3*row+col-3+3就是空格下方数字所在的Image----ImageNumber的下标
    ImageNumber := EightNumber.Controls[3*row+col-3+3] AS TImage;


    //*************将PaintBox放在与Image重合的地方*************
    //这段代码必须放在句柄赋值之前,因为PaintBox是一个指定一个区域范围的控件
    //因此要先将PaintBox定位在赋值句柄
    PaintBoxBlank.Top := ImageBlank.Top;
    PaintBoxBlank.Left := ImageBlank.Left;
    PaintBoxNumber.Top := ImageNumber.Top;
    PaintBoxNumber.Left := ImageNumber.Left;

    //*************将句柄赋值给各自的HDC,留作下面BitBlt之用*************
    HDCImageBlank := ImageBlank.Canvas.Handle;
    HDCImageNumber := ImageNumber.Canvas.Handle;
    HDCAllNumberImage := AllNumberImage.Canvas.Handle;
    HDCPaintBoxBlank := PaintBoxBlank.Canvas.Handle;
    HDCPaintBoxNumber := PaintBoxNumber.Canvas.Handle;

    //实现将空格和空格下方的数字的Image图象COPY到对应的PaintBox中的效果
    //但是不是将Image的图象直接COPY到PaintBox中
    //而是根据Image的图象在AllNumberImage的位置而将AllNumberImage的图象COPY到PaintBox中
    //这样做可以防止Image图象的不断变化特别是图象重现后而造成的图象残缺现象
    BitBlt(HDCPaintBoxBlank, 0, 0, 91, 91, HDCAllNumberImage, 0, 0, SRCCOPY);
    BitBlt(HDCPaintBoxNumber, 0, 0, 91, 91, HDCAllNumberImage, 0, 90*movenumber, SRCCOPY);

    //通过两个PaintBox实现动画效果
    for i := 0 to 90 do   //91是一个PaintBox的Height和Width
    begin
       //原来数字的PaintBoxNumber移入空格
       BitBlt(HDCPaintBoxNumber, 0, 90 - i, 91, 91, HDCAllNumberImage, 0, 0, SRCCOPY);

       //原来数字的PaintBoxNumber数字逐渐移出过程中剩下的数字
       BitBlt(HDCPaintBoxNumber, 0, - i, 91, 91, HDCAllNumberImage, 0, 90*movenumber, SRCCOPY);

       //原来空格的PaintBoxBlank移入数字
       BitBlt(HDCPaintBoxBlank, 0, 90 - i, 91, 91, HDCAllNumberImage, 0, 90*movenumber, SRCCOPY);

       //由于移入空格会导致失去边界,所以画上
       PaintBoxNumber.Canvas.MoveTo(0,90);
       PaintBoxNumber.Canvas.LineTo(90,90);

       //休眠,减慢移

⌨️ 快捷键说明

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