Написано на паскале. Непонятно как строятся фигурка, как они падают и как сделано поле падения. Пишите обьяснение как для чайника. И обьясние пожалуйста все переменные. Заранее благодарен.
Program tetris(i,o);
Uses Crt, Graph;
Type Stakan = Array [0..21, 0..11] Of Integer;
Type Figura = Array [0..3, 0..3] Of Integer;
Var Matela, Mat1Tela, Mat2Tela, Cima : Stakan;
Next, FigLine, FigL, FigR, FigT,
FigKvadrat, FigZ, FigS, Fig, Figra : Figura;
Prox, Aux, A, B, C, I, J, Num, Cont, Lin, Speed,
Lines, Score, Graphdriver, Graphmode, Con, Bant, Numnex : Integer;
Fim, Turn, Game, Dir, Esq, Giro, NovayaFig : Boolean;
CurrentKey : Char;
Strin : String [6];
Ponto, Old : LongInt;
{аЁб㥬 Ґ¤Ё*Ёз*л© Єў*¤а*вЁЄ}
Procedure SmallKvadrat (Col, Lin, Col1, Lin1: Integer);
Begin
SetFillStyle (1, 7); Bar (Col, Lin, Col1, Lin1);
SetColor (15); SetLineStyle (0, 1, 1);
Line (Col, Lin, Col1, Lin); Line (Col, Lin, Col, Lin1);
Line (Col, Lin+ 1, Col1, Lin+ 1); Line (Col+ 1, Lin, Col+ 1, Lin1);
Line (Col, Lin+ 2, Col1, Lin+ 2); Line (Col+ 2, Lin, Col+ 2, Lin1);
SetColor (8);
Line (Col, Lin1, Col1, Lin1); Line (Col+ 1, Lin1- 1, Col1, Lin1- 1);
Line (Col+ 2, Lin1- 2, Col1, Lin1- 2); Line (Col1, Lin, Col1, Lin1);
Line (Col1- 1, Lin+ 1, Col1- 1, Lin1); Line (Col1- 2, Lin+ 2, Col1- 2, Lin1);
SetColor (7);
Line (Col, Lin, Col+ 2, Lin+ 2); Line (Col1, Lin1, Col1- 2, Lin1- 2);
End;
Procedure OneDown;
Begin
If Old<> Ponto Then Begin
Old:= Ponto;
Bar (1, 1, 100, 98);
SetColor (White);
OutTextXY (520, 85, '‘«Ґ¤гой*п:');
Str (Ponto, Strin); OutTextXY (5, 10, '‘зҐв:'+ Strin);
Str (Lines, Strin); OutTextXY (5, 30, '‹Ё*Ё©:'+ Strin);
Str (Score, Strin); OutTextXY (5, 50, '“а®ўҐ*м:'+ Strin);
End;
For I:= 1 To 20 Do
For J:= 1 To 10 Do Begin
If Matela [I, J] = 0 Then Begin
SetFillStyle (1, Black);
Bar ( (J- 1) * 20+ 215, (I- 1) * 20+ 25, (J- 1) * 20+ 19+ 215, (I- 1) * 20+ 19+ 25);
End
Else If Matela [I, J] <> Mat2Tela [I, J] Then Begin
SmallKvadrat ( (J- 1) * 20+ 215, (I- 1) * 20+ 25, (J- 1) * 20+ 19+ 215, (I- 1) * 20+ 19+ 25);
End;
End;
End;
Procedure OutNext;
Begin
For I:= 0 To 3 Do
For J:= 0 To 3 Do Begin
If Next [I, J] = 0 Then Begin
SetFillStyle (1, Black);
Bar ( (J- 1) * 20+ 515, (I- 1) * 20+ 25, (J- 1) * 20+ 19+ 515, (I- 1) * 20+ 19+ 25);
End
Else Begin
SmallKvadrat ( (J- 1) * 20+ 515, (I- 1) * 20+ 25, (J- 1) * 20+ 19+ 515, (I- 1) * 20+ 19+ 25);
End;
End;
End;
Procedure FigNaugad;
Begin
Numnex:= Random (7);
case Numnex of
0: Next:= FigL;
1: Next:= FigR;
2: Next:= FigLine;
3: Next:= FigKvadrat;
4: Next:= FigZ;
5: Next:= FigS;
else Next:= FigT
end;
End;
Procedure LinesPlus;
Begin
Aux:= Lines;
For A:= 1 To 4 Do
For I:= 20 Downto 1 Do Begin
Cont:= 0;
For J:= 1 To 10 Do If Matela [I, J] = 1 Then Cont:= Cont+ 1;
If Cont= 10 Then Begin
For J:= 1 To 10 Do Begin
Matela [I, J] := 0;
End;
Inc (Lines, 1);
For Lin:= 1 To (I- 1) Do
For J:= 1 To 10 Do Begin
Cima [Lin, J] := Matela [Lin, J];
Matela [Lin, J] := 0;
End;
For Lin:= 2 To I Do
For J:= 1 To 10 Do
Matela [Lin, J] := Cima [Lin- 1, J];
End;
End;
Ponto:= Ponto+ ( (Lines- Aux) * (Lines- Aux) * 100);
End;
Procedure KeybrdEvent;
Begin
If KeyPressed Then Begin
CurrentKey:= ReadKey;
If Ord (CurrentKey) = 077 Then Begin {Right}
If Dir= True Then Begin
Inc (C, 1);
Inc (Con, 1);
If Con< 4 Then Dec (B, 1);
If Con>= 4 Then Begin
Con:= 0;
Dec (C, 1);
End;
End;
End
Else If Ord (CurrentKey) = 075 Then Begin
If Esq= True Then Begin {Left}
Dec (C, 1);
Inc (Con, 1);
If Con< 4 Then Dec (B, 1);
If Con>= 4 Then Begin
Con:= 0;
Inc (C, 1);
End;
End;
End
Else If Ord (CurrentKey) = 072 Then Begin {Up}
If Giro= True Then Begin
Inc (Con, 1);
If Con< 2 Then Dec (B, 1);
If Con>= 2 Then Con:= 0;
Figra:= Fig;
If (Num= 0) Or (Num= 1) Or (Num= 6) Then Begin
For I:= 1 To 3 Do Begin
Fig [3, I] := Figra [I, 1];
Fig [2, I] := Figra [I, 2];
Fig [1, I] := Figra [I, 3];
End;
End
Else If (Num= 4) Or (Num= 5) Then Begin
If Turn= True Then Begin
For I:= 0 To 3 Do Begin
Fig [3, I] := Figra [I, 0];
Fig [2, I] := Figra [I, 1];
Fig [1, I] := Figra [I, 2];
Fig [0, I] := Figra [I, 3];
Turn:= False;
End;
End
Else If Turn= False Then Begin
If Num= 4 Then Fig:= FigZ;
If Num= 5 Then Fig:= FigS;
Turn:= True;
End;
End
Else If Num= 2 Then Begin
For I:= 0 To 3 Do
For J:= 0 To 3 Do
Fig [I, J] := Figra [J, I];
End;
End;
End
Else If Ord (CurrentKey) = 080 {Down}
Then Speed:= 0;
End;
End;
Begin
DetectGraph (Graphdriver, Graphmode);
InitGraph (Graphdriver, Graphmode, '');
setbkcolor(1);
setcolor(15);
rectangle(0,0,getMaxX,getMaxY);
setcolor(14);
outtextxy(round(0.5*getmaxx)-80,12,'T E T R I S - 2000.');
repeat ; until keypressed;
Randomize;
For I:= 0 To 3 Do
For J:= 0 To 3 Do Begin
FigLine [I, J] := 0;
FigKvadrat [I, J] := 0;
FigL [I, J] := 0;
FigR [I, J] := 0;
FigT [I, J] := 0;
FigZ [I, J] := 0;
FigS [I, J] := 0;
End;
For I:= 0 To 3 Do FigLine [2, I] := 1; {0000}
For I:= 1 To 3 Do FigL [2, I] := 1; { 0}
FigL [1, 3] := 1; {000}
For I:= 1 To 3 Do FigR [2, I] := 1; {0 }
FigR [1, 1] := 1; {000}
For I:= 0 To 1 Do FigZ [I, 1] := 1; {00 }
For I:= 1 To 2 Do FigZ [I, 2] := 1; { 00}
For I:= 0 To 1 Do FigS [I, 2] := 1; { 00}
For I:= 1 To 2 Do FigS [I, 1] := 1; {00 }
For I:= 1 To 3 Do FigT [2, I] := 1; { 0 }
FigT [1, 2] := 1; {000}
For I:= 1 To 2 Do FigKvadrat [1, I] := 1; {00 }
For I:= 1 To 2 Do FigKvadrat [2, I] := 1; {00 }
FigNaugad;
Old:= 0;
Con:= 0;
Ponto:= 0;
Lines:= 0;
CurrentKey:= '0';
For I:= 1 To 20 Do
For J:= 1 To 10 Do Matela [I, J] := 0;
For I:= 1 To 21 Do Matela [I, 0] := 1;
For I:= 1 To 21 Do Matela [I, 11] := 1;
For J:= 0 To 11 Do Matela [21, J] := 1;
SetBkColor (Black);
SetColor (White);
Line (214, 25, 214, 425);
Line (415, 25, 415, 425);
Line (215, 425, 414, 425);
Fim:= False;
Game:= True;
Repeat
Speed:= 30000;
Score:= 1;
Inc (Ponto, 10);
Speed:= Speed- ( (Ponto Div 4000) * 10);
Score:= Score+ (Ponto Div 4000);
NovayaFig:= False;
Fig:= Next;
Num:= Numnex;
FigNaugad;
Turn:= True;
C:= 4;
B:= 0;
OutNext;
Repeat
KeybrdEvent;
KeybrdEvent;
If B= Bant+ 1 Then Con:= 0;
Esq:= True;
Dir:= True;
Giro:= True;
Mat2Tela:= Matela;
LinesPlus;
Mat1Tela:= Matela;
For I:= 0 To 2 Do
For J:= 0 To 2 Do Begin
If (Num= 4) Or (Num= 5) Then
If Matela [I+ B, J+ C] = 1 Then Giro:= False;
End;
For I:= 1 To 3 Do
For J:= 1 To 3 Do Begin
If (Num= 6) Or (Num= 0) Or (Num= 1) Then
If Matela [I+ B, J+ C] = 1 Then Giro:= False;
End;
For I:= 0 To 3 Do
For J:= 0 To 3 Do
If NovayaFig= False Then Begin
If Num= 3 Then Giro:= False;
If Num= 2 Then
If Matela [I+ B, J+ C] = 1 Then Giro:= False;
If Matela [I+ B, J+ C] <> 1 Then
Begin
Matela [I+ B, J+ C] := Fig [I, J];
If (Matela [I+ B, J+ C+ 1] ) + (Fig [I, J] ) = 2 Then Dir:= False;
If (Mat1Tela [I+ B, J+ C- 1] ) + (Fig [I, J] ) = 2 Then Esq:= False;
If (Matela [I+ B+ 1, J+ C] ) + (Fig [I, J] ) = 2 Then
Begin
For I:= 0 To 3 Do
For J:= 0 To 3 Do
If Matela [I+ B, J+ C] <> 1 Then
Begin
Matela [I+ B, J+ C] := Fig [I, J];
End;
OneDown;
NovayaFig:= True;
End;
End;
End;
If NovayaFig= False Then Begin
OneDown;
For I:= 0 To 3 Do
For J:= 0 To 3 Do
If Mat1Tela [I+ B, J+ C] <> 1 Then
Matela [I+ B, J+ C] := 0;
Delay (Speed);
Bant:= B;
Inc (B, 1);
End;
If KeyPressed Then CurrentKey:= ReadKey;
If Ord (CurrentKey) = 027 Then Fim:= True;
Until (NovayaFig= True) Or (Fim= True);
For J:= 4 To 6 Do If Matela [1, J] = 1 Then Game:= False;
Until (Game= False) Or (Fim= True);
cleardevice;
setbkcolor(1);
setcolor(15);
rectangle(0,0,getMaxX,getMaxY);
setcolor(14);
outtextxy(60,round(0.5*GetMaxY),'COPYRIGHT (c) 2000 BY <<VICTOR AFONIN>>. _ALL_ RIGHT RESERVED!!!');
delay(3000);
closegraph;
End.
Социальные закладки