Bu makalede, Python programlama dilini kullanarak geliştirilen bir yılan oyununun kodlarını inceleyeceğiz. Oyun, Pygame kütüphanesini kullanarak geliştirilmiştir ve kullanıcıların farklı zorluk seviyelerinde oynayabilmesine olanak tanır.
Oyunun Ana Bileşenleri
Oyunun ana bileşenleri arasında giriş menüsü, zorluk seçimi, oyun döngüsü ve skor sistemi bulunur. Giriş menüsü, kullanıcıların oyunu başlatmak, zorluk seviyesini seçmek veya oyunu terk etmek için seçenekler sunar. Zorluk seçimi, kullanıcıların “Kolay”, “Orta” veya “Zor” seviyelerinden birini seçmesine olanak tanır.
Oyun Döngüsü
Oyun döngüsü, oyunun ana bileşenidir. Bu döngüde, yılanın hareketi, engellerin yerleştirilmesi, skorun güncellenmesi ve oyunun sonlandırılması gibi işlemler gerçekleştirilir. Yılanın hareketi, kullanıcıların klavye girişlerine göre belirlenir ve engellerle çarpışması durumunda oyun sonlandırılır.
Skor Sistemi
Skor sistemi, kullanıcıların skorlarını güncellemek ve yüksek skorları kaydetmek için kullanılır. Skorlar, bir dosyaya kaydedilir ve oyunun her başlatılışında okunur.
Kod Analizi
Kodlar, Pygame kütüphanesini kullanarak geliştirilmiştir. Oyunun ana bileşenleri, fonksiyonlar olarak tanımlanmıştır ve bu fonksiyonlar, oyunun farklı aşamalarında çağrılır. Kodlar, temiz ve düzenli bir şekilde yazılmıştır ve yorumlar eklenmiştir.
Dikkat
Bu kodlar eğitim amaçlı yazılmıştır. Sürekli güncelleme almaktadır.
import pygame
import random
import time
import os
# Pygame'i başlat
pygame.init()
# Ekran boyutları ve renkler
WIDTH, HEIGHT = 800, 600
WHITE = (255, 255, 255)
RED = (213, 50, 80)
GREEN = (0, 255, 0)
BLUE = (50, 153, 213)
BLACK = (0, 0, 0)
YELLOW = (255, 255, 102)
# Yılan ve engel ayarları
SNAKE_BLOCK = 10
snake_speed = {"Kolay": 10, "Orta": 15, "Zor": 20}
# Pygame ekranı
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Osman Bayrak's Snake Game")
# Yazı tipleri
font_style = pygame.font.SysFont("bahnschrift", 25)
menu_font = pygame.font.SysFont("comicsansms", 35)
# Skor ve Yüksek Skor
high_score_file = "high_score.txt"
# Skoru dosyadan oku
def read_high_score():
if os.path.exists(high_score_file):
with open(high_score_file, "r") as file:
return int(file.read())
return 0
# Skoru dosyaya yaz
def write_high_score(score):
with open(high_score_file, "w") as file:
file.write(str(score))
# Mesaj yazma fonksiyonu
def message(msg, color, y_offset=0):
mesg = font_style.render(msg, True, color)
screen.blit(mesg, [WIDTH / 6, HEIGHT / 3 + y_offset])
# Giriş menüsü
def game_menu():
menu_running = True
while menu_running:
screen.fill(BLACK)
message("Osman Bayrak's Snake Game", YELLOW, -100)
message("1. Oyun Başlat", WHITE, 0)
message("2. Zorluk Seç", WHITE, 40)
message("3. Çıkış", WHITE, 80)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_1:
return "Orta" # Varsayılan zorluk "Orta"
elif event.key == pygame.K_2:
return select_difficulty()
elif event.key == pygame.K_3:
pygame.quit()
quit()
if event.type == pygame.QUIT:
pygame.quit()
quit()
# Zorluk seçme menüsü
def select_difficulty():
selecting = True
while selecting:
screen.fill(BLACK)
message("Zorluk Seçimi", YELLOW, -100)
message("1. Kolay", GREEN, 0)
message("2. Orta", WHITE, 40)
message("3. Zor", RED, 80)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_1:
return "Kolay"
elif event.key == pygame.K_2:
return "Orta"
elif event.key == pygame.K_3:
return "Zor"
if event.type == pygame.QUIT:
pygame.quit()
quit()
# Oyun fonksiyonu
def game_loop(difficulty):
game_over = False
game_close = False
x1 = WIDTH / 2
y1 = HEIGHT / 2
x1_change = 0
y1_change = 0
snake_list = []
length_of_snake = 1
foodx = round(random.randrange(0, WIDTH - SNAKE_BLOCK) / SNAKE_BLOCK) * SNAKE_BLOCK
foody = round(random.randrange(0, HEIGHT - SNAKE_BLOCK) / SNAKE_BLOCK) * SNAKE_BLOCK
obstacles = []
if difficulty != "Kolay":
for _ in range(10 if difficulty == "Orta" else 20):
obx = round(random.randrange(0, WIDTH - SNAKE_BLOCK) / SNAKE_BLOCK) * SNAKE_BLOCK
oby = round(random.randrange(0, HEIGHT - SNAKE_BLOCK) / SNAKE_BLOCK) * SNAKE_BLOCK
obstacles.append((obx, oby))
clock = pygame.time.Clock()
score = 0
high_score = read_high_score()
while not game_over:
while game_close:
screen.fill(BLACK)
message("OYUN SONU", YELLOW, -100)
message(f"Skorunuz: {score}", WHITE, 0)
message(f"Yüksek Skor: {high_score}", GREEN, 40)
message("Tekrar oynamak için 'R' tuşuna bas", WHITE, 80)
message("Çıkmak için 'Q' tuşuna bas", RED, 120)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
game_over = True
game_close = False
if event.key == pygame.K_r:
game_loop(difficulty)
if event.type == pygame.QUIT:
pygame.quit()
quit()
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x1_change = -SNAKE_BLOCK
y1_change = 0
elif event.key == pygame.K_RIGHT:
x1_change = SNAKE_BLOCK
y1_change = 0
elif event.key == pygame.K_UP:
y1_change = -SNAKE_BLOCK
x1_change = 0
elif event.key == pygame.K_DOWN:
y1_change = SNAKE_BLOCK
x1_change = 0
if x1 >= WIDTH or x1 < 0 or y1 >= HEIGHT or y1 < 0:
game_close = True
x1 += x1_change
y1 += y1_change
screen.fill(BLACK)
pygame.draw.rect(screen, RED, [foodx, foody, SNAKE_BLOCK, SNAKE_BLOCK])
for ob in obstacles:
pygame.draw.rect(screen, BLUE, [ob[0], ob[1], SNAKE_BLOCK, SNAKE_BLOCK])
snake_head = [x1, y1]
snake_list.append(snake_head)
if len(snake_list) > length_of_snake:
del snake_list[0]
for x in snake_list[:-1]:
if x == snake_head:
game_close = True
for ob in obstacles:
if x1 == ob[0] and y1 == ob[1]:
game_close = True
for block in snake_list:
pygame.draw.rect(screen, GREEN, [block[0], block[1], SNAKE_BLOCK, SNAKE_BLOCK])
pygame.display.update()
if x1 == foodx and y1 == foody:
foodx = round(random.randrange(0, WIDTH - SNAKE_BLOCK) / SNAKE_BLOCK) * SNAKE_BLOCK
foody = round(random.randrange(0, HEIGHT - SNAKE_BLOCK) / SNAKE_BLOCK) * SNAKE_BLOCK
length_of_snake += 1
score += 10
if score > high_score:
high_score = score
write_high_score(high_score)
clock.tick(snake_speed[difficulty])
pygame.quit()
# Ana oyun döngüsü
selected_difficulty = game_menu()
game_loop(selected_difficulty)