Membuat Game Snake Canggih Dengan Python Dan Pygame
Let's linked LinkedIn


Halo para pembaca! Hari ini kita akan membahas cara membuat game Snake yang lebih canggih menggunakan Python dan library Pygame. Game ini bukan hanya versi dasar dari Snake, tetapi memiliki beberapa fitur tambahan yang membuatnya lebih menarik dan menantang.

Fitur-fitur Game

Game Snake yang kita buat memiliki beberapat fitur menarik, di antaranya:

  1. Layar judul (title screen)
  2. Layar game over dengan tampilan skor dan opsi untuk memulai ulang
  3. Rintangan yang harus dihindari oleh ular
  4. Power-up dengan efek berbeda (mempercepat, memperlambat, mengecilkan ular)
  5. Tampilan skor selama permainan
  6. Peningkatan kesulitan (kecepatan meningkat seiring pertumbuhan ular)
  7. Ular bisa melewati tepi layar dan muncul di sisi yang berlawanan

Penjelasan Kode

Mari kita bahas bagian-bagian penting dari kode game ini.

Inisialisasi dan Konstanta

import pygame
import random
import sys

pygame.init()

WIDTH, HEIGHT = 800, 600
GRID_SIZE = 20
GRID_WIDTH = WIDTH // GRID_SIZE
GRID_HEIGHT = HEIGHT // GRID_SIZE

# Definisi warna
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Sophisticated Snake")

font = pygame.font.Font(None, 36)

Bagian ini menginisialisasi Pygame dan mendefinisikan konstanta-konstanta yang akan digunakan dalam game, seperti ukuran layar, ukuran grid, dan warna-warna yang akan digunakan.

Kelas Snake

class Snake:
    def __init__(self):
        self.body = [(GRID_WIDTH // 2, GRID_HEIGHT // 2)]
        self.direction = random.choice(["UP", "DOWN", "LEFT", "RIGHT"])
        self.grow = False

    def move(self):
        # Logika pergerakan ular

    def draw(self):
        # Menggambar ular di layar

Kelas Snake mengatur logika pergerakan dan penggambaran ular. Metode move() menangani pergerakan ular berdasarkan arahnya, sementara draw() menggambar ular di layar.

Kelas Food, Obstacle, dan PowerUp

class Food:
    # Kode untuk makanan ular

class Obstacle:
    # Kode untuk rintangan

class PowerUp:
    # Kode untuk power-up

Kelas-kelas ini mengatur logika untuk elemen-elemen tambahan dalam game, seperti makanan yang harus dimakan ular, rintangan yang harus dihindari, dan power-up yang memberikan efek khusus.

Fungsi-fungsi Utama

def show_title_screen():
    # Menampilkan layar judul

def game_over(score):
    # Menampilkan layar game over

def main():
    # Logika utama permainan

Fungsi-fungsi ini mengatur alur utama permainan, termasuk menampilkan layar judul, menangani game over, dan menjalankan loop utama permainan.

Cara Menjalankan Game

Untuk menjalankan game ini, Anda perlu menginstal Pygame terlebih dahulu:

pip install pygame

Kemudian, simpan kode dalam file (misalnya sophisticated_snake.py) dan jalankan dengan Python:

python sophisticated_snake.py

Kesimpulan

Dengan menambahkan fitur-fitur seperti rintangan, power-up, dan peningkatan kesulitan, kita telah membuat versi Snake yang jauh lebih menarik dan menantang dibandingkan versi dasarnya. Game ini bisa menjadi proyek yang bagus untuk belajar pemrograman game dengan Python dan Pygame.

Semoga artikel ini bermanfaat bagi Anda yang ingin belajar membuat game atau mengembangkan skill pemrograman Python. Selamat mencoba dan jangan lupa untuk bereksperimen dengan kode ini untuk membuat versi Snake Anda sendiri yang unik!


Demikianlah penjelasan tentang game Snake yang sophisticated ini. Apakah Anda tertarik untuk mencobanya atau mungkin mengembangkannya lebih lanjut? Jangan ragu untuk berbagi hasil kreasi Anda di kolom komentar!

Berikut adalah kode lengkap dari aplikasi game ini.


import pygame
import random
import sys

# Initialize Pygame
pygame.init()

# Constants
WIDTH, HEIGHT = 800, 600
GRID_SIZE = 20
GRID_WIDTH = WIDTH // GRID_SIZE
GRID_HEIGHT = HEIGHT // GRID_SIZE

# Colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

# Create the screen
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Sophisticated Snake")

# Font
font = pygame.font.Font(None, 36)

class Snake:
    def __init__(self):
        self.body = [(GRID_WIDTH // 2, GRID_HEIGHT // 2)]
        self.direction = random.choice(["UP", "DOWN", "LEFT", "RIGHT"])
        self.grow = False

    def move(self):
        head = self.body[0]
        if self.direction == "UP":
            new_head = (head[0], (head[1] - 1) % GRID_HEIGHT)
        elif self.direction == "DOWN":
            new_head = (head[0], (head[1] + 1) % GRID_HEIGHT)
        elif self.direction == "LEFT":
            new_head = ((head[0] - 1) % GRID_WIDTH, head[1])
        elif self.direction == "RIGHT":
            new_head = ((head[0] + 1) % GRID_WIDTH, head[1])
        
        self.body.insert(0, new_head)
        if not self.grow:
            self.body.pop()
        else:
            self.grow = False

    def draw(self):
        for segment in self.body:
            pygame.draw.rect(screen, GREEN, (segment[0] * GRID_SIZE, segment[1] * GRID_SIZE, GRID_SIZE, GRID_SIZE))

class Food:
    def __init__(self):
        self.position = self.random_position()

    def random_position(self):
        return (random.randint(0, GRID_WIDTH - 1), random.randint(0, GRID_HEIGHT - 1))

    def draw(self):
        pygame.draw.rect(screen, RED, (self.position[0] * GRID_SIZE, self.position[1] * GRID_SIZE, GRID_SIZE, GRID_SIZE))

class Obstacle:
    def __init__(self):
        self.positions = [self.random_position() for _ in range(5)]

    def random_position(self):
        return (random.randint(0, GRID_WIDTH - 1), random.randint(0, GRID_HEIGHT - 1))

    def draw(self):
        for position in self.positions:
            pygame.draw.rect(screen, BLUE, (position[0] * GRID_SIZE, position[1] * GRID_SIZE, GRID_SIZE, GRID_SIZE))

class PowerUp:
    def __init__(self):
        self.position = self.random_position()
        self.type = random.choice(["SPEED", "SLOW", "SHRINK"])
        self.active = False
        self.duration = 0

    def random_position(self):
        return (random.randint(0, GRID_WIDTH - 1), random.randint(0, GRID_HEIGHT - 1))

    def draw(self):
        if not self.active:
            pygame.draw.rect(screen, WHITE, (self.position[0] * GRID_SIZE, self.position[1] * GRID_SIZE, GRID_SIZE, GRID_SIZE))

def show_title_screen():
    screen.fill(BLACK)
    title = font.render("Sophisticated Snake", True, WHITE)
    start = font.render("Press SPACE to start", True, WHITE)
    screen.blit(title, (WIDTH // 2 - title.get_width() // 2, HEIGHT // 3))
    screen.blit(start, (WIDTH // 2 - start.get_width() // 2, HEIGHT // 2))
    pygame.display.flip()

    waiting = True
    while waiting:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
                waiting = False

def game_over(score):
    screen.fill(BLACK)
    game_over_text = font.render("Game Over", True, WHITE)
    score_text = font.render(f"Score: {score}", True, WHITE)
    restart = font.render("Press SPACE to restart", True, WHITE)
    screen.blit(game_over_text, (WIDTH // 2 - game_over_text.get_width() // 2, HEIGHT // 3))
    screen.blit(score_text, (WIDTH // 2 - score_text.get_width() // 2, HEIGHT // 2))
    screen.blit(restart, (WIDTH // 2 - restart.get_width() // 2, 2 * HEIGHT // 3))
    pygame.display.flip()

    waiting = True
    while waiting:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
                waiting = False

def main():
    show_title_screen()

    snake = Snake()
    food = Food()
    obstacle = Obstacle()
    power_up = PowerUp()

    score = 0
    speed = 10
    clock = pygame.time.Clock()

    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP and snake.direction != "DOWN":
                    snake.direction = "UP"
                elif event.key == pygame.K_DOWN and snake.direction != "UP":
                    snake.direction = "DOWN"
                elif event.key == pygame.K_LEFT and snake.direction != "RIGHT":
                    snake.direction = "LEFT"
                elif event.key == pygame.K_RIGHT and snake.direction != "LEFT":
                    snake.direction = "RIGHT"

        snake.move()

        # Check for collisions
        if snake.body[0] == food.position:
            snake.grow = True
            food = Food()
            score += 1

        if snake.body[0] in snake.body[1:] or snake.body[0] in obstacle.positions:
            game_over(score)
            return

        if snake.body[0] == power_up.position:
            power_up.active = True
            power_up.duration = 50
            if power_up.type == "SPEED":
                speed = 15
            elif power_up.type == "SLOW":
                speed = 5
            elif power_up.type == "SHRINK":
                if len(snake.body) > 1:
                    snake.body.pop()

        if power_up.active:
            power_up.duration -= 1
            if power_up.duration <= 0:
                power_up.active = False
                speed = 10
                power_up = PowerUp()

        # Draw everything
        screen.fill(BLACK)
        snake.draw()
        food.draw()
        obstacle.draw()
        power_up.draw()

        # Draw score
        score_text = font.render(f"Score: {score}", True, WHITE)
        screen.blit(score_text, (10, 10))

        pygame.display.flip()
        clock.tick(speed)

    pygame.quit()

if __name__ == "__main__":
    main()