📄 migong.~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 + -