1

Тема: Матриця

Сьогодні згадав про  фільм "Матриця" і мені захотілось зробити  написати  програму  яка буде відображати на  чорному фоні 1 і 0 зеленого кольору. Написав, працює . Але я не можу зрозуміти я поліпшити мій код. Допоможіть кому не лінь.

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Timer2: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
q,z,x,i,f:integer;
  taras:array  [0..1600] of integer;
  max :array  [0..1600] of integer;
implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
i:=-60;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
form1.top:=0;
i:=i+30;
for f:= 1 to 1600 do
begin
q:=taras[f]+20;
z:=max[f]+30;
begin
with Canvas do
begin
font.Color:=clgreen;
font.Size:=20;
randomize;
textout(3,z+i,inttostr (random(2)));
 textout(q,z+i-90,inttostr (random(2)));
textout(q*2,z+i-60,inttostr (random(2)));
textout(q*3,z+i-150,inttostr (random(2)));
textout(q*4,z+i-180,inttostr (random(2)));

textout(q*5,z+i-60,inttostr (random(2)));
textout(q*6,z+i-150,inttostr (random(2)));
textout(q*7,z+i-180,inttostr (random(2)));

textout(q*8,z+i-60,inttostr (random(2)));
textout(q*9,z+i-180,inttostr (random(2)));
textout(q*10,z+i-150,inttostr (random(2)));

textout(q*11,z+i-60,inttostr (random(2)));
textout(q*12,z+i-180,inttostr (random(2)));
textout(q*13,z+i-150,inttostr (random(2)));

textout(q*14,z+i-60,inttostr (random(2)));
textout(q*15,z+i-180,inttostr (random(2)));
textout(q*16,z+i-150,inttostr (random(2)));
textout(q*17,z+i-60,inttostr (random(2)));
textout(q*18,z+i-180,inttostr (random(2)));
textout(q*19,z+i-150,inttostr (random(2)));

textout(q*20,z+i-60,inttostr (random(2)));
textout(q*21,z+i-180,inttostr (random(2)));
textout(q*22,z+i-150,inttostr (random(2)));
textout(q*23,z+i-60,inttostr (random(2)));
textout(q*24,z+i-180,inttostr (random(2)));
textout(q*25,z+i-150,inttostr (random(2)));
textout(q*26,z+i-60,inttostr (random(2)));
textout(q*27,z+i-180,inttostr (random(2)));
textout(q*28,z+i-150,inttostr (random(2)));
textout(q*29,z+i-60,inttostr (random(2)));
textout(q*30,z+i-180,inttostr (random(2)));
textout(q*31,z+i-150,inttostr (random(2)));
textout(q*32,z+i-60,inttostr (random(2)));
textout(q*33,z+i-180,inttostr (random(2)));
textout(q*34,z+i-150,inttostr (random(2)));
textout(q*35,z+i-60,inttostr (random(2)));
textout(q*36,z+i-180,inttostr (random(2)));
textout(q*37,z+i-150,inttostr (random(2)));

if i>=form1.clientHeight+30 then
begin
i:=-60;
end;
end;
end;
end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
for f:= 1 to 1600 do
begin
q:=taras[f]+20;
z:=max[f]+30;
begin
with Canvas do
begin
font.Color:=clgreen;
font.Size:=20;
randomize;
textout(q*38,z+i,inttostr (random(2)));
 textout(q*39,z+i-90,inttostr (random(2)));
textout(q*40,z+i-60,inttostr (random(2)));
textout(q*41,z+i-150,inttostr (random(2)));
textout(q*42,z+i-180,inttostr (random(2)));

textout(q*43,z+i-60,inttostr (random(2)));
textout(q*44,z+i-150,inttostr (random(2)));
textout(q*45,z+i-180,inttostr (random(2)));

textout(q*46,z+i-60,inttostr (random(2)));
textout(q*47,z+i-180,inttostr (random(2)));
textout(q*48,z+i-150,inttostr (random(2)));

textout(q*49,z+i-60,inttostr (random(2)));
textout(q*50,z+i-180,inttostr (random(2)));
textout(q*51,z+i-150,inttostr (random(2)));

textout(q*52,z+i-60,inttostr (random(2)));
textout(q*53,z+i-180,inttostr (random(2)));
textout(q*54,z+i-150,inttostr (random(2)));
textout(q*55,z+i-60,inttostr (random(2)));
textout(q*56,z+i-180,inttostr (random(2)));
textout(q*57,z+i-150,inttostr (random(2)));

textout(q*58,z+i-60,inttostr (random(2)));
textout(q*59,z+i-180,inttostr (random(2)));
textout(q*60,z+i-150,inttostr (random(2)));
textout(q*61,z+i-60,inttostr (random(2)));
textout(q*62,z+i-180,inttostr (random(2)));
textout(q*63,z+i-150,inttostr (random(2)));
textout(q*64,z+i-60,inttostr (random(2)));
textout(q*65,z+i-180,inttostr (random(2)));
textout(q*66,z+i-150,inttostr (random(2)));
textout(q*67,z+i-60,inttostr (random(2)));
textout(q*68,z+i-180,inttostr (random(2)));
textout(q*69,z+i-150,inttostr (random(2)));
textout(q*70,z+i-60,inttostr (random(2)));
textout(q*71,z+i-180,inttostr (random(2)));
textout(q*72,z+i-150,inttostr (random(2)));
textout(q*73,z+i-60,inttostr (random(2)));
textout(q*74,z+i-180,inttostr (random(2)));
textout(q*75,z+i-150,inttostr (random(2)));
textout(q*76,z+i-60,inttostr (random(2)));
textout(q*77,z+i-150,inttostr (random(2)));
textout(q*78,z+i-120,inttostr (random(2)));
textout(q*79,z+i-150,inttostr (random(2)));
textout(q*80,z+i-180,inttostr (random(2)));
textout(q*81,z+i-150,inttostr (random(2)));
textout(q*82,z+i-150,inttostr (random(2)));
textout(q*83,z+i-90,inttostr (random(2)));
end;
end;
end;
end;
end.
Подякували: Chemist-i1

2

Re: Матриця

Китайський стиль програмування у Вас, але все одно дякую за Ваш внесок.

3

Re: Матриця

1. Розставте відступи.
2. Масиви taras і max, якщо не помиляюся (а через п.1 важко не помилитися), ніде не ініціалізуються, тобто заповнені нулями. Отже, їх можна прибрати, а кожен вираз taras[f] і max[f] замінити на 0.
3. Якщо у вас є 10 (майже) однакових рядків - значить, їх треба замінити циклом. Наприклад,

textout(q*2,z+i-60,inttostr (random(2)));
textout(q*3,z+i-150,inttostr (random(2)));
textout(q*4,z+i-180,inttostr (random(2)));
...

проситься на щось таке:

for j := 2 to ... do begin
  textout(q*j,z+i-!!!,inttostr (random(2)));
end;

Не зовсім зрозуміло тільки, що робити з тим !!! - там послідовно замінюються 60, 150 і 180. Пропоную такий варіант:

(десь на початку)
const y_coef : array[0..2] of integer = (150, 180, 60);
...
textout(q*j,z+i-y_coef[j mod 3],inttostr (random(2)));

Дайте змінним людські імена, щоб було зрозуміло, що вони позначають. Параметр циклу f ще трохи прийнятний (хоча зазвичай використовують i,j,k); але i,q, z,x,taras - що воно таке?
Решту будемо розбирати після виправлення цих зауважень (особливо п.1).

Подякували: shabaranskij1

4

Re: Матриця

koala написав:

1. Розставте відступи.
2. Масиви taras і max, якщо не помиляюся (а через п.1 важко не помилитися), ніде не ініціалізуються, тобто заповнені нулями. Отже, їх можна прибрати, а кожен вираз taras[f] і max[f] замінити на 0.
3. Якщо у вас є 10 (майже) однакових рядків - значить, їх треба замінити циклом. Наприклад,

textout(q*2,z+i-60,inttostr (random(2)));
textout(q*3,z+i-150,inttostr (random(2)));
textout(q*4,z+i-180,inttostr (random(2)));
...

проситься на щось таке:

for j := 2 to ... do begin
  textout(q*j,z+i-!!!,inttostr (random(2)));
end;

Не зовсім зрозуміло тільки, що робити з тим !!! - там послідовно замінюються 60, 150 і 180. Пропоную такий варіант:

(десь на початку)
const y_coef : array[0..2] of integer = (150, 180, 60);
...
textout(q*j,z+i-y_coef[j mod 3],inttostr (random(2)));

Дайте змінним людські імена, щоб було зрозуміло, що вони позначають. Параметр циклу f ще трохи прийнятний (хоча зазвичай використовують i,j,k); але i,q, z,x,taras - що воно таке?
Решту будемо розбирати після виправлення цих зауважень (особливо п.1).

Дякую. Я і так програму писав для себе, тож не парився з назвами.

5

Re: Матриця

Це класична помилка. Програму, в якій не "паритеся" з назвами, ви пишете не для себе, а в смітник. Вам ("для кого вона написана" ніби-то) в ній буде розібратися за півроку не простіше, аніж будь-кому іншому. І взагалі - 99% часу програміста йде не на написання коду, а на його читання і обмірковування. Якщо завдяки коротким назвам ви економите нехай навіть половину часу на написання і збільшуєте на 10% час читання коду (бо весь час треба згадувати і дивитися, що то за змінні і нащо вони потрібні), то все одно воно того не варте; але повірте - економите ви менше, а втрачаєте більше.

6

Re: Матриця

koala
На жаль розуміння цих простих істин приходить в ліпшому випадку через пів-року роботи програмістом. Поки пишеш для себе усіляку дрібноту, можна навіть за допомогою кота або Ctrl+Shift+G назви ідентифікаторів генерувати. З копіпастою аналогічно.

7

Re: Матриця

От напали на початківця, розкажіть краще про рефакторинг.

Подякували: shabaranskij1

8

Re: Матриця

koala написав:

1. Розставте відступи.
2. Масиви taras і max, якщо не помиляюся (а через п.1 важко не помилитися), ніде не ініціалізуються, тобто заповнені нулями. Отже, їх можна прибрати, а кожен вираз taras[f] і max[f] замінити на 0.
3. Якщо у вас є 10 (майже) однакових рядків - значить, їх треба замінити циклом. Наприклад,

textout(q*2,z+i-60,inttostr (random(2)));
textout(q*3,z+i-150,inttostr (random(2)));
textout(q*4,z+i-180,inttostr (random(2)));
...

проситься на щось таке:

for j := 2 to ... do begin
  textout(q*j,z+i-!!!,inttostr (random(2)));
end;

Не зовсім зрозуміло тільки, що робити з тим !!! - там послідовно замінюються 60, 150 і 180. Пропоную такий варіант:

(десь на початку)
const y_coef : array[0..2] of integer = (150, 180, 60);
...
textout(q*j,z+i-y_coef[j mod 3],inttostr (random(2)));

Дайте змінним людські імена, щоб було зрозуміло, що вони позначають. Параметр циклу f ще трохи прийнятний (хоча зазвичай використовують i,j,k); але i,q, z,x,taras - що воно таке?
Решту будемо розбирати після виправлення цих зауважень (особливо п.1).

Похожі виправлення зробив. Але получилася дурня. Ох, чую я сьогодні пізно ляжу спати.

9

Re: Матриця

Якщо щось не виходить, кидайте сюди новий код. Допоможемо.

Подякували: koala, shabaranskij, Stanislav Stecenko3

10

Re: Матриця

Torbins написав:

Якщо щось не виходить, кидайте сюди новий код. Допоможемо.

OK.