📄 main.pas
字号:
end;
minX1 := min(RoadPoint1.XID,stPoint.XID);
RoadPoint1.throut := false;
RoadPoint2.throut := false;
if (RoadPoint1.ID <> -1) and (RoadPoint2.ID <> -1) then
begin
//check road;
if minX1+1 > Max(i,stPoint.XID)-1 then
RoadPoint1.throut := true;
for i1 := minX1+1 to Max(RoadPoint1.XID,stPoint.XID)-1 do
begin
if not(FSprites[i1][miny].Dead) then
begin
RoadPoint1.throut := false;
break;
end;
if i1 = Max(RoadPoint1.XID,stPoint.XID)-1 then
RoadPoint1.throut := true
end;
minX1 := min(RoadPoint2.XID,endPoint.XID);
if minx1+1 > Max(RoadPoint2.XID,endPoint.XID)-1 then
RoadPoint2.throut := true;
for j1 := minx1+1 to Max(RoadPoint2.XID,endPoint.XID)-1 do
begin
if not(FSprites[j1][maxy].Dead) then
begin
RoadPoint2.throut := false;
break;
end;
if j1 = Max(RoadPoint2.XID,endPoint.XID)-1 then //throut
RoadPoint2.throut := true;
end;
if RoadPoint1.throut and RoadPoint2.throut then
begin
result := true;
exit;
end;
end;
end;
end
else
for i := FromX to ToX do //low(FSprites)-1 //high(FSprites)+1
begin
Addi := 0; addj := 0;
if i = stPoint.XID then
Addi := 1
else
Addi := 0;
if i = endPoint.XID then
Addj := -1
else
Addj := 0;
//else Addi := 0;
for j := miny + Addi to MaxY + Addj do
begin
IniPoint;
if (i <> -1) and (i <> high(FSprites)+1) then
begin
if not(FSprites[i][j].dead) then
break;
if (j = MaxY + Addj) then
begin
//get one road
AssignPoint(FSprites[i][stPoint.YID],RoadPoint1);
AssignPoint(FSprites[i][endPoint.YID],RoadPoint2);
end;
end
else if i = -1 then
begin
//get one road
AssignPoint(FSprites[i+1][stPoint.YID],RoadPoint1);
AssignPoint(FSprites[i+1][endPoint.YID],RoadPoint2);
RoadPoint1.XID := -1;
RoadPoint2.XID := -1;
RoadPoint1.X := FSprites[i+1][stPoint.YID].X - FImageH;
RoadPoint2.X := FSprites[i+1][endPoint.YID].X - FImageH;
end
else if i = high(FSprites)+1 then
begin
//get one road
AssignPoint(FSprites[i-1][stPoint.YID],RoadPoint1);
AssignPoint(FSprites[i-1][endPoint.YID],RoadPoint2);
RoadPoint1.XID := high(FSprites)+1;
RoadPoint2.XID := high(FSprites)+1;
RoadPoint1.X := FSprites[i-1][stPoint.YID].X + FImageH ;
RoadPoint2.X := FSprites[i-1][endPoint.YID].X + FImageH;
end;
minX1 := min(RoadPoint1.XID,stPoint.XID);
RoadPoint1.throut := false;
RoadPoint2.throut := false;
if (RoadPoint1.ID <> -1) and (RoadPoint2.ID <> -1) then
begin
//check road;
if minX1+1 > Max(i,stPoint.XID)-1 then
RoadPoint1.throut := true;
for i1 := minX1+1 to Max(RoadPoint1.XID,stPoint.XID)-1 do
begin
if not(FSprites[i1][miny].Dead) then
begin
RoadPoint1.throut := false;
break;
end;
if i1 = Max(RoadPoint1.XID,stPoint.XID)-1 then
RoadPoint1.throut := true
end;
minX1 := min(RoadPoint2.XID,endPoint.XID);
if minx1+1 > Max(RoadPoint2.XID,endPoint.XID)-1 then
RoadPoint2.throut := true;
for j1 := minx1+1 to Max(RoadPoint2.XID,endPoint.XID)-1 do
begin
if not(FSprites[j1][maxy].Dead) then
begin
RoadPoint2.throut := false;
break;
end;
if j1 = Max(RoadPoint2.XID,endPoint.XID)-1 then //throut
RoadPoint2.throut := true;
end;
if RoadPoint1.throut and RoadPoint2.throut then
begin
result := true;
exit;
end;
end;
end;
end;
end;
function getPassY(FormY,ToY: integer;down: boolean=false): boolean;
var
i,j,i1,j1: integer;
begin
result := false;
if down then
for j := ToY downto FormY do //low(FSprites[0])-1 high(FSprites[0])+1
begin
Addi := 0; addj := 0;
if j = stPoint.YID then
begin
if stPoint.XID > endPoint.XID then
Addj := -1
else
Addi := 1;
end;
if j = endPoint.YID then
begin
if stPoint.XID > endPoint.XID then
Addi := 1
else
Addj := -1;
end;
for i := minX + addi to maxX + addj do
begin
IniPoint;
if (j <> low(FSprites[0])-1) and (j<>high(FSprites[0])+1) then
begin
if not(FSprites[i][j].dead) then
break;
if (i = maxX + addj) then //get one road
begin
AssignPoint(FSprites[stPoint.XID][j],RoadPoint1);
AssignPoint(FSprites[endPoint.XID][j],RoadPoint2);
end;
end
else if (j = low(FSprites[0])-1) then
begin
AssignPoint(FSprites[stPoint.XID][j+1],RoadPoint1);
AssignPoint(FSprites[endPoint.XID][j+1],RoadPoint2);
RoadPoint1.YID := -1;
RoadPoint2.YID := -1;
RoadPoint1.Y := FSprites[stPoint.XID][j+1].Y - FImageH ;
RoadPoint2.Y := FSprites[endPoint.XID][j+1].Y - FImageH;
end
else if (j=high(FSprites[0])+1) then
begin
AssignPoint(FSprites[stPoint.XID][j-1],RoadPoint1);
AssignPoint(FSprites[endPoint.XID][j-1],RoadPoint2);
RoadPoint1.YID := high(FSprites[0])+1;
RoadPoint2.YID := high(FSprites[0])+1;
RoadPoint1.Y := FSprites[stPoint.XID][j-1].Y + FImageH ;
RoadPoint2.Y := FSprites[endPoint.XID][j-1].Y + FImageH;
end;
//check raod
RoadPoint1.throut := false;
RoadPoint2.throut := false;
if (RoadPoint1.ID <> -1) and (RoadPoint2.ID <> -1) then
begin
minY1 := min(RoadPoint1.YID,stPoint.YID);
if minY1+1 > max(RoadPoint1.YID,stPoint.YID)-1 then
RoadPoint1.throut := true;
for i1 := minY1+1 to max(RoadPoint1.YID,stPoint.YID)-1 do
begin
if not(FSprites[RoadPoint1.XID][i1].Dead) then
begin
RoadPoint1.throut := false;
break;
end;
if i1 = max(RoadPoint1.YID,stPoint.YID) -1 then
RoadPoint1.throut := true;
end;
minY1 := min(RoadPoint2.YID,endPoint.YID);
if minY1+1 > max(RoadPoint2.YID,endPoint.YID)-1 then
RoadPoint2.throut := true;
for j1 := minY1+1 to max(RoadPoint2.YID,endPoint.YID)-1 do
begin
if not(FSprites[RoadPoint2.XID][j1].Dead) then
begin
RoadPoint2.throut := false;
break;
end;
if j1 = max(RoadPoint2.YID,endPoint.YID)-1 then //throut
RoadPoint2.throut := true;
end;
if RoadPoint1.throut and RoadPoint2.throut then
begin
result := true;
exit;
end;
end;
end;
end
else
for j := FormY to ToY do //low(FSprites[0])-1 high(FSprites[0])+1
begin
Addi := 0; addj := 0;
if j = stPoint.YID then
begin
if stPoint.XID > endPoint.XID then
Addj := -1
else
Addi := 1;
end;
if j = endPoint.YID then
begin
if stPoint.XID > endPoint.XID then
Addi := 1
else
Addj := -1;
end;
for i := minX + addi to maxX + addj do
begin
IniPoint;
if (j <> low(FSprites[0])-1) and (j<>high(FSprites[0])+1) then
begin
if not(FSprites[i][j].dead) then
break;
if (i = maxX + addj) then //get one road
begin
AssignPoint(FSprites[stPoint.XID][j],RoadPoint1);
AssignPoint(FSprites[endPoint.XID][j],RoadPoint2);
end;
end
else if (j = low(FSprites[0])-1) then
begin
AssignPoint(FSprites[stPoint.XID][j+1],RoadPoint1);
AssignPoint(FSprites[endPoint.XID][j+1],RoadPoint2);
RoadPoint1.YID := -1;
RoadPoint2.YID := -1;
RoadPoint1.Y := FSprites[stPoint.XID][j+1].Y - FImageH ;
RoadPoint2.Y := FSprites[endPoint.XID][j+1].Y - FImageH;
end
else if (j=high(FSprites[0])+1) then
begin
AssignPoint(FSprites[stPoint.XID][j-1],RoadPoint1);
AssignPoint(FSprites[endPoint.XID][j-1],RoadPoint2);
RoadPoint1.YID := high(FSprites[0])+1;
RoadPoint2.YID := high(FSprites[0])+1;
RoadPoint1.Y := FSprites[stPoint.XID][j-1].Y + FImageH ;
RoadPoint2.Y := FSprites[endPoint.XID][j-1].Y + FImageH;
end;
//check raod
RoadPoint1.throut := false;
RoadPoint2.throut := false;
if (RoadPoint1.ID <> -1) and (RoadPoint2.ID <> -1) then
begin
minY1 := min(RoadPoint1.YID,stPoint.YID);
if minY1+1 > max(RoadPoint1.YID,stPoint.YID)-1 then
RoadPoint1.throut := true;
for i1 := minY1+1 to max(RoadPoint1.YID,stPoint.YID)-1 do
begin
if not(FSprites[RoadPoint1.XID][i1].Dead) then
begin
RoadPoint1.throut := false;
break;
end;
if i1 = max(RoadPoint1.YID,stPoint.YID) -1 then
RoadPoint1.throut := true;
end;
minY1 := min(RoadPoint2.YID,endPoint.YID);
if minY1+1 > max(RoadPoint2.YID,endPoint.YID)-1 then
RoadPoint2.throut := true;
for j1 := minY1+1 to max(RoadPoint2.YID,endPoint.YID)-1 do
begin
if not(FSprites[RoadPoint2.XID][j1].Dead) then
begin
RoadPoint2.throut := false;
break;
end;
if j1 = max(RoadPoint2.YID,endPoint.YID)-1 then //throut
RoadPoint2.throut := true;
end;
if RoadPoint1.throut and RoadPoint2.throut then
begin
result := true;
exit;
end;
end;
end;
end;
end;
begin
InitializeID;
AX := ABS(stPoint.XID - endPoint.XID);
AY := ABS(stPoint.YID - endPoint.YID);
if ((AX = 1) and (AY = 0)) or ((AY = 1) and (AX = 0)) then
begin
AssignPoint(StPoint,RoadPoint1);
AssignPoint(EndPoint,RoadPoint2);
RoadPoint1.throut := true;
RoadPoint2.throut := true;
exit;
end;
if stPoint.YID > endPoint.YID then
begin
tem := stPoint.YID;
stPoint.YID := endPoint.YID;
endPoint.YID := tem;
tem := stPoint.XID;
stPoint.XID := endPoint.XID;
endPoint.XID := tem;
end;
minX := min(stPoint.XID,endPoint.XID);
minY := min(stPoint.YID,endPoint.YID);
MaxX := max(stPoint.XID,endPoint.XID);
maxY := max(stPoint.YID,endPoint.YID);
IniPoint;
if stPoint.X >= endPoint.X then
begin
if getPassX(low(FSprites)-1,endPoint.XID,true) then exit;
if getPassX(endPoint.XID,stPoint.XID) then exit;
if getPassX(stPoint.XID,high(FSprites)+1) then exit;
end
else
begin
if getPassX(low(FSprites)-1,stPoint.XID,true) then exit;
if getPassX(stPoint.XID,endPoint.XID) then exit;
if getPassX(endPoint.XID,high(FSprites)+1) then exit;
end;
{ for i := low(FSprites)-1 to high(FSprites)+1 do
begin
Addi := 0; addj := 0;
if i = stPoint.XID then
Addi := 1
else
Addi := 0;
if i = endPoint.XID then
Addj := -1
else
Addj := 0;
//else Addi := 0;
for j := miny + Addi to MaxY + Addj do
begin
IniPoint;
if (i <> -1) and (i <> high(FSprites)+1) then
begin
if not(FSprites[i][j].dead) then
break;
if (j = MaxY + Addj) then
begin
//get one road
AssignPoint(FSprites[i][stPoint.YID],RoadPoint1);
AssignPoint(FSprites[i][endPoint.YID],RoadPoint2);
end;
end
else if i = -1 then
begin
//get one road
AssignPoint(FSprites[i+1][stPoint.YID],RoadPoint1);
AssignPoint(FSprites[i+1][endPoint.YID],RoadPoint2);
RoadPoint1.XID := -1;
RoadPoint2.XID := -1;
RoadPoint1.X := FSprites[i+1][stPoint.YID].X - FImageH;
RoadPoint2.X := FSprites[i+1][endPoint.YID].X - FImageH;
end
else if i = high(FSprites)+1 then
begin
//get one road
AssignPoint(FSprites[i-1][stPoint.YID],RoadPoint1);
AssignPoint(FSprites[i-1][endPoint.YID],RoadPoint2);
RoadPoint1.XID := high(FSprites)+1;
RoadPoint2.XID := high(FSprites)+1;
RoadPoint1.X := FS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -