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

📄 migong.~pas

📁 数据结构大作业 迷宫求解 用delphi做的 有源码
💻 ~PAS
字号:
unit migong;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Menus;

type              //定义一个记录类型
  node=record     //一个变体记录
    state:0..1;    //当前位置
    rect:trect;    //定义一个长方形变量
    bitmap:tbitmap;   //点阵图变量
    index:integer;   //方块编号
    order:0..1;    //顺序
  end;
  TForm1 = class(TForm)
    Panel2: TPanel;
    Button1: TButton;
    Button2: TButton;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    Label1: TLabel;
    Label2: TLabel;
    Button4: TButton;
    Panel1: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    Panel5: TPanel;
    Timer1: TTimer;
    Label3: TLabel;
    Label4: TLabel;
    ComboBox3: TComboBox;
    Label5: TLabel;
    Label6: TLabel;
    Timer2: TTimer;
    ComboBox4: TComboBox;
    Label7: TLabel;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    procedure FormPaint(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);

    procedure Timer2Timer(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  listnode:array[1..10,1..10] of node;    //10*10的数组
  tm,i0,j0:integer;
implementation

{$R *.dfm}
uses Unit2;
procedure TForm1.FormPaint(Sender: TObject);  //画格子
var
  i,j:integer;
begin

tm:=0;
for i:=1 to 10 do
   for j:=1 to 10 do
     begin
     form1.Canvas.Pen.Color:=clred;  //红色的笔
     form1.Canvas.Pen.Width:=4;  //格子宽度
     form1.canvas.Rectangle(50+40*(i-1),50+40*(j-1),90+40*(i-1),90+40*(j-1));
     end;  //画矩形
for i:=1 to 10 do
   for j:=1 to 10 do
   begin
   listnode[i,j].rect:=rect(50+40*(j-1),50+40*(i-1),90+40*(j-1),90+40*(i-1));   //每个结点对应一个方块
   listnode[i,j].index:=10*(i-1)+j;   //给结点赋植   1,1对应1号,1,2对应2号 类推
   listnode[i,j].order:=0;           //
   end;
    listnode[1,1].state:=0; //1,1为0

  end;

procedure TForm1.Button1Click(Sender: TObject);   //重排  随机出现的地方都置1 为1的地方都画网格
var i,j,k1,k,h,n:integer;
    a:array[1..100] of integer;    //定义字符串类型
begin
randomize;         //做随机数
form1.hide;        //隐藏再show出来,实现刷新功能
form1.Show;

n:=0;
for i:=1 to 100 do a[i]:=0;
k:=strtoint(combobox1.Items[combobox1.ItemIndex]); //数值转换,字符串转整形
while n<k do            //判断是否有选障碍数
begin
   for i:=1 to 10 do
   for j:=1 to 10 do
      listnode[i,j].state:=0;      //state:0..1
  k1:=random(101);  //随机生成0到101 不包括101的数
  if a[k1]=0 then
  begin
    a[k1]:=1;                //随机出现的地方都置1
    n:=n+1;
  end;
  if a[k1]=1 then a[k1]:=1;   //如果a[k1]=1 将1赋给a[k1]
end; //while end

for h:=1 to 100 do
begin
   if a[h]=1 then
   begin
     for i:=1 to 10 do
       for j:=1 to 10 do
           if listnode[i,j].index=h then listnode[i,j].state:=1;
   end;

end;

for i:=1 to 10 do
  for j:=1 to 10 do
  begin
    if listnode[i,j].state=1 then
    begin
    form1.Canvas.Brush.Style:=bscross;  //垂直交又网状
    form1.Canvas.FillRect(listnode[i,j].rect);    //填充矩形,坐标为结点坐标
    end;
  end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);  //文字闪烁

begin
tm:=tm+1;
if odd(tm) then       //判断是否为奇数
label3.Visible:=false        //不可见
else
label3.Visible:=true;
if tm>100000 then tm:=0;
end;


procedure TForm1.Button2Click(Sender: TObject); //开始执行
var i,j,k:integer;
    s:string;
    bitmap:tbitmap;
begin
timer2.Enabled:=false;

bitmap:=tbitmap.Create;
bitmap.LoadFromFile('e:\pic\laoshu.bmp');
k:=strtoint(combobox3.Items[combobox3.ItemIndex]);   //开始的位置
for i:=1 to 10 do
  for j:=1 to 10 do
  begin
   if (listnode[i,j].index=k) and (listnode[i,j].state=1) then  //判断开始的地方是否障碍也就是网格
   begin    //开始的格数不等于编号and有障碍

   showmessage('有障碍,你不能从此开始,请选择别处开始');
   end;
   if (listnode[i,j].index=k) and (listnode[i,j].state=0) then    //没有障碍则填充老鼠图
   begin
   form1.Canvas.Brush.Bitmap:=bitmap;
   form1.Canvas.FillRect(listnode[i,j].rect);
   end;
  end;
for i:=1 to 10 do
  for j:=1 to 10 do
  begin
   if (listnode[i,j].index=k) and (listnode[i,j].state=0) then
   begin
   i0:=i;
   j0:=j;
   end;
 end;

s:=combobox2.Items[combobox2.ItemIndex];
if s='深度优先方式' then  timer2.Enabled:=true;
end;


procedure TForm1.Timer2Timer(Sender: TObject);
var i,j,i1,j1:integer;
    bitmap:tbitmap;
begin //深度优先
i1:=i0;
j1:=j0;
bitmap:=tbitmap.Create;
bitmap.LoadFromFile('e:\pic\laoshu.bmp');

if (j1=1)and (listnode[i1,j1+1].state=1)and(listnode[i1+1,j1].state=0) then i0:=i0+1;  //右边有障碍 下面没有则向下
if (j1=1)and (listnode[i1,j1+1].order=1)and(listnode[i1+1,j1].state=0) then i0:=i0+1;  //右边为边界 下面没有障碍 则向下
if (j1=1)and (listnode[i1,j1+1].state=0)and(listnode[i1+1,j1].state=0) then i0:=i0+1; // 哟变没有障碍 下面有障碍 则向右
if (j1=1)and (listnode[i1,j1+1].state=0)and(listnode[i1+1,j1].state=1) then j0:=j0+1; //都有障碍则重来
if (j1=1)and (listnode[i1,j1+1].state=1)and(listnode[i1+1,j1].state=1) then
begin
timer2.Enabled:=false;
if messagedlg('不能完成游戏,要重来吗?',mtwarning,[mbyes,mbno],0)=mryes then
button1.Click
else
button4.Click;
end;
if (j1=1)and (listnode[i1,j1+1].order=1)and(listnode[i1+1,j1].state=1) then
begin
timer2.Enabled:=false;
if messagedlg('不能完成游戏,要重来吗?',mtwarning,[mbyes,mbno],0)=mryes then
button1.Click
else
button4.Click;
end;

if listnode[i1+1,j1].state=0 then i0:=i0+1;
if (listnode[i1,j1+1].state=1) and (listnode[i1,j1-1].state=1) and (listnode[i1+1,j1].state=1) then
begin
timer2.Enabled:=false;
if messagedlg('不能完成游戏,要重来吗?',mtwarning,[mbyes,mbno],0)=mryes then
button1.Click
else
button4.Click;
end;
if (listnode[i1,j1+1].state=1) and (listnode[i1,j1-1].order=1) and (listnode[i1+1,j1].state=1) then
begin
timer2.Enabled:=false;
if messagedlg('不能完成游戏,要重来吗?',mtwarning,[mbyes,mbno],0)=mryes then
button1.Click
else
button4.Click;
end;
if (listnode[i1,j1+1].state=0)and(listnode[i1,j1+1].order=0) and (listnode[i1,j1-1].state=0)and(listnode[i1,j1-1].order=0)and (listnode[i1+1,j1].state=1) then
begin
if combobox4.Items[combobox4.ItemIndex]='左' then j0:=j0-1
else
j0:=j0+1;
end;                                      //以下为向左走的实现方法,原理和向右的类似
if (listnode[i1,j1+1].order=1) and (listnode[i1,j1-1].state=0)and (listnode[i1+1,j1].state=1) then j0:=j0-1;
//if (listnode[i1,j1-1].state=1) and (listnode[i1,j1+1].order=1)and (listnode[i1+1,j1].state=0) then i0:=i0+1;
//if (listnode[i1,j1+1].state=1) and (listnode[i1,j1-1].order=1)and (listnode[i1+1,j1].state=0) then i0:=i0+1;
if (listnode[i1,j1+1].state=0) and (listnode[i1,j1-1].order=1) and (listnode[i1+1,j1].state=1) then j0:=j0+1;
if (listnode[i1,j1-1].state=1) and (listnode[i1+1,j1].state=1) and (listnode[i1,j1+1].state=0) then j0:=j0+1;
if (listnode[i1,j1+1].state=1) and (listnode[i1+1,j1].state=1) and (listnode[i1,j1-1].state=0) then j0:=j0-1;

listnode[i0,j0].order:=1;
for i:=1 to 10 do
  for j:=1 to 10 do
  begin
    if (listnode[i,j].state=1)and(listnode[i,j].order<>1) then
    begin
    form1.Canvas.Brush.Style:=bscross;
    form1.Canvas.FillRect(listnode[i,j].rect);
    end;
  end;
form1.Canvas.Brush.bitmap:=bitmap;
form1.Canvas.FillRect(listnode[i0,j0].rect);
if (i0=10)or(j0=10) then                 //达到边界
begin
 timer2.Enabled:=false;
 if messagedlg('恭喜你!',mtconfirmation,[mbyes,mbno],0)=mryes then
 button1.click
 else
   if messagedlg('你真的要退出吗?',mtconfirmation,[mbyes,mbno],0)=mryes then
   button4.click;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var k,i,j:integer;
begin
form1.Hide;
form1.Show;
k:=strtoint(combobox3.Items[combobox3.ItemIndex]);
for i:=1 to 10 do
  for j:=1 to 10 do
  begin
   if (listnode[i,j].index=k) and (listnode[i,j].state=0) then
   begin
   i0:=i;
   j0:=j;
   end;
end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
form1.Top:=20;
form1.Left:=250;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
if messagedlg('确定要退出吗?',mtwarning,[mbyes,mbno],0)=mryes then
form1.Close;
end;

procedure TForm1.N2Click(Sender: TObject);
begin
Form1.close
end;

procedure TForm1.N4Click(Sender: TObject);
begin
Form2.ShowModal;
end;

end.

⌨️ 快捷键说明

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