Skip to main content

Tutorial Membuat Game Snake dengan Python 3.6 keatas


Kode Program Snake Game dengan Modul Python Pygame

Python Snake Game

Dalam beberapa bahasa pemrograman, terdapat modul untuk bisa membangun sebuah game dari bahasa pemrograman tersebut. Sebagai contoh, di pemrograman java ada Java 2D Games dan di pemrograman Python ada modul Pygame. Berikut langkah-langkah membangun Game Snake di Python.

Game Snake atau Game Ular adalah Game yang dimana Player Game mengendalikan ular untuk memakan target makanan dalam game. Ular akan bertambah panjang jika berhasil memakan target makanan dan ular akan mati atau game over jika ular menabrak batas jendela dalam game.

Tahap pertama :

1. Komputer sudah terinstall Python versi 3.6 atau yang lebih tinggi. Jika belum terinstall, silahkan download di situs resmi Python sesuai sistem operasi yang di gunakan dan versi Python harus 3.6 atau lebih tinggi
 ==>> Download Python.Disini.

2. Setelah terinstall, Buka text editor yang anda gunakan untuk menulis kode program. Di tutorial ini saya menggunakan text editor Visual Studio Code.

3. Langkah selanjutnya, buatlah file baru dengan nama Snake.py dan simpan di folde komputer anda.



4. Selanjutnya install modul Pygame python :
    Untuk yang menggunakan Sistem Operasi Windows bisa dilakukan dengan cara : 

      - Buka CMD (Command Prompt) , ketikkan pip install pygame. pastikan Python sudah terinstall dan setting enviroment variabel sudah di tambahkan. 


    Untuk pengguna Linux bisa mengetikkan sudo apt-get install python-pygame di terminal.

5. Masukkan Kode Program di bawah ini ke file Snake.py yang telah kita buat sebelumnya.

import pygame as pg
import sys,random
def collide(x1,y1,x2,y2,x3,y3,x4,y4):
    if (x3+x4) > x1 > x3 and (y3+y4) > y1 > y3 or (x3+x4) > x2 >x3 and (y3+y4) > y2 > y3:
        return True
    else:
        return False
def collide2(x1,y1,x2,y2,x3,y3,x4,y4,size):
    if (x3+(11*size)) > x1 > x3-1 and (y3+(11*size)) > y1 > y3-1 or (x3+(11*size)) > x2 >x3-1 and (y3+(11*size)) > y2 > y3-1:
        return True
    else:
        return False
def collide3(x1,y1,x2,y2,x3,y3,x4,y4,size):
    if (x3+(10*size)) > x1 > x3 and (y3+(10*size)) > y1 > y3 or (x3+(10*size)) > x2 >x3 and (y3+(10*size)) > y2 > y3:
        return True
    else:
        return False
class snake():
    def __init__(self,speed, size):
        self.pos = [20,20]
        self.image = pg.Surface((10*size,10*size))
        self.image.fill((0,255,0))
        self.speed = speed
        self.size = size
        self.images = []
        self.old_pos = [[20,20]]
        self.direction = [0,0]
        self.score = 0
    def right(self):
        self.direction = [self.speed,0]
    def left(self):
        self.direction = [-self.speed,0]
    def up(self):
        self.direction = [0,-self.speed]
    def down(self):
        self.direction = [0, self.speed]
    def update(self):
        if self.old_pos[-1] != self.pos:
            self.old_pos.append([self.pos[0],self.pos[1]])
        self.pos[0] += self.direction[0]
        self.pos[1] += self.direction[1]
        a = 1
        for x in self.images:
            x[1] = self.old_pos[int(a*((-11*self.size)/self.speed))]
            a+=1
    def check_collisions(self, x):
        c=collide(self.pos[0],self.pos[1],self.pos[0]+10,self.pos[1]+10,x[0],x[1],x[0]+10,x[1]+10)
        return c
    def check_apple(self,x):
        c=collide2(self.pos[0],self.pos[1],self.pos[0]+10,self.pos[1]+10,x[0],x[1],x[0]+10,x[1]+10, self.size)
        return c
    def check_collisions2(self,x):
        c=collide3(self.pos[0],self.pos[1],self.pos[0]+10,self.pos[1]+10,x[0],x[1],x[0]+10,x[1]+10, self.size)
        return c
    def add_apple(self):
        self.score +=1
        block = pg.Surface((10*self.size,10*self.size))
        block.fill((0,255,0))
        self.images.append([block,[10,10]])
class apple():
    def __init__(self,size):
        self.pos = [random.randrange(10, 780,10),random.randrange(10,430,10)]
        self.image = pg.Surface((10*size,10*size))
        self.image.fill((255,0,0))
class game():
    def __init__(self,speed, size=1):
        self.screen = pg.display.set_mode((800,450))
        pg.display.set_caption('Snake Game')
        self.snake = snake(speed, size)
        self.blocks = []
        self.score = 0
        self.size = size
        self.left,self.right,self.up,self.down = False,False,False,False
        self.hover = False
        self.click0 = False
        color = (0,0,0)
        for x in range(0,800,10):
            t=pg.Surface((10,10))
            t.fill(color)
            self.blocks.append([t, [x,0]])
        for x in range(0,800,10):
            t=pg.Surface((10,10))
            t.fill(color)
            self.blocks.append([t, [x,440]])
        for x in range(0,450,10):
            t=pg.Surface((10,10))
            t.fill(color)
            self.blocks.append([t, [0,x]])
        for x in range(0,450,10):
            t=pg.Surface((10,10))
            t.fill(color)
            self.blocks.append([t, [790,x]])
        self.apple = apple(size)
    def over(self):
        while 1:
            for event in pg.event.get():
                if event.type == pg.QUIT:
                    sys.exit()
            for x in self.blocks:
                self.screen.blit(x[0],x[1])
            txts = pg.font.SysFont('Courier New',50).render('Game Over    Score:',True,(255,255,255))
            txtrect = txts.get_rect()
            txtrect.topleft =(20,150)
            self.screen.blit(txts,txtrect)
            txts = pg.font.SysFont('Courier New',50).render(str(self.snake.score),True,(255,255,255))
            txtrect = txts.get_rect()
            txtrect.topleft =(600,150)
            self.screen.blit(txts,txtrect)
            pg.display.update()
            self.make_button((153,300,100,50),'Restart', [(255,255,255),(150,150,150)], action = lambda:restart())
            if self.hover ==True:
                click = pg.mouse.get_pressed()
                if click[0] == 1:
                    self.click0 = True
                if self.click0 == True:
                    if click[0] == 0:
                        self.buttonclick()
                        self.click0 = False
    def make_button(self, pos, text, color, action=None, textsize=20):
        mouse = pg.mouse.get_pos()
        oldpos = pos
        rect = pg.Rect(pos)
        pos = rect.topleft
        rect.topleft = 0,0
        rectangle = pg.Surface(rect.size,pg.SRCALPHA)
        
        circle = pg.Surface([min(rect.size)*3]*2,pg.SRCALPHA)
        pg.draw.ellipse(circle,(0,0,0),circle.get_rect(),0)
        circle  = pg.transform.smoothscale(circle,[int(min(rect.size)*0.5)]*2)
        
        radius = rectangle.blit(circle,(0,0))
        radius.bottomright = rect.bottomright
        rectangle.blit(circle,radius)
        radius.topright     = rect.topright
        rectangle.blit(circle,radius)
        radius.bottomleft   = rect.bottomleft
        rectangle.blit(circle,radius)
        

        rectangle.fill((0,0,0),rect.inflate(-radius.w,0))
        rectangle.fill((0,0,0),rect.inflate(0,-radius.h))
        pos = oldpos
        if (pos[0]+pos[2]) > mouse[0] > pos[0] and (pos[1]+pos[3]) > mouse[1] > pos[1]:
            self.hover = True
            self.buttonclick = action
            color = pg.Color(*color[1])
            alpha = color.a
            color.a = 0
        else:
            color = pg.Color(*color[0])
            alpha = color.a
            color.a = 0
            self.hover = False
        rectangle.fill(color,special_flags=pg.BLEND_RGBA_MAX)
        rectangle.fill((255,255,255, alpha),special_flags=pg.BLEND_RGBA_MIN)   
        self.screen.blit(rectangle,pos)
        txts = pg.font.SysFont('Courier New',textsize).render(text,True,(0,0,0))
        txtrect = txts.get_rect()
        txtrect.center =(pos[0]+pos[2]/2), (pos[1]+pos[3]/2)
        self.screen.blit(txts,txtrect)
    def reset(self):
        self.left,self.right,self.up,self.down = False,False,False,False
    def loop(self):
        self.game_over = False
        while self.game_over != True:
            self.screen.fill((35,38,117))
            self.snake.update()
            for x in self.blocks:
                if self.snake.check_collisions(x[1]) == True:
                    self.over()
                self.screen.blit(x[0],x[1])
            a=0
            for x in self.snake.images:
                if a !=0:
                    if self.snake.check_apple(x[1]) == True:
                        self.over()
                self.screen.blit(x[0],x[1])
                a+=1
            if self.snake.check_apple(self.apple.pos) == True:
                self.snake.add_apple()
                del self.apple
                self.apple = apple(self.size)
            self.screen.blit(self.apple.image,self.apple.pos)
            self.screen.blit(self.snake.image,self.snake.pos)
            for event in pg.event.get():
                if event.type == pg.QUIT:
                    sys.exit()
                elif event.type == pg.KEYDOWN:
                    if event.key == pg.K_RIGHT:
                        if self.left == False:
                            self.reset()
                            self.snake.right()
                            self.right = True
                    if event.key == pg.K_LEFT:
                        if self.right == False:
                            self.reset()
                            self.snake.left()
                            self.left = True
                    if event.key == pg.K_UP:
                        if self.down == False:
                            self.reset()
                            self.snake.up()
                            self.up = True
                    if event.key == pg.K_DOWN:
                        if self.up == False:
                            self.reset()
                            self.snake.down()
                            self.down = True
            pg.display.update()
class startmenu():
    def __init__(self):
        self.screen = pg.display.set_mode((800,450))
        self.b1 = '(150, 300,100,50),"Mulai", [(0,255,0), (0,150,0)], action = self.start'
        self.b2 = '(550, 300,100,50),"Keluar", [(255,0,0), (150,0,0)], action = self.exit'
        self.buttons = [self.b1, self.b2]
        self.blocks = []
        self.size = 1
        self.click0, self.loads = False, False
        color = (0,0,0)
        for x in range(0,800,10):
            t=pg.Surface((10,10))
            t.fill(color)
            self.blocks.append([t, [x,0]])
        for x in range(0,800,10):
            t=pg.Surface((10,10))
            t.fill(color)
            self.blocks.append([t, [x,440]])
        for x in range(0,450,10):
            t=pg.Surface((10,10))
            t.fill(color)
            self.blocks.append([t, [0,x]])
        for x in range(0,450,10):
            t=pg.Surface((10,10))
            t.fill(color)
            self.blocks.append([t, [790,x]])
    def make_text(self, x, y, text, size=20, color = (0,0,0), a = False):
        txts = pg.font.SysFont('Courier New', size).render(text, True, color)
        txtrect = txts.get_rect()
        txtrect.topleft = (x,y)
        if a == True:
            txtrect.center = (x,y)
        self.screen.blit(txts, txtrect)
    def make_button(self, pos, text, color, action=None, textsize=20):
        mouse = pg.mouse.get_pos()
        oldpos = pos
        rect = pg.Rect(pos)
        pos = rect.topleft
        rect.topleft = 0,0
        rectangle = pg.Surface(rect.size,pg.SRCALPHA)
        
        circle = pg.Surface([min(rect.size)*3]*2,pg.SRCALPHA)
        pg.draw.ellipse(circle,(0,0,0),circle.get_rect(),0)
        circle  = pg.transform.smoothscale(circle,[int(min(rect.size)*0.5)]*2)
        
        radius = rectangle.blit(circle,(0,0))
        radius.bottomright = rect.bottomright
        rectangle.blit(circle,radius)
        radius.topright     = rect.topright
        rectangle.blit(circle,radius)
        radius.bottomleft   = rect.bottomleft
        rectangle.blit(circle,radius)
        

        rectangle.fill((0,0,0),rect.inflate(-radius.w,0))
        rectangle.fill((0,0,0),rect.inflate(0,-radius.h))
        pos = oldpos
        if (pos[0]+pos[2]) > mouse[0] > pos[0] and (pos[1]+pos[3]) > mouse[1] > pos[1]:
            self.hover = True
            self.buttonclick = action
            color = pg.Color(*color[1])
            alpha = color.a
            color.a = 0
        else:
            color = pg.Color(*color[0])
            alpha = color.a
            color.a = 0
            self.hover = False
        rectangle.fill(color,special_flags=pg.BLEND_RGBA_MAX)
        rectangle.fill((255,255,255, alpha),special_flags=pg.BLEND_RGBA_MIN)   
        self.screen.blit(rectangle,pos)
        self.make_text((pos[0]+pos[2]/2), (pos[1]+pos[3]/2), text, a = True, size=textsize)
    def mainloop(self):
        while 1:
            self.screen.fill((35,38,117))
            self.make_text(400, 150, 'GAME SNAKE', color = (255,255,255), size = 80, a = True)
            for event in pg.event.get():
                if event.type == pg.QUIT:
                    sys.exit()
            for x in self.blocks:
                self.screen.blit(x[0],x[1])
            for x in self.buttons:
                exec('self.make_button(' + x + ')')
                if self.hover ==True:
                    click = pg.mouse.get_pressed()
                    if click[0] == 1:
                        self.click0 = True
                    if self.click0 == True:
                        if click[0] == 0:
                            self.buttonclick()
                            self.click0 = False
            pg.display.update()
    def start(self):
        self.b1 = '(150, 300,100,50),"Normal", [(0,255,0), (0,150,0)], action = self.start3'
        self.b2 = '(550, 300,100,50),"Besar", [(0,255,0), (0,150,0)], action = self.start4'
        self.buttons = [self.b1,self.b2]
    def start3(self):
        self.b1 = '(150, 300,100,50),"Easy", [(0,255,0), (0,150,0)], action = self.e'
        self.b2 = '(283, 300,100,50),"Normal", [(0,255,0), (0,150,0)], self.n'
        self.b3 = '(417, 300,100,50),"Hard", [(0,255,0), (0,150,0)], action = self.h'
        self.b4 = '(550, 300,100,50),"Expert", [(0,255,0), (0,150,0)], action = self.ex'
        self.buttons = [self.b1, self.b2,self.b3,self.b4]
    def start4(self):
        self.size = 2
        self.b1 = '(150, 300,100,50),"Easy", [(0,255,0), (0,150,0)], action = self.e'
        self.b2 = '(283, 300,100,50),"Normal", [(0,255,0), (0,150,0)], self.n'
        self.b3 = '(417, 300,100,50),"Hard", [(0,255,0), (0,150,0)], action = self.h'
        self.b4 = '(550, 300,100,50),"Expert", [(0,255,0), (0,150,0)], action = self.ex'
        self.buttons = [self.b1, self.b2,self.b3,self.b4]
    def e(self):
        start(0.25, self.size)
    def n(self):
        start(0.5, self.size)
    def h(self):
        start(1, self.size)
    def ex(self):
        start(2, self.size)
    def exit(self):
        sys.exit()
def start(speed,size):
    global g,m
    del m
    
    g=game(speed,size)
    g.loop()
def restart():
    global g
    del g
    menu()
def menu():
    global m
    pg.init()
    m = startmenu()
    m.mainloop()
menu()


Jalankan program Snake.py tersebut dan akan tampil program nya seperti gambar : 


Jika ada yang error, silahkan bertanya di kolom komentar. Sampai ketemu di tutorial selanjutnya..Assalamu'alaikum













Comments

Popular posts from this blog

Cara remote komputer dengan UltraViewer

Ultra Viewer adalah software buatan DucFabulous yang digunakan untuk remote atau mengendalikan komputer dari jarak jauh. Manfaat dari remote komputer dari jarak jauh yaitu salah satunya untuk pekerjaan yang bisa di lakukan dari rumah dan banyak manfaat lainnya dengan modal komputer dan koneksi internet. Ada banyak software untuk remote komputer, tapi kali ini kita akan mengulas software UltraViewer. Berikut cara remote komputer dengan UltraViewer. 1. Install Aplikasi UltraViewer di Semua Komputer Langkah pertama tentunya kita harus mendownload aplikasi UltraViewer terlebih dahulu. Silahkan download di link berikut :   Setelah selesai di download, install aplikasi UltraViewer nya di komputer sobat dan komputer yang akan di remote, lalu jalankan aplikasi di dua komputer tersebut. 2. Tampilan awal dan Setting Gambar diatas adalah tampilan awal dari aplikasi UltraViewer. Saat di tampilan itu, komputer kita secara otomatis memiliki ID...

Salahuddin Al-Ayyubi : Tokoh islam penakluk Kota Yerusalem dan Masjidil Aqsa

Yusuf bin Najmuddin al-Ayyubi adalah nama dari  Salahuddin Ayyubi. Lahir tahun 1138 Masehi di wilayah Tikrit, Irak   Ia lebih dikenal dengan nama julukannya yaitu,  Salahuddin Ayyubi / Saladin / Salah ad-Din . Salahuddin terkenal di dunia Muslim dan  Kristen  karena kepemimpinan, kekuatan militer, dan sifatnya yang  ksatria  dan pengampun pada saat ia berperang melawan  tentara salib . Sultan Salahuddin Al Ayyubi juga adalah seorang ulama. Ia memberikan catatan kaki dan berbagai macam penjelasan dalam kitab  hadits   Abu Dawud . Asal dan Perjalanan Hidup Meskipun ia mencintai perdamaian, Salahuddin Ayyubi menjadi salah satu pejuang terhebat di dunia. Ia dilahirkan di Tekrit pada tahun 1138 M ketika ayahnya Ameer Najmudin adalah penguasa Tekrit. Dia dibesarkan oleh ayahnya yang mulia dan pamannya yang berbakat, Asad-ud-din Shirkhu. Salahuddin adalah orang yang sangat cerdas dan mulia. Dia mencintai perdamaian dan tidak pern...

Terkena Azab Kubur karena air kencing

Islam adalah agama yang mempunyai tata cara dan aturan baik dalam aturan dan tata cara beribadah maupun aturan dalam kehidupan sehari-hari. Dalam aktivitas sehari-hari, islam mempunyai tata cara dan aturan seperti halnya dalam bersuci dari hadast kecil dan hadast besar. Dalam beberapa hadist Nabi di jelaskan tata cara bersuci dari hadast kecil seperti tata cara bersuci setelah buang air kecil dan buang air besar. Di balik anjuran tersebut, terdapat ancaman yang begitu menakutkan hanya karena salah dalam tata cara bersuci. Berikut hadist tentang adab dan tata cara serta ancaman dalam bersuci : Adab dan Tata cara Bersuci Ada seseorang yang berkata kepada Salman  radhiyallahu ‘anhu : “Apakah Nabi kalian  shallallahu ‘alaihi wa sallam  mengajarkan segala sesuatu sampai masalah buang air?” Ia menjawab: أَجَلْ لَقَدْ نَهَانَا أَنْ نَسْتَقْبِلَ الْقِبْلَةَ لِغَائِطٍ أَوْ بَوْلٍ أَوْ أَنْ نَسْتَنْجِىَ بِالْيَمِينِ أَوْ أَنْ نَسْتَنْجِىَ بِأَقَلَّ مِنْ ثَلاَثَةِ ...