Game Dual Tetris
I.
PENDAHULUAN
Game merupakan sebuah aktivitas
rekreasi dengan tujuan bersenang senang untuk menghilangkan kejenuhan dalam
melakukan rutinitas sehari hari. Sekarang ini perkembangan game semakin pesat
mengikuti dengan perkembangan teknologi .
Atas
dasar uraian diatas maka penulis mencoba mengembangkan game tetris yang sudah
ada dengan membuat permainan tetris dapat dimainkan oleh dua pemain dalam satu
layar komputer tanpa ada pergantian atau korelasi antar pemain. Game ini
memiliki tingkat kesulitan yang beragam, tingkat kesulitan ini akan meningkat
ketika setiap pemain dapat mengumpulkan nilai yang telah ditentukan.
Game ini akan memberikan nilai
kepada pemain saat pemain mampu membuat balok-balok yang telah disediakan
memenuhi satu baris atau lebih. Saat baris telah penuh, secara otomatis baris
tersebut akan menghilang dan akan menghasilkan nilai yang tergantung pada
banyaknya baris yang menghilang secara bersamaan.
Ada dua kemungkinan yang dapat
membuat permainan ini selesai, pertama saat sudah tidak ada lagi baris yang
dapat ditempati oleh balok-balok tersebut. Dan yang kedua jika salah satu
pemain telah telah menyelesaikan level tertinggi.
Tujuan penulisan mengembangkan game
tetris untuk dua orang pemain dalam satu layar komputer yang dapat menstimulasi
kemampuan berpikir secara taktis, cepat dan mampu membuat pemain lebih kreatif,
juga dapat dijadikan alat penghilang kejenuhan setelah beraktivitas seharian
penuh, dengan tujuan dibuatnya game ini diharapkan dapat membantu pemain dalam
mengambil keputusan di kehidupan sehari-hari.
II. PERANCANGAN GAME
Game tetris merupakan game yang diperuntukan untuk usia
pemain 7 sampai 15 tahun yang berujuan untuk meningkatkan daya stimulus otak
anak, Namun game tetris pun dapat juga
dimainkan di kalangan orang dewasa untuk menghilangkan kejenuhan setelah
beraktifitas. Dalam penulisan makalah ini, Penulis membuat pengembangan game
tetris dengan membuat game tetris ini dapat dimainkan oleh dua pemain dalam
satu layar tanpa ada pergantian atau korelasi antar pemain.
2.1 Algoritma
Dalam permainan DualTetris ini algoritma yang gunakan
untuk mencari solusi adalah algoritma yang menggunakan konsep-konsep yang ada
dalam algoritma Greedy dan Algoritma BruteForce.Algoritma Greedy merupakan
metode yang paling umum digunakan untuk memecahkan masalah optimasi.Algoritma
ini sederhana dan sesuai dengan tujuan yang ada.
Algoritma yang digunakan untuk
mendapatkan susunan tumpukan balok yang paling baik dengan menempatkan balok ke
tempat yang tepat.Algoritma ini menggunakan prinsip Greedy dalam mencari langkah
solusi yang paling menguntungkan. Prioritas keuntungan yang tersusun terdiri
dari:
1. Membentuk satu atau lebih baris paling penuh
2. Membentuk satu atau lebih baris paling mendekati penuh
3. Tidak membentuk ruang kosong pada susunan tumpukan balok
4. Balok dapat masuk ke dalam susunan tumpukan balok paling dalam
Algoritma yang kami kemukakan akan mencari
penempatan balok yang jatuh ke ruang yang paling tepat sesuai prioritas
keuntungan di atas diantara susunan tumpukan balok. Pencarian ini akan dilakukan
secaraBrute Force. Balok yang jatuh akan dicoba untuk ditempatkan ke
ruang di antara susunan tumpukan balok dibawah.
Algoritma ini akan mencari penempatan yang sesuai dengan prioritas
di atas. Pencarian solusi diantara susunan tumpukan balok akan dilakukan secara Brute Force. Algoritma ini akan mencari solusi
paling menguntungkan untuk setiap sisi balok yang sedang jatuh. Pencarian
solusi untuk setiap sisi dilakukan secar Brute
Force. Apabila pada skala prioritas tertinggi memiliki lebih dari satu solusi
terbaik yang sama, maka diantara solusi tersebut akan dibandingkan satu sama
lain untuk mencari yang paling menguntungkan dengan standard prioritas
selanjutnya, dan begitu selanjutnya. Apabila pada skala prioritas tertinggi
tidak memiliki solusi, maka akan mencari solusi paling menguntungkan dengan
skala prioritas selnjutnya, dan begitu selanjutnya. Apabila pada skala
prioritas tertinggi hanya memiliki satu solusi paling menguntungkan, maka akan dibandingkan
dengan solusi dari hasil pencarian solusi untuk sisi balok yang lain. Diantara
setiap solusi sisi balok, dicari solusi yang paling menguntungkan sesuai skala
prioritas di atas. Dan balok akan ditempatkan pada ruang tersebut.
2.2 Pengambilan Modul
Pada game Tetris yang penulis
buat ini, penulis meng-import modul-modul dari Python. Dan karena
penulis menggunakan PyGame untuk menunjang game Tetris ini, maka penulis
tidak lupa untuk meng-import PyGame. Modul-modul ini mempunyai fungsi
untuk menunjang grafik dan suara.
import random, os, pygame
import
pygame.mixer
from
pygame.locals import *
2.3 Pembuatan Papan Game
Dalam pembuatannya, program akan memanggil
/ me-load gambar yang telah dibuat oleh penulis, lalu menentukan range
atau ukuran layar yang akan digunakan.
class grid:
""" Tetris grid, contains
all of the dropped blocks """
def
__init__(self,intX,intY):
self.layers
= [[[0 for x in range(0,10)] for y in range(0,20)]]
self.currentgrid
= self.layers[0]
self.gridX
= intX
self.gridY
= intY
for
i in range(0,20):
for
j in range(0, 10):
self.currentgrid[i][j]
= 0
self.height
= 0
self.blockimages
= [ load_image("redblock.gif"),
load_image("yellowblock.gif"),\
load_image("turqblock.gif"),
load_image("purpleblock.gif"),\
load_image("greenblock.gif"),
load_image("blueblock.gif"),\
load_image("orangeblock.gif"),
load_image("whiteblock.gif") ]
def
blitgrid(self, screen):
for
i in range(20 - (self.height), 20):
for
j in range(0, 10):
blcolor = self.currentgrid[i][j]
if
blcolor > 0:
currentX
= self.gridX + (j*16)
currentY
= self.gridY + (i*16)
screen.blit(self.blockimages[blcolor-1],\
(currentX, currentY))
Untuk me-load gambar yang
telah dibuat, dipergunakan fungsi perumusan program di bawah ini :
def load_image(name,
colorkey=None):
fullname
= os.path.join('Image', name)
try:
image
= pygame.image.load(fullname)
except
pygame.error, message:
print
'Cannot load image:', fullname
raise
SystemExit, message
image
= image.convert()
if
colorkey is not None:
if
colorkey is -1:
colorkey
= image.get_at((0,0))
image.set_colorkey(colorkey,
RLEACCEL)
return
image
Tampilan
memiliki ukuran resolusi 640 x 480 maka papan permainan ditentukan terlebih
dahulu koordinatnya.
def Game(screen):
titlescreen = load_image('background.jpg')
bggrid = load_image('gridbg1.gif')
droppulse =
load_sound("pulse.wav")
titlePos = [0,0]
gridPos1 = [21,140]
gridPos2 = [455,142]
blockScreen = [gridPos1[0],gridPos1[1],230,393]
blockScreen2 =
[gridPos2[0],gridPos2[1],375,393]
gameGrid = grid(gridPos1[0],gridPos1[1])
gameGrid2 = grid(gridPos2[0],gridPos2[1])
levelPos = [100,25,100]
levelTopPos = [270, 170]
levelTopPos2 = [380, 170]
cScorePos = [50,100,50]
cScoreTopPos = [130,55]
cScoreTopPos1 = [540,55]
screen.blit(titlescreen,
(titlePos[0],titlePos[1]))
screen.blit(bggrid,
(gridPos1[0],gridPos1[1]))
screen.blit(bggrid,
(gridPos2[0],gridPos2[1]))
currentlevel = 1
currentlines = 0
dropcounter = 0
currentscore = 0
gameOver = 0
currentlevel2 = 1
currentlines2 = 0
dropcounter2 = 0
currentscore2 = 0
gameOver2 = 0
StatusGame = 0
droprate = 30 / (currentlevel * 0.5)
droprate2 = 30 / (currentlevel2 * 0.5)
clock = pygame.time.Clock()
currentBlock =
piece(random.randint(1,7),blockScreen)
nextBlock
= piece(random.randint(1,7),blockScreen)
nextBlock.blitimage(screen, 1)
currentBlock2 = piece(random.randint(1,7),blockScreen2)
nextBlock2 = piece(random.randint(1,7),blockScreen2)
nextBlock2.blitimage(screen, 1)
block_moved = 1
block_moved2 = 1
if pygame.font:
font
= pygame.font.Font(None, 40)
cscoreText=font.render(str(currentscore),0,(cScorePos[0],cScorePos[1],cScorePos[2]))
cscoreTextpos
= cscoreText.get_rect()
cscoreTextpos.topright=(cScoreTopPos[0],cScoreTopPos[1])
levelText=font.render(str(currentlevel),0,(levelPos[0],levelPos[1],levelPos[2]))
levelTextpos = levelText.get_rect()
levelTextpos.topright=(levelTopPos[0],levelTopPos[1])
screen.blit(cscoreText, cscoreTextpos)
screen.blit(levelText, levelTextpos)
cscoreText2=font.render(str(currentscore2),0,(cScorePos[0],cScorePos[1],cScorePos[2]))
cscoreTextpos2 = cscoreText2.get_rect()
cscoreTextpos2.topright=(cScoreTopPos1[0],cScoreTopPos1[1])
levelText2=font.render(str(currentlevel2),0,(levelPos[0],levelPos[1],levelPos[2]))
levelTextpos2 = levelText2.get_rect()
levelTextpos2.topright=(levelTopPos2[0],levelTopPos2[1])
screen.blit(cscoreText2, cscoreTextpos2)
screen.blit(levelText2, levelTextpos2)
2.4 Game Control
Dalam bermain game ini dibutuhkan
kontrol-kontrol permainan pada keyboard. Untuk pergeseran balok ke arah kiri,
kanan, bawah dalam papan game digunakan program seperti di bawah ini :
def moveleft(self):
if (self.blocks[0].xGrid + self.xVal)
> 0:
self.xVal -= 1
self.moveclick.play()
self.xVelocity = -(1)
def moveright(self):
if (self.blocks[2].xGrid + self.xVal)
< 9:
self.xVal += 1
self.moveclick.play()
self.xVelocity = 1
def movedown(self):
if ((self.blocks[3].yGrid + self.yVal)
< 19):
self.yVal += 1
self.yVelocity = 1
Dalam kontrol permainan, penulis
menggunakan keyboard sebagai alat inputnya. Untuk pemain pertama kontrol yang
digunakan adalah tombol a untuk bergerak ke kiri, tombol d untuk bergerak ke
kanan, tombol s untuk bergerak ke bawah, dan tombol w untuk merubah posisi
balok yang diinginkan. Dengan program sebagai berikut :
if gameOver == 0:
if
event.key == K_a:
if
not gridcollision(currentBlock, gameGrid, 1):
currentBlock.moveleft()
block_moved
= 1
elif
event.key == K_d:
if
not gridcollision(currentBlock, gameGrid, 2):
currentBlock.moveright()
block_moved
= 1
if
event.key == K_s:
if
not gridcollision(currentBlock, gameGrid, 3):
currentBlock.movedown()
block_moved
= 1
if
event.key == K_w:
currentBlock.rotateright(gameGrid)
block_moved
= 1
elif event.type == KEYUP:
if
gameOver == 0:
if
(event.key == K_a) or (event.key == K_d):
currentBlock.xVelocity
= 0
currentBlock.timer
= 0
if
event.key == K_s:
currentBlock.yVelocity
= 0
Untuk pemain kedua kontrol yang digunakan
adalah tombol kiri untuk bergerak ke kiri, tombol kanan untuk bergerak ke
kanan, tombol bawah untuk bergerak ke bawah, dan tombol atas untuk merubah
posisi balok yang diinginkan :
if
event.key == K_LEFT:
if
not gridcollision(currentBlock, gameGrid2, 1):
currentBlock2.moveleft()
block_moved2
= 1
elif
event.key == K_RIGHT:
if
not gridcollision(currentBlock, gameGrid2, 2):
currentBlock2.moveright()
block_moved2
= 1
if
event.key == K_DOWN:
if
not gridcollision(currentBlock, gameGrid2, 3):
currentBlock2.movedown()
block_moved2
= 1
if
event.key == K_UP:
currentBlock2.rotateleft(gameGrid2)
block_moved2
= 1
if
gameOver2 == 0:
if
(event.key == K_LEFT) or (event.key == K_RIGHT):
currentBlock2.xVelocity
= 0
currentBlock2.timer
= 0
if
event.key == K_DOWN:
currentBlock2.yVelocity
= 0
Untuk memunculkan gambar game over,
penulis menggunakan program seperti di bawah ini :
def
GameOver(screen):
gameoverimage
= load_image("gameover.gif")
screen.blit(gameoverimage,
(180, 200))
pygame.display.flip()
while(1):
for
event in pygame.event.get():
if
event.type == QUIT:
return True
elif
event.type == KEYDOWN:
if event.key == K_ESCAPE:
return False
elif event.key == K_RETURN:
return True
Setelah sudah dibuat, selanjutnya
untuk menggabungkan semua agar pemain pertama dan pemain kedua dapat bermain
dalam satu tampilan., penulis menggunakan program di bawah :
pygame.display.flip()
if not (
currentBlock.xVelocity == 0 and currentBlock.yVelocity == 0 and block_moved ==
0 ):
screen.blit(titlescreen, (0,0))
screen.blit(bggrid, (gridPos1[0],gridPos1[1]))
screen.blit(bggrid,
(gridPos2[0],gridPos2[1]))
nextBlock.blitimage(screen, 1)
nextBlock2.blitimage(screen, 1)
gameGrid.blitgrid(screen)
gameGrid2.blitgrid(screen)
currentBlock.blitimage(screen, 0)
currentBlock2.blitimage(screen, 0)
if pygame.font:
screen.blit(cscoreText,
cscoreTextpos)
screen.blit(levelText, levelTextpos)
screen.blit(cscoreText2,
cscoreTextpos2)
screen.blit(levelText2,
levelTextpos2)
block_moved = 0
block_moved2 = 0
pygame.display.flip()
if not (
currentBlock2.xVelocity == 0 and currentBlock2.yVelocity == 0 and block_moved2
== 0 ):
screen.blit(titlescreen, (0,0))
screen.blit(bggrid,
(gridPos1[0],gridPos1[1]))
screen.blit(bggrid,
(gridPos2[0],gridPos2[1]))
nextBlock.blitimage(screen, 1)
nextBlock2.blitimage(screen, 1)
gameGrid.blitgrid(screen)
gameGrid2.blitgrid(screen)
currentBlock.blitimage(screen, 0)
currentBlock2.blitimage(screen, 0)
if pygame.font:
screen.blit(cscoreText,
cscoreTextpos)
screen.blit(levelText,
levelTextpos)
screen.blit(cscoreText2,
cscoreTextpos2)
screen.blit(levelText2, levelTextpos2)
block_moved = 0
block_moved2 = 0
pygame.display.flip()
if StatusGame == 2:
return True
2.5 Petunjuk
Game
Dalam program yang menghasilkan game Tetris ini, penulis tidak
memberikan cara bermain yang berbeda dari game Tetris lainnya. Game ini lebih
mengandalkan kecepatan, ketepatan, dan strategi dalam memikirkan bagaimana
caranya agar setiap baris dalam layar dapat dipenuhi oleh balok-balok yang
telah disediakan oleh penulis di dalam game tersebut.
Setiap baris yang dapat dipenuhi oleh pemain dengan balok yang telah
disediakan, akan mendapatkan nilai. Baris yang telah dipenuhi balok,
selanjutnya akan menghilang dan baris yang di atasnya yang belum penuh satu
baris akan menempati baris terbawah dari layar. Nilai yang diperoleh pemain
tergantung dari banyak baris yang dapat penuh secara langsung oleh pemain.
Pemain
pertama dapat menggeser baloknya dengan tombol huruf A, S, dan D untuk arah
kiri, bawah, dan kanan. Lalu untuk merubah posisi balok dengan tombol huruf W
pada keyboard. Sedangkan untuk pemain kedua dapat menggeser balok dengan
menekan arah kiri, kanan, bawah untuk ke kiri, kanan, dan bawah. Lalu untuk merubah
posisinya dengan menekan arah atas.
III. PENUTUP
3.1 Kesimpulan
Pengembangan game DualTetris ini
bertujuan untuk menstimulus otak anak usia 7 – 15 dimana terdapat dua pemain
dalam satu layar yang diharapkan dapat membuat permainan tetris menjadi lebih
menarik. Selain itu game tetris ini dapat di jadikan alternative untuk kalangan
dewasa untuk mengisi waktu senggang atau penghilang kejenuhan. Dalam pembuatan
game ini penulis menggunakan bahasa pemograman pyton program pygame. Namun pada game Dualtetris ini
penulis belum dapat menyimpat data statistic pemain dan nilai pemain , serta
game ini hanya dapat dijalankan pada komputer yang telah terinstal Pyton dan
Pygame sebelumnya.
Sumber :
http://andikafisma.wordpress.com/kelebihan-kelemahan-dan-aplikasi-10-bahasa-pemrograman/
http://catatan-sandy.blogspot.com/2013/02/bahasa-pemrograman-python.html
http://ghosthand5.blogspot.com/2013/03/apa-itu-python.html
http://id.wikipedia.org/wiki/Tetris
Sumber :
http://andikafisma.wordpress.com/kelebihan-kelemahan-dan-aplikasi-10-bahasa-pemrograman/
http://catatan-sandy.blogspot.com/2013/02/bahasa-pemrograman-python.html
http://ghosthand5.blogspot.com/2013/03/apa-itu-python.html
http://id.wikipedia.org/wiki/Tetris