
Hai gan...!!! pernahkah membuat sebuah game?? Mengingat
ketika jaman SD (skolah dasar), game tetris itu merupakan game yang luar biasa.
Sampai-sampai ane bela-belain nangis
(waduh ketahuan cengengnya ni..) minta uang sama ortu hanya untuk nyewa game
tetris tersebut.
Waah waah... berapa tahun ya kejadiannya. Nampaknya sudah
lama banget, tapi baru sekarang bisa bikin gamenya. Hehee..
Tak apalah yang penting sekarang sudah tau kalau dulu
dikiibulin tukang rental gamenya. Hhhahaaayy...
Bagi yang ingin tau cara bikinnya seperti apa??? Langsung
saja yuk... kita tengok prosesnya dibawah ini.
1. Langkah
awal yang perlu dilakukan tentunya buka program Delphi, karena kita akan
menggunakan tersebut.
Selanjutnya desain form seperti dibawah ini:
2. Setting
Properties juga jangan dilewatkan, lihat ketentuan dibawah ini

Kemudian setting seperti berikut ini.
4. Ketikkan
listing berikut ini:
Note: *Listing ini ane ambil mulai dari
“Private declaration”.
private
{
Private declarations }
public
{
Public declarations }
end;
type PieceType = record
X :
Byte;
Y :
Byte;
Num :
Byte;
Etat :
Byte;
Forme :
array[1..16] of Boolean;
FormePrec : array[1..16] of Boolean;
end;
const T_piece : array[0..27] of word =
(52224,52224,52224,52224,
50240,59392,35008,11776,
51328,36352,17600,57856,
35904,27648,35904,27648,
19584,50688,19584,50688,
19968,19520, 3648,17984,
17476,61440,17476,61440);
T_Speed : array[1..10] of word =
(350,320,290,260,230,200,170,140,110,80);
T_Points : array[0..4] of word =
(0,100,300,600,1000);
T_Clig : array[0..1] of Word = (100,150);
var
Form1 : TForm1;
Piece : PieceType;
PieceSuiv : PieceType;
anim : byte;
Nbsup : byte;
Difficult : byte;
NiveauDep : byte;
nblignes : word;
score : word;
winner : boolean;
EnPartie : boolean;
T_sup : array[1..4] of byte;
T_jeu : array[0..11,0..19] of
byte;
T_anim : array[1..4,0..10] of
byte;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender:
TObject);
var i : byte;
begin
EnPartie := False;
Application.onActivate := berhentiClick;
Application.onDeActivate :=
berhentiClick;
Clientwidth := 408;
Clientheight := 408 +
StatusBar1.Height;
top := 0;
left := 0;
NiveauDep := 1;
Difficult := 0;
randomize;
image1.canvas.draw(0,0,SpeedButton1.glyph);
for i := 1 to 18 do T_jeu[0 ,i ]
:= 9;
for i := 1 to 18 do T_jeu[11,i ]
:= 9;
for i := 0 to 11 do T_jeu[i ,18]
:= 9;
Timer1.Interval :=
T_Speed[Nblignes div 10 + NiveauDep];
Label4.caption := inttostr(score);
Label6.Caption := inttostr(nblignes div 10 + NiveauDep);
Label5.Caption := inttostr(nblignes);
end;
procedure TForm1.mulperClick(Sender :
TObject);
var i, j : byte;
w : word;
begin
EnPartie := True;
Score := 500 * (Difficult + NiveauDep - 1);
NbLignes := 0;
for i := 0 to 27 do
for j := 0 to 25 do
ImageList2.Draw(Canvas, 16*i, 16*j, (nblignes
div 10 + NiveauDep - 1) mod 9);
Label4.caption := inttostr(score);
Label6.Caption := inttostr(nblignes div 10 + NiveauDep);
Label5.Caption := inttostr(nblignes);
Timer1.Interval :=
T_Speed[Nblignes div 10 + NiveauDep];
Timer1.Enabled := true;
for i := 1 to 10 do
for j := 1 to 17 do
T_jeu[i,j] := 0;
for i := 1 to 7 * Difficult do
T_jeu[Random(10) + 1, 17 -
Random(Difficult)] := random(8);
piecesuiv.num := random(7);
piece.y := 1;
w := T_piece[4 * piecesuiv.num];
for i := 0 to 15 do
begin
piecesuiv.forme[16 - i]
:= (w mod 2 = 1);
w := w div 2;
end;
createpiece;
end;
procedure TForm1.berhentiClick(Sender:
TObject);
begin
if not(EnPartie) then exit;
berhenti.Checked := Not(berhenti.Checked);
Timer1.Enabled :=
Not(berhenti.Checked);
end;
procedure TForm1.keluarClick(Sender:
TObject);
begin
close;
end;
procedure TForm1.FormKeyDown(Sender:
TObject; var Key: Word;
Shift: TShiftState);
begin
if ((anim > 0) or
(not(EnPartie) and (key <> 27))) then exit;
{VK_Left := 37}
{VK_Right := 39}
{VK_Up := 38}
{VK_Down := 40} {Vk_Esc
:= 27}
case key of
{esc} 27 : close;
{left} 37 : move(-1,0);
{up} 38 : rotate;
{right} 39 : move(1,0);
{bottom} 40 : move(0,1);
end;
end;
procedure TForm1.Timer1Timer(Sender:
TObject);
var i, j, k : byte;
begin
if (anim > 0) then
begin
Timer1.Interval :=
T_Clig[anim mod 2];
if (anim mod 2 = 1) then
begin
for i := 1 to
nbsup do
for j := 1 to 10
do
T_jeu[j,
T_sup[i]] := T_anim[i, j];
end
else
begin
for i := 1 to
nbsup do
for j := 1 to 10
do
T_jeu[j, T_sup[i]] := 0;
end;
dec(anim);
if (anim = 0) then
begin
image1.canvas.draw(0,0,SpeedButton1.glyph);
for k := 1 to
nbsup do
for j :=
T_sup[k] downto 2 do
for i := 1
to 10 do T_jeu[i,j] := T_jeu[i,j-1];
inc(score,
T_points[nbsup]);
inc(nblignes, nbsup);
Label4.caption :=
inttostr(score);
Label6.Caption :=
inttostr(nblignes div 10 + NiveauDep);
Label5.Caption := inttostr(nblignes);
Timer1.Interval
:= T_Speed[Nblignes div 10 + NiveauDep];
for i := 0 to 27
do
for j := 0 to 25
do
ImageList2.Draw(Canvas,
16*i, 16*j, (nblignes div 10 + NiveauDep - 1) mod 9);
CreatePiece;
end;
draw;
exit;
end;
if not(move(0,1)) then
begin
for i := 0 to 15 do
if Piece.Forme[i +
1] then T_jeu[piece.x + i mod 4, piece.y + i div 4] := piece.num + 1;
SupprimeLigne;
end;
end;
procedure TForm1.Createpiece;
var i: byte;
w : word;
begin
if (piece.y = 0) then
begin
Timer1.enabled := false;
winner := true;
with
Tdatanilai.Create(Self) do
try
ShowModal;
finally
Free;
end;
winner := false;
EnPartie := False;
piece.y := 5;
exit;
end;
piece.Num := piecesuiv.num;
piecesuiv.num := random(7);
w := T_piece[4 * piecesuiv.num];
for i := 0 to 15 do
begin
piecesuiv.forme[16 - i]
:= (w mod 2 = 1);
w := w div 2;
end;
Image2.canvas.Brush.color :=
clblack;
Image2.canvas.fillrect(rect(0,0,60,80));
for i := 0 to 15 do
if piecesuiv.forme[i + 1]
then imagelist1.DrawOverlay(Image2.Canvas, 20 * (i mod 4), 20 * (i div 4),
piecesuiv.num, 1);
w := T_piece[4 * piece.num];
piece.etat := 0;
piece.x := 4;
piece.y := 0;
for i := 0 to 15 do
begin
piece.forme[16 - i] :=
(w mod 2 = 1);
w := w div 2;
end;
draw;
end;
procedure TForm1.Draw;
var m, n : byte;
begin
image1.canvas.draw(0,0,SpeedButton1.glyph);
for m := 1 to 10 do
for n := 1 to 17 do
if (T_jeu[m,n] > 0) then
imagelist1.DrawOverlay(Image1.Canvas, 20 * m, 20 * n , T_jeu[m,n] - 1, 1);
for m := 0 to 15 do
if (piece.forme[m + 1] and
(anim = 0)) then imagelist1.DrawOverlay(Image1.Canvas, 20 * (piece.x + m mod
4), 20 * (piece.y + m div 4), piece.num, 1);
end;
function
TForm1.Rotate : boolean;
var formesav : array[1..16] of boolean;
i : byte;
w : word;
begin
for i := 1 to 16 do
formesav[i] :=
piece.forme[i];
inc(piece.etat);
w := T_piece[4 * piece.num +
piece.etat mod 4];
for i := 0 to 15 do
begin
piece.forme[16 - i] :=
(w mod 2 = 1);
w := w div 2;
end;
result := true;
for i := 0 to 15 do
if (piece.forme[i+1]
and (T_jeu[piece.x + i mod 4, piece.y +
i div 4] > 0)) then result := false;
if result then
draw
else
begin
dec(piece.etat);
for i := 1 to 16 do
piece.forme[i] := formesav[i];
end;
end;
function
TForm1.Move(x,y : integer) : boolean;
var i : byte;
begin
result := true;
for i := 0 to 15 do
if (piece.forme[i + 1]
and (T_jeu[piece.x + x + i mod 4,
piece.y + y + i div 4] > 0)) then result := false;
if result then
begin
inc(piece.x, x);
inc(piece.y, y);
Draw;
end;
end;
procedure Tform1.SupprimeLigne;
var sup : boolean;
i, j : byte;
begin
nbsup := 0;
for i := 1 to 4 do T_sup[i] :=
0;
for j := 1 to 17 do
begin
sup := true;
for i := 1 to 10 do if
(T_jeu[i,j] = 0) then sup := false;
if sup then inc(nbsup);
if sup then T_sup[nbsup]
:= j;
end;
if (nbsup > 0) then
begin
anim := 6;
Timer1.interval := 20;
for i := 1 to nbsup do
for j := 1 to 10 do
T_anim[i, j] :=
T_jeu[j, T_sup[i]];
end
else
createpiece;
end;
procedure TForm1.CheckedRefresh;
begin
N11.checked := false; N21.checked
:= false; N31.checked := false;
N41.checked := false;
N51.checked := false; N61.checked := false;
N71.checked := false;
N81.checked := false; N91.checked := false;
N02.checked := false;
N12.checked := false; N22.checked := false;
N32.checked := false;
N42.checked := false; N52.checked := false;
N62.checked := false;
N72.checked := false; N82.checked := false; N92.checked := false;
case NiveauDep of
1 : N11.Checked := true;
2 : N21.Checked := true;
3 : N31.Checked := true;
4 : N41.Checked := true;
5 : N51.Checked := true;
6 : N61.Checked := true;
7 : N71.Checked := true;
8 : N81.Checked := true;
9 : N91.Checked := true;
end;
case Difficult of
0 : N02.Checked := true;
1 : N12.Checked := true;
2 : N22.Checked := true;
3 : N32.Checked := true;
4 : N42.Checked := true;
5 : N52.Checked := true;
6 : N62.Checked := true;
7 : N72.Checked := true;
8 : N82.Checked := true;
9 : N92.Checked := true;
end;
end;
procedure TForm1.N11Click(Sender: TObject);
begin NiveauDep := 1; CheckedRefresh; end;
procedure TForm1.N21Click(Sender: TObject);
begin NiveauDep := 2; CheckedRefresh; end;
procedure TForm1.N31Click(Sender: TObject);
begin NiveauDep := 3; CheckedRefresh; end;
procedure TForm1.N41Click(Sender: TObject);
begin NiveauDep := 4; CheckedRefresh; end;
procedure TForm1.N51Click(Sender: TObject);
begin NiveauDep := 5; CheckedRefresh; end;
procedure TForm1.N61Click(Sender: TObject);
begin NiveauDep := 6; CheckedRefresh; end;
procedure TForm1.N71Click(Sender: TObject);
begin NiveauDep := 7; CheckedRefresh; end;
procedure TForm1.N81Click(Sender: TObject);
begin NiveauDep := 8; CheckedRefresh; end;
procedure TForm1.N91Click(Sender: TObject);
begin NiveauDep := 9; CheckedRefresh; end;
procedure TForm1.N02Click(Sender: TObject);
begin Difficult := 0; CheckedRefresh; end;
procedure TForm1.N12Click(Sender: TObject);
begin Difficult := 1; CheckedRefresh; end;
procedure TForm1.N22Click(Sender: TObject);
begin Difficult := 2; CheckedRefresh; end;
procedure TForm1.N32Click(Sender: TObject);
begin Difficult := 3; CheckedRefresh; end;
procedure TForm1.N42Click(Sender: TObject);
begin Difficult := 4; CheckedRefresh; end;
procedure TForm1.N52Click(Sender: TObject);
begin Difficult := 5; CheckedRefresh; end;
procedure TForm1.N62Click(Sender: TObject);
begin Difficult := 6; CheckedRefresh; end;
procedure TForm1.N72Click(Sender: TObject);
begin Difficult := 7; CheckedRefresh; end;
procedure TForm1.N82Click(Sender: TObject);
begin Difficult := 8; CheckedRefresh; end;
procedure TForm1.N92Click(Sender: TObject);
begin Difficult := 9; CheckedRefresh; end;
procedure TForm1.skortinggiClick(Sender:
TObject);
var reprise : boolean;
begin
reprise := Timer1.Enabled;
Timer1.Enabled := false;
winner := false;
with Tdatanilai.Create(Self) do
try
ShowModal;
finally
Free;
end;
Timer1.Enabled := reprise;
end;
{procedure TForm1.APropos1Click(Sender:
TObject);
begin
Pause1Click(sender);
with TAProposDlg.Create(Self) do
try
ShowModal;
finally
Free;
end;
Pause1Click(sender);
end;
procedure TForm1.AlAide1Click(Sender:
TObject);
begin
Pause1Click(sender);
with TReglesDlg.Create(Self) do
try
ShowModal;
finally
Free;
end;
Pause1Click(sender);
end;
procedure TForm1.GameClick(Sender:
TObject);
begin
Pause1Click(sender);
with TLeJeuDlg.Create(Self) do
try
ShowModal;
finally
Free;
end;
Pause1Click(sender);
end; }
end.
5. Buatlah
form baru untuk informasi nilai tapi pada project yang sama.
Desain
formnya seperti dibawah ini

6. Lakukan setting properties
7. Ketikkan
listing beikut ini
Note: *Listing ini ane ambil mulai dari “Private declaration”.
private
{
Private declarations }
public
{
Public declarations }
end;
type scor = record
Name : String[15];
Scor : Word;
end;
var
datanilai : Tdatanilai;
ABest : array[1..3] of Scor;
F : textFile;
implementation
uses UTetris;
{$R *.DFM}
procedure Tdatanilai.FormCreate(Sender:
TObject);
var i, j : Byte;
begin
for i := 1 to 3 do ABest[i].Name := 'Nilai Minimal__';
for i := 1 to 3 do ABest[i].Scor := 500;
{$I-}
assignFile(F, 'BestScor');
FileMode := 0;
Reset(F);
if (IOResult = 0) then
for i := 1 to 3 do
begin
readln(F, ABest[i].Name,
ABest[i].Scor);
j := 0;
repeat inc(j) until
(ABest[i].Name[j] <> ' ');
ABest[i].Name :=
copy(ABest[i].Name, j, length(ABest[i].Name) - j + 1);
end;
CloseFile(F);
{$I+}
if Winner then
begin
i := 1;
while ((ABest[i].Scor >
Score) and (i < 5)) do inc(i);
if (i > 3) then
exit;
case i of
1 : begin
ABest[3].Name := ABest[2].Name;
ABest[2].Name := ABest[1].Name;
ABest[1].Name := 'Nilai';
ABest[3].Scor := ABest[2].Scor;
ABest[2].Scor := ABest[1].Scor;
Edit1.ReadOnly :=
False;
ABest[1].Scor := Score;
ActiveControl := Edit1;
end;
2 : begin
ABest[3].Name := ABest[2].Name;
ABest[2].Name := 'Nilai';
ABest[3].Scor := ABest[2].Scor;
Edit2.ReadOnly :=
False;
ABest[2].Scor := Score;
ActiveControl := Edit2;
end;
3 : begin
ABest[3].Name := 'Nilai';
Edit3.ReadOnly :=
False;
ABest[3].Scor := Score;
ActiveControl := Edit3;
end;
end;
end;
Edit1.Text := ABest[1].Name;
Edit2.Text := ABest[2].Name;
Edit3.Text := ABest[3].Name;
Label4.Caption :=
inttostr(ABest[1].Scor);
Label5.Caption :=
inttostr(ABest[2].Scor);
Label6.Caption :=
inttostr(ABest[3].Scor);
end;
procedure Tdatanilai.FormClose(Sender:
TObject;
var Action: TCloseAction);
var i : Byte;
begin
ABest[1].Name := Edit1.Text;
ABest[2].Name := Edit2.Text;
ABest[3].Name := Edit3.Text;
{$I-}
AssignFile(F, 'BestScor');
FileMode := 1;
reWrite(F);
for i := 1 to 3 do Writeln(F,
ABest[i].Name:15, ABest[i].Scor:3);
CloseFile(F);
{$I+}
end;
procedure Tdatanilai.Button1Click(Sender:
TObject);
var i : Byte;
begin
for i := 1 to 3 do ABest[i].Name := 'Nilai Minimal';
for i := 1 to 3 do ABest[i].Scor := 500;
Edit1.Text := ABest[1].Name;
Edit2.Text := ABest[2].Name;
Edit3.Text :=
ABest[3].Name;
Label4.Caption :=
inttostr(ABest[1].Scor);
Label5.Caption :=
inttostr(ABest[2].Scor);
Label6.Caption :=
inttostr(ABest[3].Scor);
end;
end.
8. Tinggal save all, dan nikmati gamenya











