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:
- Layar judul (title screen)
- Layar game over dengan tampilan skor dan opsi untuk memulai ulang
- Rintangan yang harus dihindari oleh ular
- Power-up dengan efek berbeda (mempercepat, memperlambat, mengecilkan ular)
- Tampilan skor selama permainan
- Peningkatan kesulitan (kecepatan meningkat seiring pertumbuhan ular)
- 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()