You are on page 1of 50

Pemrograman Berorientasi Objek pada VB.

NET

Hendra, S.T.

Pemrograman Berorientasi Objek pada VB.Net


Oleh : 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

Pemrograman Berorientasi Objek pada VB.NET

Hendra, S.T.

Dasar OOP
Visual 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

Pemrograman Berorientasi Objek pada VB.NET

Hendra, S.T.

Konsep dari OOP:

Objects
Classes
Data Abstraction dan Encapsulation
Inheritance
Polymorphism

Objek
Objek 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.

Class
Suatu 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 Encapsulation


Abstraction 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

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.

Inheritance
Inheritance 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.

Polymorphism
Polymorphism 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

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

Pemrograman Berorientasi Objek pada VB.NET

Hendra, S.T.

OOP pada Visual Basic


Membuat Class
Pemrograman 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

Pemrograman Berorientasi Objek pada VB.NET

Hendra, S.T.

End Sub
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 class


Pada 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

Pemrograman Berorientasi Objek pada VB.NET

Hendra, S.T.

Constructors
Suatu 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 dengan
Dim Bola As Pantul
Bola = New Pantul(Me)

Dimana Me mengacu pada form yang sedang aktif.

Destructors
Destructors 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

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 Pantul


For 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
<Sistem.STAThread()> _
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

Pemrograman Berorientasi Objek pada VB.NET

Hendra, S.T.

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
MyTimer.Interval = 150
'150 millidetik
MyTimer.Enabled = True
End Sub
'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

Hendra, S.T.

'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

INDOPROG

11

Pemrograman Berorientasi Objek pada VB.NET

Hendra, S.T.

Inheritance
Pemanfaatan Kembali
Kunci 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 Pantul
Class Pantul
member
End Class

Selanjutnya misalnya kita ingin mengembangkan Class baru dengan menurunkannya dari Class
Pantu
Class Pantul1 : Inherits Pantul
member
End Class

Maka Class Pantul1 akan mewarisi semua member Pantul yang dideklarasikan sebagai Protected
maupun Public.

Overriding
Pada 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 Overridable
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)

INDOPROG

12

Pemrograman Berorientasi Objek pada VB.NET

Hendra, S.T.

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

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

Shadowing
Jika 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 Form


Untuk 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
<Sistem.STAThread()> _
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

INDOPROG

'posisi
'posisi
'jumlah
'jumlah

x dilayar
y dilayar
kolom x
baris y

15

Pemrograman Berorientasi Objek pada VB.NET


Private dx As Single
Private dy As Single

'arah bola terhadap x


'arah bola terhadap y

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

Hendra, S.T.

'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
'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.NET

Hendra, S.T.

Dim MyPen As New Sistem.Drawing.Pen(f.BackColor,3)


MyGraphic.DrawRectangle(MyPen, x*30,y*30,30,30)
End Sub
End Class

INDOPROG

17

Pemrograman Berorientasi Objek pada VB.NET

Hendra, S.T.

Polymorphism
Polymorphism 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.NET

Hendra, S.T.

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

Dalam hal ini class pantul memiliki dua konstruktor yang masing-masing memiliki daftar
argument yang berbeda yaitu :
Public Sub New(f as form)

'constructor

Dan
Public 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.NET

Hendra, S.T.

Next I

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
<Sistem.STAThread()> _
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.NET

Hendra, S.T.

Bola(I).Move(Me)
Next I
End Sub
End Class

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.NET

Hendra, S.T.

End Sub
End Class
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 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.

Interfaces
Interfaces 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.NET

Hendra, S.T.

Console.WriteLine("Good Afternoon")
End Sub
Sub Malam() Implements Sapaan.Malam
Console.WriteLine("Good Evening")
End Sub
End Class

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.NET

Hendra, S.T.

End Class
End Module

Dan kalau dijalankan akan menghasilkan tampilan berikut

INDOPROG

26

Pemrograman Berorientasi Objek pada VB.NET

Hendra, S.T.

Abstract Classes
Suatu 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 Abstrak


Pada 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.NET

Hendra, S.T.

Console.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

INDOPROG

28

Pemrograman Berorientasi Objek pada VB.NET

Hendra, S.T.

Program Tetris
Oleh : 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 program
Program ini menggunakan pendekatan berorientasi objek dengan membuat dua class untuk objek
Shape dan objek Grid

Class TShape
Class 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

Hendra, S.T.

{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}

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 TShape


private currentshape as integer
private nextshape as integer

INDOPROG

'menyimpan nomor current shape


'menyimpan nomor next shape

31

Pemrograman Berorientasi Objek pada VB.NET


public 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.NET

Hendra, S.T.

case 6 : shapecolor = color.gray


case else
shapecolor = color.magenta
end select
end sub

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 TGrid
Class 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 digunakan


public 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

'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

Hendra, S.T.

'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.NET


parr(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

Hendra, S.T.

_
= 1
_
= s.currentcolor

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.NET

Hendra, S.T.

next i
return true
end function

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 Tetris
Class ini merupakan class utama permainan Tetris

Variabel yang digunakan


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

Konstruktor Tetris
Berfungsi 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 NextShape
Metoda 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

INDOPROG

'set interval 200 millidetik

39

Pemrograman Berorientasi Objek pada VB.NET


gtimer.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 MoveShape
Metoda 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 MoveShape
Metoda ini berfungsi memperbaharui nilai score di layar
'metoda untuk mencetak score dilayar
private sub printscore()
labelscore.text = "Score : " & score.tostring()
end sub

Metoda MoveShape
Metoda ini berfungsi mengubah tulisan di labelgameover menjadi Game Over
'metoda untuk mencetak gameover
private sub printgameover()
labelgameover.text = "Game Over"
end sub

Event Tick
Event 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 KeyDown
Event 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 DrawSel
Metoda 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 DrawShape
Metoda 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 DrawShape
Metoda 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 ReDrawNextShape
Metoda ini berfungsi menggambar NextShape di layar setiap adanya perubahan nextshape

INDOPROG

42

Pemrograman Berorientasi Objek pada VB.NET

Hendra, S.T.

'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

Metoda ReDrawGrid
Metoda 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 OnPaint
Metoda 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 Kongkret
option explicit on
imports sistem
imports sistem.drawing
imports sistem.windows.forms
imports microsoft.visualbasic
public class tetris : inherits sistem.windows.forms.form
<sistem.STAThread> _
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

INDOPROG

'set interval 200 millidetik


'mengaktifkan timer
'cetak shape berikutnya
'koordinat awal di 7,0

'hapus gambar sebelumnya


'ubah posisi x,y
'gambar diposisi baru

44

Pemrograman Berorientasi Objek pada VB.NET

Hendra, S.T.

'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
'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.NET

Hendra, S.T.

gtimer.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

'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.NET

Hendra, S.T.

for 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
'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

private currentstate as integer

INDOPROG

'menyimpan
'menyimpan
'menyimpan
'menyimpan

nomor
nomor
warna
warna

current shape
next shape
current shape
next shape

'nomor rotasi shape

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.NET

Hendra, S.T.

end 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

'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 Program
Vbc tetris.vb /r:sistem.dll /r:sistem.drawing.dll /r:sistem.windows.forms.dll

INDOPROG

50

You might also like