Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
Pemrograman Berorientasi Objek pada VB.NetOleh : Hendra, ST.
Buku ini membahas tentang konsep dasar pemrograman berorientasi
objek (OOP) dan bagaimana melakukannya pada VB.NET, serta
memberikan contoh-contoh keunggulan OOP dibandingkan dengan
pendekatan konvensional. Penguasaan terhadap teknik pengembangan
berorientasi objek merupakan suatu nilai tambah bagi programmer
dewasa ini, karena trend bahasa pemrograman menuju kearah
pendekatan OOP, terutama sejak kemunculan Java yang 100% menerapkan
OOP. Penulis yakin bagian ini merupakan hal yang tersulit bagi
programmer yang ingin melakukan migrasi dari VB6 ke VB.NET, karena
OOP merupakan hal yang benar-benar baru. Untuk mempelajari buku ini
anda tidak perlu menginstalasi Visual Studio .NET, tetapi anda
cukup menginstalasi .Net Framework yang dapat didownload secara
gratis dari website Microsoft. Semua contoh dan latihan dibuku ini
dapat dikompilasi langsung dari Dos prompt dengan menggunakan
kompiler Visual Basic yang langsung tersedia setelah anda
menginstalasi .Net Framework.
INDOPROG
1
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
Dasar OOPVisual Basic merupakan bahasa yang Object-Based
(komponen-komponen program dibuat dalam bentuk objek), sedangkan
VB.NET adalah Object Oriented, hal ini berarti bahwa VB.NET
merupakan bahasa yang benar-benar berorientasi object dengan
mendukung empat pilar utama dari OOP yaitu Polymorphism,
Inheritance, Abstraction dan Encapsulation. Kalau anda adalah
programmer yang terbiasa dengan pendekatan procedural terstruktur,
maka anda akan baru dengan beberapa istilah OOP yang kita sebutkan
diatas, dan memang hal tersebut senantiasa menjadi masalah bagi
programmer yang berasal dari VB dan ingin beralih ke VB.NET. Lalu
timbul pertanyaan, apakah pada kita harus menguasai dan memahami
semua istilah diatas baru dapat membuat program aplikasi dengan
VB.NET ? Tentu saja jawabannya tidak, tetapi sebagai programmer
VB.NET yang baik, maka konsep dari OOP tidak dapat diabaikan.
Mengapa harus pendekatan OOP?Tujuan utama dari pengembangan
pendekatan berorientasi objek (OOP) adalah untuk menghilangkan
beberapa kelemahan yang terdapat pada pendekatan procedural. Pada
OOP data diperlakukan sebagai elemen yang penting dan tidak boleh
mengalir secara bebas dalam program. Data yang terikat kepada
function dan harus dilindungi terhadap kemungkinan perubahan dari
luar function. Catatan : Anda dapat melihat konsep OOP seperti
suatu objek Televisi, dimana sebagai pemakai kita tidak perlu
terlalu pusing dengan komponen apa saja yang bekerja didalam
televise tersebut, tetapi sebagai pemakai kita cukup mengerti
bagaimana menghidupkan, memilih channel, mengubah volume suara, dan
beberapa setting dasar. OOP memungkinkan untuk pemecahan masalah
kedalam sejumlah entitas yang disebut sebagai objek dan kemudian
mengembangkan data dan fungsi disekitar objek tersebut. Salah satu
manfaat yang terpenting dari OOP adalah pemanfaatan kembali.
Beberapa kemampuan utama dari OOP adalah sebagai berikut :
Menekankan pada data dari pada procedure Program terbagi kedalam
objek-objek Data disembunyikan dari akses oleh function-function
eksternal Objek dapat berkomunikasi satu dengan yang lain melalui
function Data baru dan function dapat dengan mudah ditambahkan pada
saat dibutuhkan. Mengikuti pendekatan buttom up.
INDOPROG
2
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
Konsep dari OOP:
Objects Classes Data Abstraction dan Encapsulation Inheritance
Polymorphism
ObjekObjek merupakan dasar dari entitas run-time dalam suatu
sistem berorientasi objek. Masalah pada pemrograman adalah
menganalisa dalam arti objek dan komunikasi alamiah diantara
mereka. Ketika suatu program dijalankan, objek berinteraksi satu
dengan yang lain dengan saling mengirim message. Objek-objek yang
berbeda berinteraksi satu dengan yang lain tanpa mengetahui detail
data dari masing-masing data ataupun koding.
ClassSuatu class adalah suatu koleksi dari objek-objek yang
bertipe sama. Setelah suatu class telah didefinisikan, sejumlah
dari objek-objek dapat dibuat berdasarkan class tersebut.
Catatan : Istilah Class dan Objek sering dicampuradukan, pada
objek merupakan instance dari suatu class pada saat runtime, jadi
pada saat design, class merupakan cetak biru bagi objek-objek yang
akan dibuat pada saat runtime. Anda dapat mengasosiasikan class
dengan gambar denah dari rancangan rumah, dan selanjutnya
berdasarkan denah ini akan dibangun rumah-rumah (objek)
sebenarnya.
Data Abstraction dan EncapsulationAbstraction mengacu pada usaha
untuk menampilkan hal-hal yang penting tanpa mengikutsertakan
detail latarbelakang ataupun penjelasan. Class-class menggunakan
konsep dari abstraksi dan mendefinsikannya sebagai suatu daftar
dari atribut-atribut abstrak.
INDOPROG
3
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
Catatan : Sebagaimana contoh sebelumnya bahwa TV merupakan
gambaran dari Abstraksi, dimana yang perlu ditonjolkan pada pemakai
adalah hal-hal penting bagaimana menghidupkan dan mematikan serta
berbagai setting dasar, sedangkan permasalahan teknis yang berada
didalam kotak TV seperti rangkaian elektronik disembunyikan dari
pemakai. Jadi dalam hal ini TV dianggap suatu black box. Menyimpan
data dan fungsi-fungsi ke dalam suatu unit tunggal (class) adalah
encapsulation. Data tidak dapat diakses oleh dunia luar dan hanya
fungsi-fungsi yang mana berada dalam class tersebut dapat
mengaksesnya.
InheritanceInheritance adalah proses yang mana objek-objek dapat
mengusahakan member dari objek class lain. Pada OOP inheritance
menyediakan pemakaian kembali, seperti, menambah kemampuan baru
pada class yang telah ada dengan tanpa melakukan modifikasi
langsung terhadap class tersebut. Hal ini dilakukan dengan
menurunkan suatu class baru dari yang class telah ada. Class baru
tersebut memiliki kombinasi dari keduanya. Catatan : Pendekatan
inheritance dapat dipahami sebagai pengembangan produk, dimana
engineer tidak perlu merancang produk dari awal, tetapi dengan
melakukan modifikasi terhadap produk yang telah ada untuk
menghasilkan suatu produk baru.
PolymorphismPolymorphism adalah kemampuan untuk memiliki lebih
dari satu bentuk. Suatu operasi dapat menunjukan prilaku yang
berbeda pada instance yang berbeda. Prilaku tersebut tergantung
kepada tipe data yang digunakan dalam operasi. Polymorphism secara
ekstensif digunakan dalam implementasi Inheritance. Dengan
polymorphism kita dapat membuat beberapa fungsi dengan nama yang
sama tetapi memiliki daftar argument yang berbeda baik dari segi
jumlah maupun tipe datanya (Overloading), sehingga dalam
implementasinya fungsi akan dioperasikan berdasarkan argumen yang
diberikan, sehingga program dapat bereaksi secara tepat sesuai
dengan jenis tipe data dan jumlah argument. Kemudian polymorphism
juga memiliki fungsi dimana pemanfaatan variable dengan tipe base
class untuk menampung instance dari class turunannya dan
menjalankan metoda class turunannya.
Keunggulan dari OOP
INDOPROG
4
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
OOP memiliki keunggulan berikut diatas pendekatan
konvensional:
OOP menyediakan struktur modular yang jelas untuk program, yang
mana cocok untuk mendefinisikan tipe data abstrak yang merupakan
detail dari implementasi disembunyikan serta unit memiliki
interface yang telah didefinisikan dengan jelas. OOP memudahkan
maintenance dan modifikasi terhadap kode yang telah sebagai objek
baru yang dapat dibuat dengan perubahan yang minimal OOP
menyediakan suatu kerangka kerja yang baik untuk kode library yang
mana menyediakan komponen software yang secara mudah dapat
disesuaikan dan dimodifikasi oleh programmer. Hal ini khususnya
sangat berguna untuk pengembangan user interface secara grafik.
Catatan : Setelah anda membaca uraian tersebut diatas, awalnya
anda akan merasa kesulitan untuk memahami dan menerapkan beberapa
konsep-konsep diatas pada program anda, dan hal tersebut adalah
wajar. Untuk mentransformasi gaya pemrograman anda dari pendekatan
procedural terstruktur menjadi OOP membutuhkan waktu dan usaha.
Sebab pada pendekatan procedural terstruktur focus programmer
langsung kepada logika dan koding untuk pencapaian hasil, sedangkan
pada OOP kita harus melakukan abstraksi terhadap data dan fungsi
yang berkaitan menjadi class, dan selanjutnya class-class tersebut
berinteraksi dengan message untuk mencapai tujuan akhir. Untuk
membantu pengertian dan menunjukan keunggulan konsep OOP, penulis
akan memberikan beberapa contoh keunggulan pemanfaatan OOP pada
bagian-bagian selanjutnya.
INDOPROG
5
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
OOP pada Visual BasicMembuat ClassPemrograman OOP pada Visual
Basic dapat dilakukan dengan merancang class dari objek dengan
menggunakan struktur class sebagai berikut : Class nama 'member
[variable, property, method and event declarations] End Class
Contoh : Misalnya kita ingin membuat program animasi bola pantul
yang memanfaatkan GDI+ dengan pendekatan berorientasi objek, maka
sebagai langkah awal adalah merancang Class untuk bola pantul. Pada
tahap rancangan, kita harus dapat mendefinisikan aksi apa saja yang
harus dapat dilakukan oleh objek bola pantul yaitu bergerak (move)
yang tentu saja memiliki koordinat awal (x,y) yang bergerak kearah
tertentu (dx, dy). Dalam pergerakan dilayar, tentu saja dibatasi
oleh area tertentu (sx,sy). Kemudian sebagai wujud dari animasi
gerakan bola dilayar, kita perlu menyediakan aksi draw dan clear.
Adapun rancangan class tersebut diatas dalam bentuk terprogram
adalah sebagai berikut :Class Pantul Protected x As Single
Protected y As Single Private sx As Single Private sy As Single
Private dx As Single Private dy As Single Public Sub New(f as form)
sx = f.width \ 30 sy = f.height \ 30 x = rnd*(sx-2) + 2 y =
rnd*(sy-2) + 2 dx = 1 dy = 1 Draw(f) End Sub 'posisi x dilayar
'posisi y dilayar 'jumlah kolom x 'jumlah baris y 'arah bola
terhadap x 'arah bola terhadap y 'constructor 'lebar form dibagi 30
'tinggi form dibagi 30 'posisi awal random 'arah diagonal ke
bawah
Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30
dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics =
f.CreateGraphics Dim MyPen As New
Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3)
MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30)
INDOPROG
6
Pemrograman Berorientasi Objek pada VB.NETEnd Sub
Hendra, S.T.
Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30
dengan warna latar belakang form Dim MyGraphic As
Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New
Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawEllipse(MyPen,
x*30,y*30,30,30) End Sub Public Sub Move(f as form) 'metoda 'hapus
gambar bola sebelumnya Clear(f) 'gerakan bola dengan mengubah x, y
sesuai dengan arah x = x + dx y = y + dy 'jika mengenai daerah
bingkai If x < 2 or x > (sx-2) Then dx = -dx If y < 2 or y
> (sy-2) Then dy = -dy 'gambar bola diposisi baru Draw(f) End
Sub End Class
Catatan : Jika anda perhatikan perhatikan rancangan class
diatas, maka konsep dari data abstraction akan nampak, dimana
sebagai interface keluar hanya terdiri metoda New, Draw, Clear, dan
Move, sedangkan pengkodean tersembunyi dari program yang akan
memanfaatkan Objek dari Class Pantul Kemudian konsep dari data
encapsulation, dimana variable x,y,sx,sy,dx, dan dy disatukan
beserta fungsi New, Draw, Clear, dan Move didalam satu Class
Pantul.
Ruang Lingkup member pada suatu classPada saat pendeklarasian
member pada class anda dapat menggunakan keyword seperti Friend,
Private, Protected, Protected Friend, dan Public, dimana
masing-masing memiliki kendali akses yang berbeda. Friend, member
hanya tersedia bagi kode pada lingkup project yang sama. Private,
member hanya tersedia bagi class itu sendiri Protected, member
tersedia bagi class dan class turunannya. Protected Friend, member
tersedua bagi kode pada lingkup project yang sama, dan class
turunannya. Public, member tersedia bagi semua kode program. Jika
anda tidak menentukan jenis kendali akses bagai suatu member, maka
defaultnya adalah Public.
INDOPROG
7
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
ConstructorsSuatu constructor adalah anggota function yang mana
memiliki tugas untuk menginisialisasi objek dari classnya. Suatu
constructor akan dijalankan ketika objek dari class tersebut
diciptakan. Kita dapat mengirim data kepada konstruktor dengan
mencantumkannya didalam kurung. Pada Visual Basic suatu konstruktor
harus dibuat dengan suatu Sub procedure dengan nama New pada class.
Koding berikut mendemonstrasikan pemakaian dari konstruktor di
Visual Basic.Public Sub New(f as form) sx = f.width \ 30 sy =
f.height \ 30 x = rnd*(sx-2) + 2 y = rnd*(sy-2) + 2 dx = 1 dy = 1
Draw(f) End Sub 'constructor 'lebar form dibagi 30 'tinggi form
dibagi 30 'posisi awal random 'arah diagonal ke bawah
Pada contoh diatas, konstruktor digunakan untuk menginisialisasi
nilai awal untuk variable pada Objek seperti sx, sy, x, y, dx, dan
dy. Untuk konstruktor diatas, pada saat kita membuat instance dari
Class denganDim Bola As Pantul Bola = New Pantul(Me)
Dimana Me mengacu pada form yang sedang aktif.
DestructorsDestructors akan dijalankan ketika suatu objek
dimusnahkan. Didalam suatu destructor kita dapat menempatkan koding
untuk membersihkan objek setelah digunakan. Kita menggunakan metode
Finalize di Visual Basic untuk membuat destructor yang otomatis
akan dijalankan ketika runtime .NET menemukan bahwa objek tidak
dibutuhkan lagi. Contoh implementasi pemakaian destructor adalah
misalnya pada konstruktor kita membuka data maupun file, sehingga
pada saat destructor kita perlu menutup data maupun file yang
terbuka. Catatan: Setiap objek didunia nyata memiliki fase awal
yaitu kelahiran, dan fase akhir yaitu kematian. Pada saat suatu
objek dilahirkan tentu saja telah memiliki nilai property bawaan,
seperti seorang bayi yang baru dilahirkan telah memiliki jenis
kelamin, berat badan, dan tinggi. Demikian juga objek dalam konsep
OOP, yang kadang-kadang membutuhkan pemberian nilai awal kepada
beberapa property begitu instance dari class dibuat. Tindakan
pemberian nilai awal (inisialisasi) ini dapat dilakukan dengan
menggunakan metoda
INDOPROG
8
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
khusus yang dikenal sebagai Constructor.
Contoh Keunggulan OOP (Bagian 1)Jika sekilas kita melihat uraian
yang telah disebutkan diatas seakan-akan segala sesuatu yang
dilakukan dengan pendekatan OOP dapat juga dilakukan dengan teknik
pemrograman biasanya. Tetapi misalnya anda bayangkan kita ingin
membuat program bola pantul yang terdiri dari 15 buah bola pantul
dilayar yang masing-masing bergerak tanpa pendekatan OOP. Berikut
ini saya akan membuat contoh dengan pendekatan OOP, dan anda
bandingkan sendiri. Pertama kita akan membuat variable array untuk
bola pantul sebagai array 15 elemen :Dim Bola(14) As Pantul
Kemudian kita buat instance dari Class PantulFor I As Integer =
0 To 14 Bola(I) = New Pantul(Me) Next I
Selanjutnya kita gerakan masing-masing objek dengan looping :For
I As Integer = 0 To 14 Bola.Move(Me) Next I
Dari hal ini jelaslah bahwa dengan pendekatan OOP kita tidak
melakukan perubahan terhadap rancangan Class Pantul sama sekali,
melainkan kita membuat 15 instance dari Class Pantul. Listing
lengkap dari program 15 ola pantul dengan pendekatan OOP.Option
Explicit On Imports Sistem Imports Sistem.Windows.Forms Imports
Microsoft.VisualBasic Public Class MyForm : Inherits Form Dim
WithEvents MyTimer as New Timer Dim Bola(14) As Pantul _ Public
Shared Sub Main() Application.Run(New MyForm) End Sub Public Sub
New() 'Constructor
Me.BackColor = Sistem.Drawing.Color.Black Me.FormBorderStyle =
FormBorderStyle.None
INDOPROG
9
Pemrograman Berorientasi Objek pada VB.NETMe.Width =
Screen.PrimaryScreen.Bounds.Width Me.Height =
Screen.PrimaryScreen.Bounds.Height For I As Integer = 0 to 14
Bola(I) = New Pantul(Me) Next I MyTimer.Interval = 150 '150
millidetik MyTimer.Enabled = True End Sub
Hendra, S.T.
'Mengerakan objek dengan event tick pada objek MyTimer Private
Sub MyTimer_Tick(sender as object, e as eventargs) _ handles
MyTimer.Tick For I As Integer = 0 to 14 Bola(I).Move(Me) Next I End
Sub End Class Class Pantul Protected x As Single Protected y As
Single Private sx As Single Private sy As Single Private dx As
Single Private dy As Single Public Sub New(f as form) sx = f.width
\ 30 sy = f.height \ 30 x = rnd*(sx-2) + 2 y = rnd*(sy-2) + 2 dx =
1 dy = 1 Draw(f) End Sub
'posisi x dilayar 'posisi y dilayar 'jumlah kolom x 'jumlah
baris y 'arah bola terhadap x 'arah bola terhadap y 'constructor
'lebar form dibagi 30 'tinggi form dibagi 30 'posisi awal random
'arah diagonal ke bawah
Overridable Public Sub Draw(f as form) 'metoda 'gambar bola
ukuran 30x30 dengan warna merah Dim MyGraphic As
Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New
Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3)
MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30) End Sub Overridable
Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30
dengan warna latar belakang form Dim MyGraphic As
Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New
Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawEllipse(MyPen,
x*30,y*30,30,30) End Sub Public Sub Move(f as form) 'metoda 'hapus
gambar bola sebelumnya Clear(f) 'gerakan bola dengan mengubah x, y
sesuai dengan arah x = x + dx y = y + dy
INDOPROG
10
Pemrograman Berorientasi Objek pada VB.NET'jika mengenai daerah
bingkai If x < 2 or x > (sx-2) Then dx = -dx If y < 2 or y
> (sy-2) Then dy = -dy 'gambar bola diposisi baru Draw(f) End
Sub End Class
Hendra, S.T.
INDOPROG
11
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
InheritancePemanfaatan KembaliKunci dari kemampuan OOP adalah
pemakaian kembali. Yang secara nyata akan menghemat waktu jika kita
dapat memanfaatkan kembali pada yang pernah kita buat. Pemakaian
kembali akan menurunkan pekerjaan untuk testing dan debugging
terhadap bagian yang digunakan kembali, karena telah dilakukan
sebelumnya. Proses inheritance dilakukan dengan menurunkan suatu
class baru dari class yang telah ada. Class yang lama disebut
sebagai base class dan class yang baru disebut derived class. Class
turunan akan mewarikan semua atau sebagian dari segala sesuatu yang
terdapat pada base class. Pada Visual Basic kita menggunakan
keyword Inherits untuk menurunkan suatu class: Misalnya kita telah
memiliki Class PantulClass Pantul member End Class
Selanjutnya misalnya kita ingin mengembangkan Class baru dengan
menurunkannya dari Class PantuClass Pantul1 : Inherits Pantul
member End Class
Maka Class Pantul1 akan mewarisi semua member Pantul yang
dideklarasikan sebagai Protected maupun Public.
OverridingPada derived class kadang-kadang kita perlu
mendefinisikan ulang fungsi maupun sub yang ada pada base class,
dalam hal inilah istilash Overriding muncul, dimana kita dapat
mendefinisikan ulang fungsi maupun sub pada derived class. Misalnya
pada Class Pantul1 gambar yang ingin kita hasilkan adalah persegi,
maka kita perlu melakukan Overiding terhadap Sub Draw dan Clear
yang ada pada base class. Catatan : Sub maupun Function pada base
class harus dideklarasikan sebagai Overridable baru dapat di
Overrides pada derived class. Pada Class pantul kita perlu
mencantumkan keyword OverridableOverridable Public Sub Draw(f as
form) 'metoda 'gambar bola ukuran 30x30 dengan warna merah Dim
MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen
As New Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3)
MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30)
INDOPROG
12
Pemrograman Berorientasi Objek pada VB.NETEnd Sub
Hendra, S.T.
Overridable Public Sub Clear(f as form) 'metoda 'gambar bola
ukuran 30x30 dengan warna latar belakang form Dim MyGraphic As
Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New
Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawEllipse(MyPen,
x*30,y*30,30,30) End Sub
Selanjutnya pada class turunannya kita dapat melakukan
Overriding terhadap metoda yang dimaksud :Class Pantul1 : Inherits
Pantul Public Sub New(f as form) MyBase.New(f) End Sub
'constructor
Overrides Public Sub Draw(f as form) 'metoda 'gambar persegi
ukuran 30x30 dengan warna merah Dim MyGraphic As
Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New
Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3)
MyGraphic.DrawRectangle(MyPen,x*30,y*30,30,30) End Sub Overrides
Public Sub Clear(f as form) 'metoda 'gambar persegi ukuran 30x30
dengan warna latar belakang form Dim MyGraphic As
Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New
Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawRectangle(MyPen,
x*30,y*30,30,30) End Sub End Class
ShadowingJika pada Overriding kita membutuhkan permisi dari base
class untuk melakukan overriding dengan keyword Overridable, selain
itu kita juga dapat melakukan Shadowing terhadap metoda pada base
class yang tidak memberikan permisi Overridable. Contoh : Pada base
class :Public Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30
dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics =
f.CreateGraphics Dim MyPen As New
Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3)
MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30) End Sub
Pada class turunannya :
INDOPROG
13
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
Public Shadows Sub Draw(f as form) 'metoda 'gambar persegi
ukuran 30x30 dengan warna merah Dim MyGraphic As
Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New
Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3)
MyGraphic.DrawRectangle(MyPen,x*30,y*30,30,30) End Sub
Catatan : Pemakaian cara Shadowing menyebabkan konsep
polymorphism tidak dapat berfungsi sebagaimana pada cara
Overriding.
OOP pada Pemrograman FormUntuk pemrograman program Windows yang
berbasis form, .NET telah menyediakan class Form yang terdefinisi
pada namespace Sistem.Windows.Forms, kemudian didalam pemakaiannya
kita dapat melakukan inheritance dari class form ke program kita
dengan menbuat class baru :Public Class MyForm : Inherits Form
Selanjutnya kita dapat membuat konstruktor (sub New) untuk
menginisialisasi keadaan awal dari form kita (misalnya mengatur
warna, ukuran, menambah control timer dll)Public Sub New()
'Constructor
Me.BackColor = Sistem.Drawing.Color.Black Me.FormBorderStyle =
FormBorderStyle.None Me.Width = Screen.PrimaryScreen.Bounds.Width
Me.Height = Screen.PrimaryScreen.Bounds.Height For I As Integer = 0
to 14 Bola(I) = New Pantul(Me) Next I '150 millidetik
MyTimer.Interval = 150 MyTimer.Enabled = True End Sub
Pada class MyForm kita dapat juga melakukan overriding terhadap
metoda yang telah terdefinisi pada class Form, misalnya untuk
metoda paint.Protected Overrides Sub OnPaint(ByVal e As
PaintEventArgs) Dim MyPen As New
Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3) MyBase.OnPaint(e)
e.Graphics.DrawLine(MyPen,10,10,200,100) End Sub
Contoh Keunggulan OOP (Bagian 2)Misalnya kita akan membuat
program yang terdiri dari 2 objek pantul yang satu berbentuk bola
dan satu berbentuk persegi.
INDOPROG
14
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
Pada pendekatan OOP, misalnya kita telah memiliki class Pantul
yang menampilkan bentuk lingkaran, selanjutnya adalah membuat class
Pantul1 yang akan menampilkan bentuk persegi, tetapi kita tidak
perlu merancang class Pantul1 dari awal melainkan cukup
menurunkannya dari class Pantul dengan melakukan override terhadap
metoda draw dan clear. Jadi dalam hal ini kita tidak perlu
merancang class dari awal, tetapi cukup memperbaharui maupun
mengembangkan class yang telah ada, sehingga waktu pemrograman
dapat dipersingkat dan proses debug dapat dikurangi. Listing
program menampilkan bola dan persegi pantul dilayar :Option
Explicit On Imports Sistem Imports Sistem.Windows.Forms Imports
Microsoft.VisualBasic Public Class MyForm : Inherits Form Dim
WithEvents MyTimer as New Timer Dim Bola As Pantul Dim Persegi As
Pantul1 _ Public Shared Sub Main() Application.Run(New MyForm) End
Sub
Public Sub New()
'Constructor
Me.BackColor = Sistem.Drawing.Color.Black Me.FormBorderStyle =
FormBorderStyle.None Me.Width = Screen.PrimaryScreen.Bounds.Width
Me.Height = Screen.PrimaryScreen.Bounds.Height Bola = New
Pantul(Me) Persegi = New Pantul1(Me) MyTimer.Interval = 150
MyTimer.Enabled = True End Sub Private Sub MyTimer_Tock(sender as
object, e as eventargs) _ handles MyTimer.Tick Bola.Move(Me)
Persegi.Move(Me) End Sub End Class
Class Pantul Protected x As Single Protected y As Single Private
sx As Single Private sy As Single
'posisi 'posisi 'jumlah 'jumlah
x dilayar y dilayar kolom x baris y
INDOPROG
15
Pemrograman Berorientasi Objek pada VB.NETPrivate dx As Single
Private dy As Single Public Sub New(f as form) sx = f.width \ 30 sy
= f.height \ 30 x = rnd*(sx-2) + 2 y = rnd*(sy-2) + 2 dx = 1 dy = 1
Draw(f) End Sub 'arah bola terhadap x 'arah bola terhadap y
'constructor 'lebar form dibagi 30 'tinggi form dibagi 30 'posisi
awal random 'arah diagonal ke bawah
Hendra, S.T.
Overridable Public Sub Draw(f as form) 'metoda 'gambar bola
ukuran 30x30 dengan warna merah Dim MyGraphic As
Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New
Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3)
MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30) End Sub Overridable
Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30
dengan warna latar belakang form Dim MyGraphic As
Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New
Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawEllipse(MyPen,
x*30,y*30,30,30) End Sub Public Sub Move(f as form) 'metoda 'hapus
gambar bola sebelumnya Clear(f) 'gerakan bola dengan mengubah x, y
sesuai dengan arah x = x + dx y = y + dy 'jika mengenai daerah
bingkai If x < 2 or x > (sx-2) Then dx = -dx If y < 2 or y
> (sy-2) Then dy = -dy 'gambar bola diposisi baru Draw(f) End
Sub End Class Class Pantul1 : Inherits Pantul Public Sub New(f as
form) MyBase.New(f) End Sub 'constructor 'menjalankan constructor
base class
Overrides Public Sub Draw(f as form) 'metoda 'gambar bola ukuran
30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics =
f.CreateGraphics Dim MyPen As New
Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3)
MyGraphic.DrawRectangle(MyPen,x*30,y*30,30,30) End Sub Overrides
Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30
dengan warna latar belakang form Dim MyGraphic As
Sistem.Drawing.Graphics = f.CreateGraphics
INDOPROG
16
Pemrograman Berorientasi Objek pada VB.NETDim MyPen As New
Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawRectangle(MyPen,
x*30,y*30,30,30) End Sub End Class
Hendra, S.T.
INDOPROG
17
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
PolymorphismPolymorphism merupakan salah satu fasilitas yang
krusial pada OOP, yang memiliki arti "satu nama, banyak bentuk".
Hal ini disebut juga sebagai Overloading yang berarti menggunakan
hal yang sama untuk tujuan yang berbeda. Dengan menggunakan
Polymorphism kita dapat membuat banyak fungsi dengan nama yang sama
tetapi memiliki daftar argument yang berbeda. Fungsi tersebut
dijalankan berdasarkan daftar argument yang digunakan untuk
menjalankan fungsi. Misalnya kita memperbaharui class Pantul dimana
pada konstruktor kita dapat menentukan warna dari lingkaran.Class
Pantul Protected x As Single 'posisi x dilayar Protected y As
Single 'posisi y dilayar Private sx As Single 'jumlah kolom x
Private sy As Single 'jumlah baris y Private dx As Single 'arah
bola terhadap x Private dy As Single 'arah bola terhadap y Private
clr As Sistem.Drawing.Color Public Sub New(f as form) 'constructor
me.New(f,Sistem.Drawing.Color.Red) End Sub Public Sub New(f as
form, w as sistem.drawing.color) 'constructor sx = f.width \ 30
'lebar form dibagi 30 sy = f.height \ 30 'tinggi form dibagi 30 x =
rnd*(sx-2) + 2 'posisi awal random y = rnd*(sy-2) + 2 dx = 1 'arah
diagonal ke bawah dy = 1 clr = w Draw(f) End Sub Overridable Public
Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna
merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics
Dim MyPen As New Sistem.Drawing.Pen(Clr,3)
MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30) End Sub Overridable
Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30
dengan warna latar belakang form Dim MyGraphic As
Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New
Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawEllipse(MyPen,
x*30,y*30,30,30) End Sub Public Sub Move(f as form) 'metoda 'hapus
gambar bola sebelumnya Clear(f) 'gerakan bola dengan mengubah x, y
sesuai dengan arah
INDOPROG
18
Pemrograman Berorientasi Objek pada VB.NETx = x + dx y = y + dy
'jika mengenai daerah bingkai If x < 2 or x > (sx-2) Then dx
= -dx If y < 2 or y > (sy-2) Then dy = -dy 'gambar bola
diposisi baru Draw(f) End Sub End Class
Hendra, S.T.
Dalam hal ini class pantul memiliki dua konstruktor yang
masing-masing memiliki daftar argument yang berbeda yaitu :Public
Sub New(f as form) 'constructor
DanPublic Sub New(f as form, w as sistem.drawing.color)
Sehingga ketika kita membuat instance dari Class Pantul dapat
dilakukan dengan :Bola = New Pantul(Me)
Ataupun :Bola = New Pantul(Me, Sistem.Drawing.Color.Blue)
Polymorphism juga dapat berupa pemanfaatan variable yang bertype
base class untuk mengimplementasikan metoda pada class-class
turunannya. Misalnya kita mendeklarasikan variable array bola yang
terdiri dari dua elemen Dim Bola(1) As Pantul Bola(0) = New
Pantul(Me) Bola(1) = New Pantul1(Me) Dimana variable Bola(n)
sebenarnya merupakan variable type Pantul, tetapi dalam
pemakaiannya kita gunakan untuk instance Pantul1, selanjutnya :
Bola(0).Move(Me) Bola(1).Move(Me) Akan menjalankan metoda Move dari
Class yang bersesuaian dengan instance objek yang dibuat.
Contoh Keunggulan OOP (Bagian 3)Misalnya kita ingin membuat
program animasi bola pantul di layar yang memberi kebebasan kepada
pemakai untuk menentukan jumlah objek masing-masing bentuk dilayar
: INDOPROG
19
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
Dim JlhBola As Integer = Val(Inputbox("Jumlah Bola")) Dim
JlhPersegi As Integer = Val(Inputbox("Jumlah Persegi"))
Selanjutnya kita membuat instance dari masing-masing class
sesuai dengan jumlah yang ditentukan :Dim Bola(14) As Pantul Dim
Jlh As Integer Dim I As Integer = 0 Do While I < JlhBola Bola(I)
= new Pantul(Me) I+=1 Loop Do While I < JlhBola+JlhPersegi
Bola(I) = new Pantul1(Me) I+=1 Loop Jlh = JlhBola+JlhPersegi
Dalam hal ini kita mendeklarasikan variable array Bola yang
bertipe Pantul, padahal dalam pemakaiannya kita gunakan juga untuk
menampung instance untuk class Pantul1. Kemudian untuk mengerakan
objek kita gunakan looping :For I As Integer = 0 To Jlh-1
Bola(I).Move(Me)
INDOPROG
20
Pemrograman Berorientasi Objek pada VB.NETNext I
Hendra, S.T.
Selanjutnya metoda move yang dijalankan sangat tergantung pada
jenis instance dari variable objek. Dapatkah anda bayangkan
bagaimana kalau tanpa menggunakan Polymorphism ? Listing program
menampilkan bola dan persegi pantul dilayar sesuai dengan jumlah
yang diinginkan pemakai :Option Explicit On Imports Sistem Imports
Sistem.Windows.Forms Imports Microsoft.VisualBasic Public Class
MyForm : Inherits Form Dim WithEvents MyTimer as New Timer Dim
Bola(14) As Pantul Dim Jlh As Integer _ Public Shared Sub Main()
Application.Run(New MyForm) End Sub Public Sub New()
'Constructor
Me.BackColor = Sistem.Drawing.Color.Black Me.FormBorderStyle =
FormBorderStyle.None Me.Width = Screen.PrimaryScreen.Bounds.Width
Me.Height = Screen.PrimaryScreen.Bounds.Height Dim JlhBola As
Integer = Val(Inputbox("Jumlah Bola")) Dim JlhPersegi As Integer =
Val(Inputbox("Jumlah Persegi")) Dim I As Integer = 0 Do While I
< JlhBola Bola(I) = new Pantul(Me) I+=1 Loop Do While I <
JlhBola+JlhPersegi Bola(I) = new Pantul1(Me) I+=1 Loop Jlh =
JlhBola+JlhPersegi MyTimer.Interval = 150 MyTimer.Enabled = True
End Sub Private Sub MyTimer_Tock(sender as object, e as eventargs)
_ handles MyTimer.Tick For I As Integer = 0 To Jlh-1
INDOPROG
21
Pemrograman Berorientasi Objek pada VB.NETBola(I).Move(Me) Next
I End Sub End Class
Hendra, S.T.
Class Pantul Protected x As Single 'posisi x dilayar Protected y
As Single 'posisi y dilayar Private sx As Single 'jumlah kolom x
Private sy As Single 'jumlah baris y Private dx As Single 'arah
bola terhadap x Private dy As Single 'arah bola terhadap y Private
clr As Sistem.Drawing.Color Public Sub New(f as form) 'constructor
me.New(f,Sistem.Drawing.Color.Red) End Sub Public Sub New(f as
form, w as sistem.drawing.color) 'constructor sx = f.width \ 30
'lebar form dibagi 30 sy = f.height \ 30 'tinggi form dibagi 30 x =
rnd*(sx-2) + 2 'posisi awal random y = rnd*(sy-2) + 2 dx = 1 'arah
diagonal ke bawah dy = 1 clr = w Draw(f) End Sub Overridable Public
Sub Draw(f as form) 'metoda 'gambar bola ukuran 30x30 dengan warna
merah Dim MyGraphic As Sistem.Drawing.Graphics = f.CreateGraphics
Dim MyPen As New Sistem.Drawing.Pen(Clr,3)
MyGraphic.DrawEllipse(MyPen,x*30,y*30,30,30) End Sub Overridable
Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30
dengan warna latar belakang form Dim MyGraphic As
Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New
Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawEllipse(MyPen,
x*30,y*30,30,30) End Sub Public Sub Move(f as form) 'metoda 'hapus
gambar bola sebelumnya Clear(f) 'gerakan bola dengan mengubah x, y
sesuai dengan arah x = x + dx y = y + dy 'jika mengenai daerah
bingkai If x < 2 or x > (sx-2) Then dx = -dx If y < 2 or y
> (sy-2) Then dy = -dy 'gambar bola diposisi baru Draw(f)
INDOPROG
22
Pemrograman Berorientasi Objek pada VB.NETEnd Sub End Class
Class Pantul1 : Inherits Pantul Public Sub New(f as form)
MyBase.New(f) End Sub 'constructor
Hendra, S.T.
Overrides Public Sub Draw(f as form) 'metoda 'gambar bola ukuran
30x30 dengan warna merah Dim MyGraphic As Sistem.Drawing.Graphics =
f.CreateGraphics Dim MyPen As New
Sistem.Drawing.Pen(Sistem.Drawing.Color.Red,3)
MyGraphic.DrawRectangle(MyPen,x*30,y*30,30,30) End Sub Overrides
Public Sub Clear(f as form) 'metoda 'gambar bola ukuran 30x30
dengan warna latar belakang form Dim MyGraphic As
Sistem.Drawing.Graphics = f.CreateGraphics Dim MyPen As New
Sistem.Drawing.Pen(f.BackColor,3) MyGraphic.DrawRectangle(MyPen,
x*30,y*30,30,30) End Sub
End Class
Catatan : Konsep Polymorphism tidak berlaku untuk metoda
Shadowing.
INDOPROG
23
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
InterfacesInterfaces memungkinkan kita untuk membuat definisi
untuk interaksi komponen. Interface juga menyediakan cara lain
untuk mengimplementasikan polymorphism. Melalui interface, kita
dapat menentukan metoda yang mana suatu komponen harus miliki tanpa
menentukan bagaimana metoda tersebut diimplementasikan (koding
detail untuk metoda tersebut). Jadi dalam hal ini interface
menyerupai prototype bagi class lain yang akan dikembangkan. Anda
bisa membayangkan interface sebagai suatu standard pengembangan
berbagai fasilitas dalam objek yang dibakukan, jika class mendukung
standard interface tersebut, maka wajib memenuhi tata cara
penulisan yang telah didefinisikan dalam interface. Misalnya kita
membuka pusat layanan pelanggan dimana semua pelayan diwajibkan
melakukan sapaan pembukan kepada para tamu yang dating berkunjung,
dan kata pembuka sapaan telah distandarisasi untuk pagi, sore, dan
malam.Public Sub Sub Sub Interface Sapaan Pagi() Sore() Malam()
End Interface
Kita menggunakan keyword Interface untuk membuat suatu interface
dan keyword implements untuk mengimplementasikan interface
tersebut. Selanjutnya sapaan akan disampaikan dalam dua bahasa
sesuai dengan asal pengunjung, sehingga kita dapat memgembangkan
class dengan mengimplementasikan interface sapaan yang telah dibuat
:Public Class Indonesia : Implements Sapaan Sub Pagi() Implements
Sapaan.Pagi Console.WriteLine("Selamat Pagi") End Sub Sub Sore()
Implements Sapaan.Sore Console.WriteLine("Selamat Sore") End Sub
Sub Malam() Implements Sapaan.Malam Console.WriteLine("Selamat
Malam") End Sub End Class Public Class English : Implements Sapaan
Sub Pagi() Implements Sapaan.Pagi Console.WriteLine("Good Morning")
End Sub Sub Sore() Implements Sapaan.Sore
INDOPROG
24
Pemrograman Berorientasi Objek pada
VB.NETConsole.WriteLine("Good Afternoon") End Sub Sub Malam()
Implements Sapaan.Malam Console.WriteLine("Good Evening") End Sub
End Class
Hendra, S.T.
Dan listing konkret untuk contoh pemakaian interface :Option
Explicit On Imports Sistem Public Module MyModule Sub Main() Dim
Domestik As New Indonesia Dim Internasional As New English
Domestik.Pagi() Internasional.Pagi() End Sub Public Interface
Sapaan Sub Pagi() Sub Sore() Sub Malam() End Interface Public Class
Indonesia : Implements Sapaan Sub Pagi() Implements Sapaan.Pagi
Console.WriteLine("Selamat Pagi") End Sub Sub Sore() Implements
Sapaan.Sore Console.WriteLine("Selamat Sore") End Sub Sub Malam()
Implements Sapaan.Malam Console.WriteLine("Selamat Malam") End Sub
End Class Public Class English : Implements Sapaan Sub Pagi()
Implements Sapaan.Pagi Console.WriteLine("Good Morning") End Sub
Sub Sore() Implements Sapaan.Sore Console.WriteLine("Good
Afternoon") End Sub Sub Malam() Implements Sapaan.Malam
Console.WriteLine("Good Evening") End Sub
INDOPROG
25
Pemrograman Berorientasi Objek pada VB.NETEnd Class End
Module
Hendra, S.T.
Dan kalau dijalankan akan menghasilkan tampilan berikut
INDOPROG
26
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
Abstract ClassesSuatu class abstrak tidak dapat digunakan untuk
membuat objek. Suatu class abstrak dirancang untuk berlaku sebagai
suatu base class (untuk diwariskan ke class lain). Suatu abstrak
class digunakan sebagai konsep design yang menjadi acuan
pengembangan bagi class-class yang akan dikembangkan. Class abstrak
menyerupai interface. Setelah suatu class abstrak dideklarasikan,
dia tidak dapat di buat objek instancenya, melainkan harus
diturunkan.
Membuat class AbstrakPada Visual Basic .NET kita dapat membuat
abstrak class dengan menggunakan keyword MustInherit.MustInherit
Public Class Sapaan MustOverride Sub Pagi() MustOverride Sub Sore()
MustOverride Sub Malam() End Class
Kemudian pada contoh diatas pada masing-masing metoda sapaan
kita menambahkan keyword MustOverride bahwa metoda Pagi, Sore, dan
Malam harus di override pada class turunannya.Option Explicit On
Imports Sistem Public Module MyModule Sub Main() Dim Domestik As
New Indonesia Dim Internasional As New English Domestik.Pagi()
Internasional.Pagi() End Sub MustInherit Public Class Sapaan
MustOverride Sub Pagi() MustOverride Sub Sore() MustOverride Sub
Malam() End Class Public Class Indonesia : Inherits Sapaan
Overrides Sub Pagi() Console.WriteLine("Selamat Pagi") End Sub
Overrides Sub Sore() Console.WriteLine("Selamat Sore") End Sub
Overrides Sub Malam()
INDOPROG
27
Pemrograman Berorientasi Objek pada
VB.NETConsole.WriteLine("Selamat Malam") End Sub End Class Public
Class English : Inherits Sapaan Overrides Sub Pagi()
Console.WriteLine("Good Morning") End Sub Overrides Sub Sore()
Console.WriteLine("Good Afternoon") End Sub Overrides Sub Malam()
Console.WriteLine("Good Evening") End Sub End Class End Module
Hendra, S.T.
INDOPROG
28
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
Program TetrisOleh : Hendra Soewarno Contoh aplikasi pemrograman
GDI+ untuk pembuatan games tetris dengan pendekatan berorientasi
objek.
Untuk memahami program ini anda perlu mengerti pemrograman form,
event handling, dan array, serta GDI+
INDOPROG
29
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
Rancangan programProgram ini menggunakan pendekatan berorientasi
objek dengan membuat dua class untuk objek Shape dan objek Grid
Class TShapeClass ini berfungsi menghasilkan bentuk-bentuk
dengan sistem koordinat berikut :
{1,0},{1,1},{1,2},{1,3}
Dan rotasi ke kanan akan menjadi
{0,1},{1,1},{2,1},{3,1}
Berikut ini adalah rincian array untuk masing-masing Shape dan
rotasinya{1,0},{1,1},{1,2},{1,3} {0,1},{1,1},{2,1},{3,1}
{1,0},{1,1},{1,2},{1,3} {0,1},{1,1},{2,1},{3,1}
{0,0},{0,1},{1,0},{1,1} {0,0},{0,1},{1,0},{1,1}
{0,0},{0,1},{1,0},{1,1} {0,0},{0,1},{1,0},{1,1}
{0,0},{0,1},{0,2},{1,2} {0,0},{0,1},{1,0},{2,0}
{0,0},{1,0},{1,1},{1,2} {0,1},{1,1},{2,0},{2,1}
{0,0},{0,1},{0,2},{1,1} {0,0},{1,0},{1,1},{2,0}
{1,0},{0,1},{1,1},{1,2} {0,1},{1,0},{1,1},{2,1}
{0,0},{0,1},{1,1},{1,2} {0,1},{1,0},{1,1},{2,0}
{0,0},{0,1},{1,1},{1,2} {0,1},{1,0},{1,1},{2,0}
INDOPROG
30
Pemrograman Berorientasi Objek pada
VB.NET{0,1},{0,2},{1,0},{1,1} {0,0},{1,0},{1,1},{2,1}
{0,1},{0,2},{1,0},{1,1} {0,0},{1,0},{1,1},{2,1}
Hendra, S.T.
Contoh :
Yang memiliki rincian array sebagai berikut
:{0,0},{0,1},{0,2},{1,1} {0,0},{1,0},{1,1},{2,0}
{1,0},{0,1},{1,1},{1,2} {0,1},{1,0},{1,1},{2,1}
Yang selanjutnya dipetakan menjadi suatu array 4 dimensi yang
berisi koordinat dari masingmasing shape :'Array 4 dimensi yang
berisi nilai sel dari masing-masing bentuk 'serta bentuk rotasinya
private sarr(,,,) as integer = {{{{1,0},{1,1},{1,2},{1,3}}, _
{{0,1},{1,1},{2,1},{3,1}}, _ {{1,0},{1,1},{1,2},{1,3}}, _
{{0,1},{1,1},{2,1},{3,1}}}, _ {{{0,0},{0,1},{1,0},{1,1}}, _
{{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}, _
{{0,0},{0,1},{1,0},{1,1}}}, _ {{{0,0},{0,1},{0,2},{1,2}}, _
{{0,0},{0,1},{1,0},{2,0}}, _ {{0,0},{1,0},{1,1},{1,2}}, _
{{0,1},{1,1},{2,0},{2,1}}}, _ {{{0,0},{0,1},{0,2},{1,1}}, _
{{0,0},{1,0},{1,1},{2,0}}, _ {{1,0},{0,1},{1,1},{1,2}}, _
{{0,1},{1,0},{1,1},{2,1}}}, _ {{{0,0},{0,1},{1,1},{1,2}}, _
{{0,1},{1,0},{1,1},{2,0}}, _ {{0,0},{0,1},{1,1},{1,2}}, _
{{0,1},{1,0},{1,1},{2,0}}}, _ {{{0,1},{0,2},{1,0},{1,1}}, _
{{0,0},{1,0},{1,1},{2,1}}, _ {{0,1},{0,2},{1,0},{1,1}}, _
{{0,0},{1,0},{1,1},{2,1}}}}
Variabel pada Class TShapeprivate currentshape as integer
private nextshape as integer 'menyimpan nomor current shape
'menyimpan nomor next shape
INDOPROG
31
Pemrograman Berorientasi Objek pada VB.NETpublic currentcolor as
color public nextcolor as color private currentstate as integer
Hendra, S.T.
'menyimpan warna current shape 'menyimpan warna next shape
'nomor rotasi shape
Konstruktor TShape Konstuktor TShape merupakan metoda yang
otomatis dijalankan begitu instance dari TShape terbentuk. Misalnya
:private gtshape as new tshape 'instance class tshape
berfungsi menghasilkan bentuk Shape berikutnya yang akan
dimunculkan setelah bentuk sekarang dengan memanggil metoda
generateshape.'konstrutor untuk class tshape public sub new()
generateshape(nextshape, nextcolor) end sub
Metoda GenerateNextShape Metoda ini berfungsi memindahkan
nextshape menjadi currentshape, serta membuat nextshape yang
berikutnya.'Membuat next shape berikutnya, dan menset current shape
public sub generatenextshape() currentshape = nextshape
currentcolor = nextcolor currentstate = 0 'rotasi ke 0
generateshape(nextshape, nextcolor) 'buat nextshape baru end
sub
Sub GenerateShape Berfungsi menghasilkan shape secara random,
dan warnanya'Membuat bentuk dan mengembalikan melalui parameter
shape dan shapecolor private sub generateshape(byref shape as
integer, _ byref shapecolor as color) dim c as integer shape =
int(rnd*6) 'random untuk shape c = int(rnd*8) 'random untuk shape
color select case c case 0 : shapecolor = color.red case 1 :
shapecolor = color.green case 2 : shapecolor = color.blue case 3 :
shapecolor = color.orange case 4 : shapecolor = color.pink case 5 :
shapecolor = color.cyan
INDOPROG
32
Pemrograman Berorientasi Objek pada VB.NETcase 6 : shapecolor =
color.gray case else shapecolor = color.magenta end select end
sub
Hendra, S.T.
Catatan : Parameter pada sub ini dilewatkan secara by refrence,
sehingga nilai dapat dikembalikan ke variable shape dan shapecolor.
Metoda Rotate Metode ini berfungsi menset nilai currentstate ke
nilai rotasi berikutnya (0 ke 1, 1 ke 2, 2 ke 3, 3 ke 0).
'Rotasi ke bentuk berikutnya public sub rotate() currentstate =
currentstate + 1 if currentstate = 4 then currentstate = 0 end
sub
'Rotasi berikutnya 'Kembali ke bentuk awal
Metoda DeRotate Metode ini berfungsi menset nilai currentstate
ke nilai rotasi sebelumnya (1 ke 0, 2 ke 1, 3 ke 2, 0 ke 3).'Rotasi
ke bentuk sebelumnya public sub derotate() currentstate =
currentstate - 1 if currentstate = -1 then currentstate = 3 end
sub
'Rotasi sebelumnya
Metoda CurrentShapeSel Properti ini berfungsi mengembalikan
nilai sel yang ke i,j dari array shape yang tersimpan pada array 4
dimensi sarr.'Mengembalikan sel i,j dari current shape public
function currentshapesel(i as integer, j as integer) return
sarr(currentshape,currentstate,i,j) end function
Nilai sel yang dikembalikan sangat tergantung pada nilai
variable currentshape (bentuk shape), dan currentstate (nomor
rotasi)
INDOPROG
33
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
Misalnya nilai currentshape = 4, dan nilai currentstate = 3
{1,0},{0,1},{1,1},{1,2}
Dan CurrentShapeSel(0,0) akan menghasilkan 1
CurrentShapeSel(0,1) akan menghasilkan 0 Property NextShapeSel
Properti ini berfungsi mengembalikan nilai sel yang ke i,j dari
array shape yang tersimpan pada array 4 dimensi sarr.'Mengembalikan
sel i,j dari next shape public function nextshapesel(i as integer,
j as integer) return sarr(nextshape,0,i,j) 'Bentuk awal end
function
Nilai sel yang dikembalikan sangat tergantung pada nilai
variable nextshape (bentuk shape), dan currentstate defaultnya 0,
karena nextshape belum mengalami rotasi.
Class TGridClass ini berfungsi menyediakan mekanisme Grid pada
permainan Tetris, dimana pada memori computer diwakili dengan array
dua dimensi, dengan gambaran sebagai berikut :
INDOPROG
34
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
Variabel yang digunakanpublic parr(15,25) as integer public
carr(15,25) as color 'Array menyimpan isi sel pada grid 'Array
menyimpan warna sel pada grid
Merupakan array yang mewakili grid dilayar, jika suatu sel
terisi gambar, maka nilai parr(x,y) akan berisi nilai 1, dan
carr(x,y) akan berisi nilai warna gambar. Kontruktor TGrid Begitu
instance dari TGrid terbuat, maka akan mengisi awal array parr
menjadi sebagai berikut, yang akan menjadi bingkai dari grid,
sehingga area permainan mulai dari (3,0) s/d (12,22)
INDOPROG
35
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
'konstruktur class tgrid public sub new() dim i, j as integer
for i = 0 to 15 for j = 0 to 25 parr(i,j) = 1 next j next i for i =
3 to 12 for j = 0 to 22 parr(i,j) = 0 next j next i end sub
'isi bingkai
'isi arena
Metoda TestShape Metoda ini berfungsi mengisi nilai dari shape
ke posisi x,y dalam grid, dengan syarat parr(x,y) masih
0'Menempatkan shape pada posisi x,y di grid public sub putshape(x
as integer, y as integer, s as tshape) dim i as integer for i = 0
to 3
INDOPROG
36
Pemrograman Berorientasi Objek pada
VB.NETparr(x+s.currentshapesel(i,0), y+s.currentshapesel(i,1))
carr(x+s.currentshapesel(i,0), y+s.currentshapesel(i,1)) next i end
sub _ = 1 _ = s.currentcolor
Hendra, S.T.
Misalnya putshape yang ke 4, keposisi 6,21 pada grid, yang akan
mengisi nilai ke parr
Metoda TestShape Metoda ini berfungsi mencoba apakah shape dapat
ditempatkan pada posisi x,y dalam grid, dengan syarat parr(x,y)
masih 0'Mengembalikan nilai yang menunjukan apakah 'shape dapat
ditempatkan pada grid diposisi x,y public function testshape(x as
integer, y as integer, s as tshape)_ as boolean dim i as integer
for i = 0 to 3 'apakah sel pada grid telah terisi ( > 0 ) if
parr(x+s.currentshapesel(i,0), _ y+s.currentshapesel(i,1)) > 0
then return false end if
INDOPROG
37
Pemrograman Berorientasi Objek pada VB.NETnext i return true end
function
Hendra, S.T.
Metoda CheckGrid Metoda ini berfungsi memeriksa apakah ada baris
dalam array parr yang berisi nilai 1 dari kolom 3 s/d 12.'periksa
apakah ada baris yang berhasil diselesaikan pemain public function
checkgrid() as integer dim i,j as integer dim b,k as integer dim
complete as integer complete = 0 i = 22 do while i > 3 j = 3 do
while parr(j,i) 0 and j < 13 j=j+1 loop if j = 13 then beep
'sound beep complete = complete + 1 for b = i to 4 step -1 for k =
3 to 12 parr(k,b) = parr(k,b-1) carr(k,b) = carr(k,b-1) next k next
b else i = i - 1 end if loop return complete end function end
class
Misalnya array parr pada baris 22 berisi nilai 1 mulai baris 3
s/d 12, maka setelah metoda ChekGrid dijalankan akan menghapus
baris 22 dan mengeser baris diatasnya ke bawah, dan mengembalikan
nilai berapa baris yang berhasil diselesaikan.
INDOPROG
38
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
Class TetrisClass ini merupakan class utama permainan Tetris
Variabel yang digunakanprivate private private private private
private private private withevents gtimer as new
sistem.windows.forms.timer labelscore as new label labelgameover as
new label gtgrid as new tgrid 'instance class tgrid gtshape as new
tshape 'instance class tshape g as graphics x,y as integer 'posisi
x,y shape pada grid score as integer 'score permainan
Konstruktor TetrisBerfungsi mempersiapkan tampilan form, seperti
title form, ukuran form, menempatkan label untuk keterangan score
dan gameover, membuat objek Graphics yang akan digunakan untuk
menyediakan metoda pengambaran, serta mempersiapkan Shape
berikutnya.public sub new() me.text = "Program Tetris" me.size =
new size(450, 600) labelscore.location = new point(61,30)
me.controls.add(labelscore) labelgameover.location = new
point(200,30) me.controls.add(labelgameover) g =
me.creategraphics() score = 0 printscore() nextshape() 'persiapkan
shape berikutnya end sub
Metoda NextShapeMetoda ini berfungsi mempersiapkan shape
berikutnya, dan menset interval timer 200 millidetik, dan posisi
awal shape mulai di posisi (7,0)'metoda mempersiapkan shape
berikutnya private sub nextshape() gtimer.interval = 200
'set interval 200 millidetik
INDOPROG
39
Pemrograman Berorientasi Objek pada VB.NETgtimer.enabled = true
gtshape.generatenextshape() redrawnextshape() x = 7 y = 0 end
sub
Hendra, S.T.
'mengaktifkan timer 'cetak shape berikutnya 'koordinat awal di
7,0
Metoda MoveShapeMetoda ini berfungsi menggambarkan animasi
pergerakan Shape pada posisi x,y sesuai dengan arah gerakan yang
ditentukan pada dx dan dy, misalnya bergerak ke kiri, kama dx = -1,
dy = 0'memindahkan shape keposisi x,y private sub movexy(dx,dy)
clearshape() x = x + dx y = y + dy drawshape() end sub
'hapus gambar sebelumnya 'ubah posisi x,y 'gambar diposisi
baru
Metoda MoveShapeMetoda ini berfungsi memperbaharui nilai score
di layar'metoda untuk mencetak score dilayar private sub
printscore() labelscore.text = "Score : " & score.tostring()
end sub
Metoda MoveShapeMetoda ini berfungsi mengubah tulisan di
labelgameover menjadi Game Over'metoda untuk mencetak gameover
private sub printgameover() labelgameover.text = "Game Over" end
sub
Event TickEvent ini secara otomatis akan dibangkitkan oleh Timer
secara berkala untuk mengerakan Shape ke bawah, dengan senantiasa
apakah Shape telah mencapai batas gerakan, jika ya, maka akan
memanggil metoda putshape pada TGrid. Jika Shape tertahan dibaris
< 3 artinya Game Over'mengerakan shape ke bawah dengan interval
waktu tertentu private sub gtimer_tick(sender as object, e as
eventargs) _ handles gtimer.tick 'apakah shape masih bisa turun
kebawah if gtgrid.testshape(x,y+1,gtshape) then
INDOPROG
40
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
movexy(0,1) 'jika ya pindah shape 1 baris ke bawah else
gtgrid.putshape(x,y,gtshape) 'tempatkan shape kegrid score = score
+ gtgrid.checkgrid() 'periksa baris yang lengkap redrawgrid()
'cetak ulang grid printscore() 'cetak score 'jika shape tertahan di
baris 3, artinya game over if y < 3 then gtimer.enabled = false
'matikan timer karena gameover printgameover() 'tampil pesan
gameover else nextshape() 'persiapkan gambar berikutnya end if end
if end sub
Event KeyDownEvent ini secara otomatis akan dibangkitkan apabila
adanya penekanan tombol oleh pemakai, Jika panah atas akan merotasi
shape jika panah kiri akan mengerakan shape ke kiri jika panah
kanan akan mengerakan shape ke kanan jika panah bawah akan
mempercepat turunya shape'deteksi penekanan tombol dengan event
keydown pada form private sub tetris_keydown(sender as object, e as
keyeventargs) _ handles mybase.keydown select case e.keyvalue case
38, 104, 12,101 : 'Panah atas, 8, 5 gtshape.rotate() 'rotasi
'apakah hasil rotasi dapat ditempatkan diposisi x,y if
gtgrid.testshape(x,y,gtshape) then 'kalau ya, rotasi balik kembali
gtshape.derotate() clearshape() 'hapus animasi shape
gtshape.rotate() 'rotasi drawshape() 'gambar shape ke layar else
gtshape.derotate() end if case 37, 100 : 'Panah kiri, 4 'jika shape
dapat ditempatkan kekiri if gtgrid.testshape(x-1,y,gtshape) then
movexy(-1,0) 'pindah ke kiri end if case 39, 102 : 'Panah kanan, 6
if gtgrid.testshape(x+1,y,gtshape) then movexy(1,0) end if case 40,
98 : 'Panah bawah, 2 interval dipercepat gtimer.interval = 10 end
select end sub
INDOPROG
41
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
Metoda DrawSelMetoda ini berfungsi menggambar sel Shape ke layar
untuk animasi, metoda ini akan dipanggil oleh metoda drawshape dan
OnPaint'menggambar sel dari suatu shape private sub drawsel(pen as
pen, brush as brush, _ x as integer, y as integer, _ w as integer,
h as integer) if y > 2 then g.fillrectangle(brush,x*21,y*21,w,h)
g.drawrectangle(pen,x*21,y*21,w,h) end if end sub
Metoda DrawShapeMetoda ini berfungsi menggambar Shape ke layar
dengan memanggil metoda DrawSel untuk masing-masing sel'mengambar
shape secara sementara private sub drawshape() dim i as integer dim
pen as new pen(color.white,1) dim brush as new
solidbrush(gtshape.currentcolor) for i = 0 to 3 drawsel(pen,brush,
_ x+gtshape.currentshapesel(i,0), _ y+gtshape.currentshapesel(i,1),
_ 20,20) next i end sub
Metoda DrawShapeMetoda ini berfungsi menghapus Shape di layar
dengan memanggil metoda DrawSel untuk masing-masing sel (warna
hitam)'menghapus shape sementara private sub clearshape() dim i as
integer dim pen as new pen(color.black,1) dim brush as new
solidbrush(color.black) for i = 0 to 3 drawsel(pen,brush, _
x+gtshape.currentshapesel(i,0), _
y+gtshape.currentshapesel(i,1),20,20) next i end sub
Metoda ReDrawNextShapeMetoda ini berfungsi menggambar NextShape
di layar setiap adanya perubahan nextshape
INDOPROG
42
Pemrograman Berorientasi Objek pada VB.NET'mengambar ulang
nextshape private sub redrawnextshape dim i as integer dim pen as
new pen(color.black,1) dim brush as new solidbrush(color.black)
g.fillrectangle(brush,300,60,120,120) pen.color = color.white
brush.color = gtshape.nextcolor for i = 0 to 3 drawsel(pen,brush, _
16+gtshape.nextshapesel(i,0), _ 4+gtshape.nextshapesel(i,1), _
20,20) next i end sub
Hendra, S.T.
Metoda ReDrawGridMetoda ini berfungsi menggambar ulang Grid
dilayar'mengambar ulang grid private sub redrawgrid dim i,j as
integer dim pen as new pen(color.white,1) dim brush as new
solidbrush(color.red) for i = 3 to 12 for j = 3 to 22 if
gtgrid.parr(i,j) 0 then 'Menggambar ulang isi grid pen.color =
color.white brush.color = gtgrid.carr(i,j)
drawsel(pen,brush,i,j,20,20) else pen.color = color.black
brush.color = color.black drawsel(pen,brush,i,j,20,20) end if next
j next i pen.color = color.black
g.drawrectangle(pen,3*21-1,3*21-1,10*21+1,20*21+1) end sub
Metoda OnPaintMetoda OnPaint akan secara otomatis diaktifkan
oleh windows setiap kali layar form Tetris digambar ulang (misalnya
waktu Maximize dan Minimize)'melakukan overide terhadap sub onpaint
pada base class 'untuk menggambar isi grid setiap proses refresh
pada form protected overrides sub onpaint(e as painteventargs)
redrawgrid() redrawnextshape() end sub
INDOPROG
43
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
Program Kongkretoption explicit on imports sistem imports
sistem.drawing imports sistem.windows.forms imports
microsoft.visualbasic public class tetris : inherits
sistem.windows.forms.form _ public shared sub main() randomize()
application.run(new tetris) end sub private private private private
private private private private withevents gtimer as new
sistem.windows.forms.timer labelscore as new label labelgameover as
new label gtgrid as new tgrid 'instance class tgrid gtshape as new
tshape 'instance class tshape g as graphics x,y as integer 'posisi
x,y shape pada grid score as integer 'score permainan
public sub new() me.text = "Program Tetris" me.size = new
size(450, 600) labelscore.location = new point(61,30)
me.controls.add(labelscore) labelgameover.location = new
point(200,30) me.controls.add(labelgameover) g =
me.creategraphics() score = 0 printscore() nextshape() 'persiapkan
shape berikutnya end sub 'metoda mempersiapkan shape berikutnya
private sub nextshape() gtimer.interval = 200 gtimer.enabled = true
gtshape.generatenextshape() redrawnextshape() x = 7 y = 0 end sub
'memindahkan shape keposisi x,y private sub movexy(dx,dy)
clearshape() x = x + dx y = y + dy drawshape() end sub
'set interval 200 millidetik 'mengaktifkan timer 'cetak shape
berikutnya 'koordinat awal di 7,0
'hapus gambar sebelumnya 'ubah posisi x,y 'gambar diposisi
baru
INDOPROG
44
Pemrograman Berorientasi Objek pada VB.NET'metoda untuk mencetak
score dilayar private sub printscore() labelscore.text = "Score : "
& score.tostring() end sub 'metoda untuk mencetak gameover
private sub printgameover() labelgameover.text = "Game Over" end
sub
Hendra, S.T.
'mengerakan shape ke bawah dengan interval waktu tertentu
private sub gtimer_tick(sender as object, e as eventargs) _ handles
gtimer.tick 'apakah shape bisa turun kebawah if
gtgrid.testshape(x,y+1,gtshape) then movexy(0,1) 'pindah shape 1
baris ke bawah else gtgrid.putshape(x,y,gtshape) 'tempatkan shape
kegrid score = score + gtgrid.checkgrid() 'periksa baris yang
lengkap redrawgrid() 'cetak ulang grid printscore() 'cetak score
'jika shape tertahan di baris 3, artinya game over if y < 3 then
gtimer.enabled = false 'matikan timer karena gameover
printgameover() 'tampil pesan gameover else nextshape() 'persiapkan
gambar berikutnya end if end if end sub 'deteksi penekanan tombol
dengan event keydown pada form private sub tetris_keydown(sender as
object, e as keyeventargs) _ handles mybase.keydown select case
e.keyvalue case 38, 104, 12,101 : 'Panah atas, 8, 5
gtshape.rotate() 'rotasi 'apakah hasil rotasi dapat ditempatkan
diposisi x,y if gtgrid.testshape(x,y,gtshape) then 'kalau ya,
rotasi balik kembali gtshape.derotate() clearshape() 'hapus animasi
shape gtshape.rotate() 'rotasi drawshape() 'gambar shape ke layar
else gtshape.derotate() end if case 37, 100 : 'Panah kiri, 4 'jika
shape dapat ditempatkan kekiri if gtgrid.testshape(x-1,y,gtshape)
then movexy(-1,0) 'pindah ke kiri end if case 39, 102 : 'Panah
kanan, 6 if gtgrid.testshape(x+1,y,gtshape) then movexy(1,0) end if
case 40, 98 : 'Panah bawah, 2 interval dipercepat
INDOPROG
45
Pemrograman Berorientasi Objek pada VB.NETgtimer.interval = 10
end select end sub 'menggambar sel dari suatu shape private sub
drawsel(pen as pen, brush as brush, _ x as integer, y as integer, _
w as integer, h as integer) if y > 2 then
g.fillrectangle(brush,x*21,y*21,w,h)
g.drawrectangle(pen,x*21,y*21,w,h) end if end sub 'mengambar shape
secara sementara private sub drawshape() dim i as integer dim pen
as new pen(color.white,1) dim brush as new
solidbrush(gtshape.currentcolor) for i = 0 to 3 drawsel(pen,brush,
_ x+gtshape.currentshapesel(i,0), _ y+gtshape.currentshapesel(i,1),
_ 20,20) next i end sub 'menghapus shape sementara private sub
clearshape() dim i as integer dim pen as new pen(color.black,1) dim
brush as new solidbrush(color.black) for i = 0 to 3
drawsel(pen,brush, _ x+gtshape.currentshapesel(i,0), _
y+gtshape.currentshapesel(i,1),20,20) next i end sub 'mengambar
ulang nextshape private sub redrawnextshape dim i as integer dim
pen as new pen(color.black,1) dim brush as new
solidbrush(color.black) g.fillrectangle(brush,300,60,120,120)
pen.color = color.white brush.color = gtshape.nextcolor for i = 0
to 3 drawsel(pen,brush, _ 16+gtshape.nextshapesel(i,0), _
4+gtshape.nextshapesel(i,1), _ 20,20) next i end sub
Hendra, S.T.
'mengambar ulang grid
INDOPROG
46
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
private sub redrawgrid dim i,j as integer dim pen as new
pen(color.white,1) dim brush as new solidbrush(color.red) for i = 3
to 12 for j = 3 to 22 if gtgrid.parr(i,j) 0 then 'Menggambar ulang
isi grid pen.color = color.white brush.color = gtgrid.carr(i,j)
drawsel(pen,brush,i,j,20,20) else pen.color = color.black
brush.color = color.black drawsel(pen,brush,i,j,20,20) end if next
j next i pen.color = color.black
g.drawrectangle(pen,3*21-1,3*21-1,10*21+1,20*21+1) end sub
'melakukan overide terhadap sub onpaint pada base class 'untuk
menggambar isi grid setiap proses refresh pada form protected
overrides sub onpaint(e as painteventargs) redrawgrid()
redrawnextshape() end sub end class
public class tgrid public parr(15,25) as integer grid public
carr(15,25) as color grid 'konstruktur class tgrid public sub new()
dim i, j as integer for i = 0 to 15 for j = 0 to 25 parr(i,j) = 1
next j next i for i = 3 to 12 for j = 0 to 22 parr(i,j) = 0 next j
next i end sub
'Array menyimpan isi sel pada 'Array menyimpan warna sel
pada
'isi bingkai
'isi arena
'Mengembalikan nilai yang menunjukan apakah 'shape dapat
ditempatkan pada grid diposisi x,y public function testshape(x as
integer, y as integer, s as tshape) _ as boolean dim i as
integer
INDOPROG
47
Pemrograman Berorientasi Objek pada VB.NETfor i = 0 to 3 'apakah
sel pada grid telah terisi if parr(x+s.currentshapesel(i,0), _
y+s.currentshapesel(i,1)) > 0 then return false end if next i
return true end function
Hendra, S.T.
'Menempatkan shape pada posisi x,y di grid public sub putshape(x
as integer, y as integer, s as tshape) dim i as integer for i = 0
to 3 parr(x+s.currentshapesel(i,0), _ y+s.currentshapesel(i,1)) = 1
carr(x+s.currentshapesel(i,0), _ y+s.currentshapesel(i,1)) =
s.currentcolor next i end sub 'periksa apakah ada baris yang
berhasil diselesaikan pemain public function checkgrid() as integer
dim i,j as integer dim b,k as integer dim complete as integer
complete = 0 i = 22 do while i > 3 j = 3 do while parr(j,i) 0
and j < 13 j=j+1 loop if j = 13 then beep 'sound beep complete =
complete + 1 for b = i to 4 step -1 for k = 3 to 12 parr(k,b) =
parr(k,b-1) carr(k,b) = carr(k,b-1) next k next b else i = i - 1
end if loop return complete end function end class public class
tshape private currentshape private nextshape as public
currentcolor public nextcolor as
as integer integer as color color
'menyimpan 'menyimpan 'menyimpan 'menyimpan
nomor nomor warna warna
current shape next shape current shape next shape
private currentstate as integer
'nomor rotasi shape
INDOPROG
48
Pemrograman Berorientasi Objek pada VB.NET
Hendra, S.T.
'Array 4 dimensi yang berisi nilai sel dari masing-masing bentuk
'serta bentuk rotasinya private sarr(,,,) as integer =
{{{{1,0},{1,1},{1,2},{1,3}}, _ {{0,1},{1,1},{2,1},{3,1}}, _
{{1,0},{1,1},{1,2},{1,3}}, _ {{0,1},{1,1},{2,1},{3,1}}}, _
{{{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}, _
{{0,0},{0,1},{1,0},{1,1}}, _ {{0,0},{0,1},{1,0},{1,1}}}, _
{{{0,0},{0,1},{0,2},{1,2}}, _ {{0,0},{0,1},{1,0},{2,0}}, _
{{0,0},{1,0},{1,1},{1,2}}, _ {{0,1},{1,1},{2,0},{2,1}}}, _
{{{0,0},{0,1},{0,2},{1,1}}, _ {{0,0},{1,0},{1,1},{2,0}}, _
{{1,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,1}}}, _
{{{0,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,0}}, _
{{0,0},{0,1},{1,1},{1,2}}, _ {{0,1},{1,0},{1,1},{2,0}}}, _
{{{0,1},{0,2},{1,0},{1,1}}, _ {{0,0},{1,0},{1,1},{2,1}}, _
{{0,1},{0,2},{1,0},{1,1}}, _ {{0,0},{1,0},{1,1},{2,1}}}}
'konstrutor untuk class tshape public sub new()
generateshape(nextshape, nextcolor) end sub 'Membuat next shape
berikutnya, dan menset current shape public sub generatenextshape()
currentshape = nextshape currentcolor = nextcolor currentstate = 0
'rotasi ke 0 generateshape(nextshape, nextcolor) 'buat nextshape
baru end sub 'Membuat bentuk dan mengembalikan melalui parameter
shape dan shapecolor private sub generateshape(byref shape as
integer, _ byref shapecolor as color) dim c as integer shape =
int(rnd*6) 'random untuk shape c = int(rnd*8) 'random untuk shape
color select case c case 0 : shapecolor = color.red case 1 :
shapecolor = color.green case 2 : shapecolor = color.blue case 3 :
shapecolor = color.orange case 4 : shapecolor = color.pink case 5 :
shapecolor = color.cyan case 6 : shapecolor = color.gray case else
shapecolor = color.magenta
INDOPROG
49
Pemrograman Berorientasi Objek pada VB.NETend select end sub
'Rotasi ke bentuk berikutnya public sub rotate() currentstate =
currentstate + 1 if currentstate = 4 then currentstate = 0 end sub
'Rotasi ke bentuk sebelumnya public sub derotate() currentstate =
currentstate - 1 if currentstate = -1 then currentstate = 3 end
sub
Hendra, S.T.
'Rotasi berikutnya 'Kembali ke bentuk awal
'Rotasi sebelumnya
'Mengembalikan sel i,j dari current shape public function
currentshapesel(i as integer, j as integer) return
sarr(currentshape,currentstate,i,j) end function 'Mengembalikan sel
i,j dari next shape public function nextshapesel(i as integer, j as
integer) return sarr(nextshape,0,i,j) 'Bentuk awal end function end
class
Kompilasi ProgramVbc tetris.vb /r:sistem.dll
/r:sistem.drawing.dll /r:sistem.windows.forms.dll
INDOPROG
50