Changeset 32 for trunk/UGame.pas


Ignore:
Timestamp:
Oct 12, 2019, 11:01:10 PM (5 years ago)
Author:
chronos
Message:
  • Modified: In computer form allow to stop AI play.
  • Modified: Optimized moves history computation using MoveAll without animation.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UGame.pas

    r31 r32  
    124124    procedure Render(Canvas: TCanvas; CanvasSize: TPoint);
    125125    procedure MoveAll(Direction: TMoveDirection);
     126    procedure MoveAllAnimate(Direction: TMoveDirection);
    126127    procedure MoveAllAndUpdate(Direction: TMoveDirection);
    127128    procedure MoveTile(SourceTile, TargetTile: TTile);
     
    505506begin
    506507  case Direction of
    507     drLeft: begin
    508       Result := TArea.Create(1, 0, Board.Size.X - 1, Board.Size.Y - 1);
    509     end;
    510     drUp: begin
    511       Result := TArea.Create(0, 1, Board.Size.X - 1, Board.Size.Y - 1);
    512     end;
    513     drRight: begin
    514       Result := TArea.Create(Board.Size.X - 2, 0, 0, Board.Size.Y - 1);
    515     end;
    516     drDown: begin
    517       Result := TArea.Create(0, Board.Size.Y - 2, Board.Size.X - 1, 0);
    518     end;
     508    drNone: Result := TArea.Create(0, 0, 0, 0);
     509    drLeft: Result := TArea.Create(1, 0, Board.Size.X - 1, Board.Size.Y - 1);
     510    drUp: Result := TArea.Create(0, 1, Board.Size.X - 1, Board.Size.Y - 1);
     511    drRight: Result := TArea.Create(Board.Size.X - 2, 0, 0, Board.Size.Y - 1);
     512    drDown: Result := TArea.Create(0, Board.Size.Y - 2, Board.Size.X - 1, 0);
    519513  end;
    520514end;
     
    629623      RenderTile(Canvas, Board.Tiles[Y, X], TileRect);
    630624    end;
     625end;
     626
     627procedure TGame.MoveAll(Direction: TMoveDirection);
     628var
     629  P: TPoint;
     630  PNew: TPoint;
     631  I: Integer;
     632  Area: TArea;
     633begin
     634  if Direction = drNone then Exit;
     635  if not CanMoveDirection(Direction) then Exit;
     636  FMoving := True;
     637  FBoardUndo.Assign(Board);
     638  FCanUndo := True;
     639  Area := GetMoveArea(Direction);
     640  Board.ClearMerged;
     641  for I := 0 to Max(Board.Size.X, Board.Size.Y) - 1 do begin
     642    P := Area.P1;
     643    while P.Y <> Area.P2.Y + Area.Increment.Y do begin
     644      P.X := Area.P1.X;
     645      while P.X <> Area.P2.X + Area.Increment.X do begin
     646        PNew := P + DirectionDiff[Direction];
     647        if IsValidPos(PNew) then begin
     648          if (Board.Tiles[P.Y, P.X].Value <> 0) then begin
     649            if (Board.Tiles[PNew.Y, PNew.X].Value = 0) then begin
     650              Board.Tiles[P.Y, P.X].Moving := True;
     651              Board.Tiles[PNew.Y, PNew.X].Value := Board.Tiles[P.Y, P.X].Value;
     652              Board.Tiles[PNew.Y, PNew.X].Merged := Board.Tiles[P.Y, P.X].Merged;
     653              Board.Tiles[P.Y, P.X].Value := 0;
     654              Board.Tiles[P.Y, P.X].Merged := False;
     655            end else
     656            if (not Board.Tiles[P.Y, P.X].Merged) and (not Board.Tiles[PNew.Y, PNew.X].Merged) and
     657            (Board.Tiles[PNew.Y, PNew.X].Value = Board.Tiles[P.Y, P.X].Value) then begin
     658              Board.Tiles[P.Y, P.X].Moving := True;
     659              Board.Tiles[PNew.Y, PNew.X].Value := Board.Tiles[PNew.Y, PNew.X].Value + Board.Tiles[P.Y, P.X].Value;
     660              Board.Tiles[PNew.Y, PNew.X].Merged := True;
     661              Board.Tiles[P.Y, P.X].Value := 0;
     662              Board.Tiles[P.Y, P.X].Merged := False;
     663              Score := Score + Board.Tiles[PNew.Y, PNew.X].Value;
     664            end;
     665          end;
     666        end;
     667        Inc(P.X, Area.Increment.X);
     668      end;
     669      Inc(P.Y, Area.Increment.Y);
     670    end;
     671    DoChange;
     672  end;
     673  FMoving := False;
    631674end;
    632675
     
    707750begin
    708751  Result := False;
     752  if Direction = drNone then Exit;
    709753  Area := GetMoveArea(Direction);
    710754  P := Area.P1;
     
    729773end;
    730774
    731 procedure TGame.MoveAll(Direction: TMoveDirection);
     775procedure TGame.MoveAllAnimate(Direction: TMoveDirection);
    732776var
    733777  P: TPoint;
     
    823867begin
    824868  HighestValue := Board.GetHighestTileValue;
    825   MoveAll(Direction);
     869  MoveAllAnimate(Direction);
    826870
    827871  NewTile := FillRandomTile;
Note: See TracChangeset for help on using the changeset viewer.