📄 eightnumberfrm.pas
字号:
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 + -