Senin, 07 Juli 2014

T3,T4 GAME DUAL TETRIS

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