Advertisement
SmnVadik

Lab 7.4

Sep 13th, 2023
514
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.62 KB | None | 0 0
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls,
  8.   Vcl.Imaging.pngimage;
  9.  
  10. type
  11.   TForm1 = class(TForm)
  12.     PaintBox1: TPaintBox;
  13.     Timer1: TTimer;
  14.     Button1: TButton;
  15.     procedure Button1Click(Sender: TObject);
  16.     procedure Timer1Timer(Sender: TObject);
  17.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  18.   private
  19.     { Private declarations }
  20.   public
  21.     { Public declarations }
  22.   end;
  23.  
  24. var
  25.     i, j, k, l, s, z: integer;
  26.  
  27.     A_x, A_y, A_nx, A_ny, A_kol: integer; // А - начальная позиция коня
  28.  
  29.     B_x, B_y, B_nx, B_ny, B_kol: integer;
  30.     // В - возможная позиция коня (с помощью В мы будим делать всевозможные ходы из А и проверять их на количество возможных ходов из них,
  31.     // позиция из которой будит минимальное количество ходов станет позицией А то есть мы перейдем на эту позицию и занесем её в массив посещенных
  32.     // клеток)
  33.  
  34.     R_x, R_y: integer;
  35.  
  36.     str: String;
  37.  
  38.     mov1: Array [1 .. 8] of integer; // - |-D алгоритм
  39.     mov2: Array [1 .. 8] of integer; // -
  40.  
  41.     mov3: Array [0 .. 1000, 0 .. 1000] of integer;
  42.     // массив для уже пройденных ходов
  43.  
  44.     Form1: TForm1;
  45.  
  46. implementation
  47.  
  48. {$R *.dfm}
  49.  
  50. procedure TForm1.Button1Click(Sender: TObject);
  51. begin
  52.     // ---------------Отрисовка доски-----------------------------------
  53.     for i := 1 to 4 do
  54.     begin
  55.  
  56.         for j := 1 to 4 do
  57.         begin
  58.  
  59.             PaintBox1.Canvas.Brush.Color := clBlack;
  60.             PaintBox1.Canvas.Rectangle(0 + l, 0 + k, 80 + l, 80 + k);
  61.             l := l + 80;
  62.             PaintBox1.Canvas.Brush.Color := clWhite;
  63.             PaintBox1.Canvas.Rectangle(0 + l, 0 + k, 80 + l, 80 + k);
  64.             l := l + 80;
  65.         end;
  66.         l := 0;
  67.         k := k + 80;
  68.         for j := 1 to 4 do
  69.         begin
  70.  
  71.             PaintBox1.Canvas.Brush.Color := clWhite;
  72.             PaintBox1.Canvas.Rectangle(0 + l, 0 + k, 80 + l, 80 + k);
  73.             l := l + 80;
  74.             PaintBox1.Canvas.Brush.Color := clBlack;
  75.             PaintBox1.Canvas.Rectangle(0 + l, 0 + k, 80 + l, 80 + k);
  76.             l := l + 80;
  77.         end;
  78.         l := 0;
  79.         k := k + 80;
  80.     end;
  81.  
  82.     mov1[1] := 2;
  83.     mov1[2] := 1;
  84.     mov1[3] := 2;
  85.     mov1[4] := -2;
  86.     mov1[5] := -1;
  87.     mov1[6] := -1;
  88.     mov1[7] := 1;
  89.     mov1[8] := -2;
  90.     mov2[1] := -1;
  91.     mov2[2] := -2;
  92.     mov2[3] := 1;
  93.     mov2[4] := 1;
  94.     mov2[5] := -2;
  95.     mov2[6] := 2;
  96.     mov2[7] := 2;
  97.     mov2[8] := -1;
  98.  
  99.     l := 0;
  100.     k := 1;
  101.     i := 0;
  102.     j := 1; // переобозначение после отрисовки доски (чтобы не вводить новые переменные)
  103.  
  104.     A_kol := 8;
  105.     B_kol := 8;
  106.     // количество возможных ходов в начале обозначается максимальным числом ходов коня из клетки то есть 8
  107.  
  108.     A_x := 40;
  109.     A_y := 40; // координаты начальной клетки
  110.  
  111.     mov3[A_x][A_y] := 1; // заносим начальное положение коня кок посещенное
  112.  
  113.     PaintBox1.Canvas.Brush.Color := clred;
  114.     PaintBox1.Canvas.Ellipse(A_x - 4, A_y - 4, A_x + 4, A_y + 4);
  115.     str := IntToStr(k);
  116.     PaintBox1.Canvas.TextOut(A_x + 6, A_y + 6, str);
  117.     PaintBox1.Canvas.Brush.Color := clWhite;
  118.  
  119.     Timer1.Enabled := True;
  120.     Button1.Enabled := False;
  121.  
  122. end;
  123.  
  124. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  125. begin
  126.     //Form1.Close;
  127.  
  128. end;
  129.  
  130. procedure TForm1.Timer1Timer(Sender: TObject);
  131. begin
  132.     k := k + 1;
  133.     for i := 1 to 63 do
  134.     // цикл определяющий общее количество необходимых ходов для обхода доски 8*8=64 всего 64 но -1(начальное положение) всего 63
  135.     begin
  136.         for s := 1 to 8 do // цикл проверяющий на возможный ход коня  из А
  137.         begin
  138.             if (A_x + mov1[s] * 80 >= 40) and (A_y + mov2[s] * 80 >= 40) and
  139.               (A_x + mov1[s] * 80 <= 600) and (A_y + mov2[s] * 80 <= 600) and
  140.               (mov3[A_x + mov1[s] * 80][A_y + mov2[s] * 80] = 0)
  141.             // число не должно выходить за рамки доски и присутствовать в массиве посещенных ходов.
  142.  
  143.             then
  144.             begin
  145.                 A_kol := 0;
  146.                 A_nx := A_x + mov1[s] * 80;
  147.                 A_ny := A_y + mov2[s] * 80;
  148.  
  149.                 for z := 1 to 8 do
  150.                 // цикл подсчитывающий количество возможных ходов из предполагаемого хода
  151.                 begin
  152.                     if (A_nx + mov1[z] * 80 >= 40) and
  153.                       (A_ny + mov2[z] * 80 >= 40) and
  154.                       (A_nx + mov1[z] * 80 <= 600) and
  155.                       (A_ny + mov2[z] * 80 <= 600) and
  156.                       (mov3[A_nx + mov1[z] * 80][A_ny + mov2[z] * 80] = 0) then
  157.  
  158.                         A_kol := A_kol + 1;
  159.  
  160.                 end;
  161.  
  162.             end;
  163.  
  164.             if B_kol > A_kol then
  165.             begin
  166.                 B_x := A_nx;
  167.                 B_y := A_ny;
  168.                 B_kol := A_kol;
  169.             end;
  170.  
  171.         end;
  172.  
  173.         PaintBox1.Canvas.pen.Color := clred;
  174.         PaintBox1.Canvas.pen.Width := 5;
  175.         PaintBox1.Canvas.MoveTo(A_x, A_y);
  176.         PaintBox1.Canvas.LineTo(B_x, B_y);
  177.         PaintBox1.Canvas.Brush.Color := clWhite;
  178.  
  179.         A_x := B_x;
  180.         A_y := B_y;
  181.         A_nx := 0;
  182.         A_ny := 0;
  183.         A_kol := 8;
  184.         B_kol := 8;
  185.         mov3[A_x][A_y] := 1;
  186.  
  187.         // --------------------------Обозначение положения коня на доске и пройденные им клетки--------------------------------------------------
  188.         PaintBox1.Canvas.Brush.Color := clred;
  189.         PaintBox1.Canvas.Ellipse(A_x - 4, A_y - 4, A_x + 4, A_y + 4);
  190.  
  191.         str := IntToStr(k);
  192.         Inc(K);
  193.         PaintBox1.Canvas.TextOut(A_x + 6, A_y + 6, str);
  194.         PaintBox1.Canvas.Brush.Color := clWhite;
  195.         Sleep(100);
  196.     end;
  197.     j := j + 1;
  198.  
  199.     if i = 64 then
  200.     begin
  201.         Timer1.Enabled := False;
  202.     end;
  203.  
  204. end;
  205.  
  206. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement