Mobil Menü

Python ile Basit Yılan Oyunu

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)
Osman Bayrak
Osman Bayrak

Yazılım Mühendisiyim. Teknoloji ve yazılıma meraklıyım.

Articles: 154