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

📄 w_case.pas

📁 这是一个八数码问题代码。可以很清楚的看到它整个执行过程
💻 PAS
字号:
unit w_Case;

interface

type
  TWStatus=(Up,Down,Left,Right);
  TWNum = class(TObject)
  private
    FValue: Integer;
  public
    constructor Create(intNum:integer); reintroduce; overload;
    property Value: Integer read FValue;
  end;
  TWCell = class(TObject)
  private
    FCenter: TWNum;
    FDown: TWCell;
    FLeft: TWCell;
    FRight: TWCell;
    FUp: TWCell;
  public
    constructor Create(Num:Integer); reintroduce; overload;
    destructor Destroy; override;
    property Center: TWNum read FCenter;
    property Down: TWCell read FDown write FDown;
    property Left: TWCell read FLeft write FLeft;
    property Right: TWCell read FRight write FRight;
    property Up: TWCell read FUp write FUp;
  end;

  TWCells = class(TObject)
  private
    FActiveCell: TWCell;
    FRowStart: Integer;
    FRowEnd: Integer;
    FColStart: Integer;
    FColEnd: Integer;
    procedure CreateCellsAndNum(Row, Col: integer);
    procedure InitCellsStatus;
    procedure SwapCellPos(SCell,DCell:TWCell);
  public
    Cells: Array of array of TWCell;
    constructor Create(intRow,intCol:integer); reintroduce; overload;
    procedure InitCells(Row,Col:integer);
    procedure Move(Status:TWStatus);
    property RowStart: Integer read FRowStart;
    property RowEnd: Integer read FRowEnd;
    property ColStart: Integer read FColStart;
    property ColEnd: Integer read FColEnd;
  end;


implementation

constructor TWCells.Create(intRow,intCol:integer);
begin
  // TODO -cMM: TWCells.Create default body inserted
  inherited Create;
  InitCells(intRow,intcol);
  FActiveCell:=Cells[0,0];
end;

procedure TWCells.CreateCellsAndNum(Row, Col: integer);
var
  intI,intJ :integer;
  intNum:integer;
begin
  SetLength(Cells,Row,col);
  intNum:=0;
  for intI :=Low(Cells)  to High(Cells) do
  begin
    for intJ :=Low(Cells[intI])  to High(Cells[intI])  do
    begin
      Cells[inti,intj]:=TWCell.Create(intNum);
      intNum:=intNum+1;
    end;
  end;
end;

procedure TWCells.InitCells(Row,Col:integer);
begin

  // TODO -cMM: TWCells.InitCells default body inserted
  assert(Row<>0,'行数不能为空');
  assert(Col<>0,'列数不能为空');
  //构建单元格及数值
  CreateCellsAndNum(Row, Col);
  //初始化每个格子周边状态
  InitCellsStatus;
end;

procedure TWCells.InitCellsStatus;
var
  intI,intJ :integer;
begin
  FRowStart:=Low(Cells);
  FRowEnd:=High(Cells);
  FColStart:=Low(Cells[Low(Cells)]);
  FColEnd:=High(Cells[High(Cells)]);
  for intI :=FRowStart  to FRowEnd do
  begin
    for intJ :=FColStart  to FColEnd  do
    begin
      if intI=FRowStart then
      begin
        Cells[inti,intJ].Up:=nil;
      end
      else
      begin
        Cells[intI,intJ].Up:=Cells[intI-1,intJ];
      end;
      if intI=FRowEnd then
      begin
        Cells[inti,intJ].Down:=nil
      end
      else
      begin
        Cells[intI,intJ].Down:=cells[intI+1,intJ];
      end;
      if intJ=FColStart then
      begin
        Cells[intI,intJ].Left:=nil
      end
      else
      begin
        Cells[intI,intJ].Left:=Cells[intI,intJ-1];
      end;
      if intJ=FColEnd Then
      begin
        Cells[intI,intJ].Right:=nil
      end
      else
      begin
        Cells[intI,intJ].Right :=Cells[intI,intJ+1];
      end;
    end;
  end;
end;

procedure TWCells.Move(Status:TWStatus);
begin
  // TODO -cMM: TWCells.Move default body inserted
    case Status of
      Up:
      begin
        if FActiveCell.Up <>nil then
        begin
         SwapCellPos(FActiveCell,FactiveCell.Up);
         FactiveCell:=FActiveCell.Up;
        end;
      end;
      Down:
      begin
        if FActiveCell.Down <>nil then
        begin
          SwapCellPos(FActiveCell,FActiveCell.Down);
          FactiveCell:=FActiveCell.Down;
        end;
      end;
      Left:
      begin
        if FActiveCell.Left <>nil then
        begin
          SwapCellPos(FActiveCell,FactiveCell.Left );
          FactiveCell:=FActiveCell.Left;
        end;
      end;
      Right:
      begin
        if FActiveCell.Right <>nil then
        begin
         SwapCellPos(FactiveCell,FactiveCell.Right);
         FactiveCell:=FActiveCell.Right;

        end;

      end;
    end;
end;

procedure TWCells.SwapCellPos(SCell,DCell:TWCell);
var
  TempNum:TWNum;
begin
  // TODO -cMM: TWCells.SwapCell default body inserted
  TempNum:=SCell.Center;
  SCell.FCenter :=DCell.FCenter;
  DCell.FCenter :=TempNum;

end;

constructor TWCell.Create(Num:Integer);
begin
  // TODO -cMM: TWCell.Create default body inserted
  inherited create;
  FCenter:=TWNum.Create(Num);
end;

destructor TWCell.Destroy;
begin
  // TODO -cMM: TWCell.Destroy default body inserted
  FCenter.Free;
  inherited;
end;

constructor TWNum.Create(intNum:integer);
begin
  // TODO -cMM: TWNum.Create default body inserted
  inherited Create;
  FValue:=intNum;

end;

end.

⌨️ 快捷键说明

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