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

📄 main.pas

📁 刚从网上找到的连连看的源码
💻 PAS
📖 第 1 页 / 共 5 页
字号:
          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 + -