Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2011, 16:06   #1
pavel_inferno
 
Регистрация: 13.04.2011
Сообщений: 3
По умолчанию Delphi. Разъяснение кода программы о 8 ферзях

Пожалуйста помогите с разъяснением кода!!

Задача такова: Расставить 8 ферзей на шахматной доске размером 8х8 так, чтобы ни один ферзь не оказался под ударом. Вывести все возможные комбинации.
Полностью рабочий код программы приведен ниже, заранее спасибо за помощь!))

Форма1
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Grids, XPMan, ExtCtrls, {Spin,} Math, ShellAPI;

type
    TFerz = class
      private
        str: integer;
        stl: integer;
        Ferz: TFerz;
      public
        constructor Create(a: integer; b: TFerz);
        function ugroza(n, m: integer): boolean;
        function proverka: boolean;
        function slferz: boolean;
        property str2: Integer read str;
        property stl2: Integer read stl;
        property ferz1: TFerz read Ferz;
    end;

    TForm1 = class(TForm)
      BitBtn1: TBitBtn;
      XPManifest1: TXPManifest;
    StringGrid1: TStringGrid;
    Image1: TImage;
...
    Image64: TImage;
    btn1: TButton;
      procedure BitBtn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btn1Click(Sender: TObject);
    private
      { Private declarations }
    public
       procedure SetFigures(SG:TStringGrid);
    end;

var
  Form1: TForm1;
implementation

uses Unit2, StrUtils, DateUtils;

{$R *.dfm}

constructor TFerz.Create(a: integer; b: TFerz);
begin
   inherited Create;
   stl:=a;
   Ferz:=b;
   str:=Random(9);
end;

function TFerz.slferz: boolean;
begin
   Result:=false;
   if (str<7) then
   begin
      Inc(str);
      Result:=self.proverka;
   end
   else
   begin
      if (Ferz<>nil) then
      if not Ferz.slferz then
         Result:=false
      else
      begin
         str:=0;
         Result:=self.proverka;
      end;
   end;
end;

function TFerz.ugroza(n,m: integer): boolean;
var
   k: boolean;
   r: integer;
begin
   k:=(str=n);
   if not k then
   begin
      r:=m-stl2;
      if ((str+r=n) or
      (str-r=n)) then
      k:=true;
   end;
   if ((not k) and (Ferz<>nil)) then
      k:= Ferz.ugroza(n,m);
   Result:=k;
end;

function TFerz.proverka: boolean;
var
   d: boolean;
begin
   d:=false;
   Result:=true;
   if (Ferz<>nil) then
      while (not d and ferz.ugroza(str,stl)) do
      if not self.slferz then
      begin
         Result:=false;
         d:=true;
      end;
end;


{Основная программа}
procedure TForm1.BitBtn1Click(Sender: TObject);
var
   Ferz,ferz2: TFerz;
   i,j: integer;
   img:TImage;

begin
    for i:=1 to 64 do
    begin
    img:=TImage(findComponent('Image'+intToStr(i)));
    img.Visible:=false;
    end;

   for i:=0 to 8 do
      for j:=0 to 8 do
      StringGrid1.Cells[i,j]:=' ';
      Ferz:=nil;
      for i:=0 to 7 do
      begin
         ferz2:=TFerz.Create(i,ferz);
         {if not} ferz2.proverka ;{then
          ferz:=ferz2;
      end;
     for i:=0 to 7 do
      begin
         with ferz2 do
         StringGrid1.Cells[stl2,str2]:='  ' + IntToStr(8-i);
         ferz:= ferz2.ferz1;
         ferz2.Free;
         ferz2:=ferz;
         end;

  SetFigures(StringGrid1);

        For i:=0 to 7 do
        for j:=0 to 7 do
        If StringGrid1.Cells[i,j]='  ' + IntToStr(8-i) then Form1.Image1.Visible:=True
        else Form1.Image1.Visible:=False;
end;
procedure TForm1.SetFigures(SG:TStringGrid);
var i, j: Integer;
    img:TImage;
begin
   for i:= 0 to 7 do
      for j := 0 to 7 do begin
         if SG.cells[j, i] <> ' ' then
           begin
            img         := TImage(findComponent('Image'+intToStr((i)*8+j+1)));
            img.Left    := j*51+10;
            img.Top     := i*51+10;
            img.Visible := true;
           end;
     end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
   a: array [1..100, 1..100] of TShape;
   i,j,p,g: Integer;
begin
   Form1.Height:=455;
   Form1.Width:=570;
    {Шахматная доска}
   g:=0;
   For i:=1 to 8 do
   begin
   p:=0;
   g:=g+51;
      For j:=1 to 8 do
      begin
         a[i,j]:=TShape.Create(Self);
         With a[i,j] do
         begin
            p:=p+51;
            Parent:=Form1;
            Left:=g+(Form1.Width-615);
            Top:=p+(Form1.Height-500);
            if j mod 2 <> 0 then
            begin
               if i mod 2 = 0 then
               Brush.Color:=clblack;
            end
            else
            if i mod 2 <> 0 then
            Brush.Color:=clblack;
            Width:=50;
            Height:=50;
            SendToBack;
         end;
      end;
   end;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
Form1.Close;
end;

end.

Последний раз редактировалось pavel_inferno; 12.05.2011 в 13:47.
pavel_inferno вне форума Ответить с цитированием
Старый 12.05.2011, 13:41   #2
pavel_inferno
 
Регистрация: 13.04.2011
Сообщений: 3
По умолчанию Форма2

Код:
procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
   procedure SetFigures(SG:TStringGrid);
  end;

var
  Form2: TForm2;

implementation

uses Math, Unit1;

{$R *.dfm}
procedure TForm2.SetFigures(SG:TStringGrid);
var i, j: Integer;
    img:TImage;
begin
   for i:= 0 to 7 do
      for j := 0 to 7 do begin
         if SG.cells[j, i] <> ' ' then begin
            img         := TImage(findComponent('Image'+intToStr((i)*8+j+1)));
            img.Left    := j*51+10;
            img.Top     := i*51+10;
            img.Visible := true;
         end;
      end;
end;

procedure TForm2.FormCreate(Sender: TObject);
var
   a: array [1..100, 1..100] of TShape;
   b: array [1..100, 1..100] of TImage;
   b1, b2, b3:TBitBtn;
   i,j,p,g: Integer;

begin
   Form2.Height:=455;
   Form2.Width:=570;
{Шахматная доска}
   g:=0;
   For i:=1 to 8 do
   begin
   p:=0;
   g:=g+51;
      For j:=1 to 8 do
      begin
         a[i,j]:=TShape.Create(Self);
         With a[i,j] do
         begin
            p:=p+51;
            Parent:=Form2;
            Left:=g+(Form2.Width-615);
            Top:=p+(Form2.Height-500);
            if j mod 2 <> 0 then
            begin
               if i mod 2 = 0 then
               Brush.Color:=clblack;
            end
            else
            if i mod 2 <> 0 then
            Brush.Color:=clblack;
            Width:=50;
            Height:=50;
            SendToBack;
         end;
      end;
  end;


  {
   Form2.Height:=455;
   Form2.Width:=570;

   g:=0;
   For i:=0 to 7 do
   begin
   p:=0;
   g:=g+51;
      For j:=0 to 7 do
      begin
         b[i,j]:=TImage.Create(Self);
         With b[i,j] do
         begin
            p:=p+51;
            Parent:=Form2;
            Left:=g+(Form2.Width-615);
            Top:=p+(Form2.Height-500);
            Width:=50;
            Height:=50;
            Picture:=Image1.Picture;
            BringToFront;
            Visible:=false;
            Transparent:=true;
         end;
      end;
  end;
          }
    {Кнонка закрыть}
     b3:=TBitBtn.Create(Self);
   with b3 do
   begin
      Left:=440;
      Top:=342;
      Width:=100;
      Height:=30;
      Caption:='Закрыть';
      Font.Size:=10;
      Parent:=Form2;
   end;

end;
end.

Последний раз редактировалось pavel_inferno; 12.05.2011 в 13:47.
pavel_inferno вне форума Ответить с цитированием
Старый 12.05.2011, 13:43   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Вы правда думаете, что кто-то будем вам бесплатно комментировать эту не читаемую простыню? Хоть тег [CODE] (значок #) бы использовали для сохранения форматирования\подсветки.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 12.05.2011, 13:50   #4
pavel_inferno
 
Регистрация: 13.04.2011
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Вы правда думаете, что кто-то будем вам бесплатно комментировать эту не читаемую простыню? Хоть тег [CODE] (значок #) бы использовали для сохранения форматирования\подсветки.
исправил, поможете разобраться?
pavel_inferno вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выполнение js кода при завершении программы на delphi xamel87 Общие вопросы Delphi 1 08.05.2011 18:45
Разъяснение кода программы ) Expelio Помощь студентам 2 25.03.2010 00:00
Операция сравнения: требуется разъяснение akokin PHP 13 26.01.2010 16:35
разъяснение кода БД Ежедневника на Delphi TaYgA Помощь студентам 1 19.10.2009 17:33
структура моей бд. Нужно разъяснение. Roof Microsoft Office Access 1 27.12.2008 18:23