Pemrograman Berorientasi Objek pada VB.Net Oleh : Hendra, ST.
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 withevents gtimer as new sistem.windows.forms.timer private labelscore as new label private labelgameover as new label private gtgrid as new tgrid
'instance class tgrid
'instance class tshape private g as graphics
private gtshape as new tshape
private x,y as integer
'posisi x,y shape pada grid
private 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
'set interval 200 millidetik gtimer.enabled = true
'mengaktifkan timer gtshape.generatenextshape() redrawnextshape()
'cetak shape berikutnya x=7
'koordinat awal di 7,0 y=0 end sub
'memindahkan shape keposisi x,y private sub movexy(dx,dy) clearshape()
'hapus gambar sebelumnya x = x + dx
'ubah posisi x,y y = y + dy drawshape()
'gambar diposisi baru end sub
'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 case 40, 98 : 'Panah bawah, 2 interval dipercepat
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 'mengambar ulang grid
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
'Array menyimpan isi sel pada grid public carr(15,25) as color
public parr(15,25) as integer
'Array menyimpan warna sel pada 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
'isi bingkai
next j next i for i=3 to 12
for j=0 to 22 parr(i,j) = 0
'isi arena
next j next i end sub
'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 dim i as integer
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 as integer
'menyimpan nomor current shape
'menyimpan nomor next shape public currentcolor as color
private nextshape as integer
'menyimpan warna current shape public nextcolor as color
'menyimpan warna next shape
private currentstate as integer
'nomor rotasi 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}}}, _
'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 case else shapecolor = color.magenta
'Rotasi ke bentuk berikutnya public sub rotate() currentstate = currentstate + 1
'Rotasi berikutnya if currentstate = 4 then currentstate = 0
'Kembali ke bentuk awal end sub
'Rotasi ke bentuk sebelumnya public sub derotate() currentstate = currentstate - 1
'Rotasi sebelumnya if currentstate = -1 then currentstate = 3 end sub
'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
!&