Menu
CoddyTech

Bir Sıfırlama Fonksiyonu

Coddy'nin Pygame Journey'sinin Oyun Kuralları bölümünün bir parçası. Ders 4 / 29.

Bir oyun oyna, birkaç puan kazan, kaybet ve R'ye bas. Yeni oyun, eski puanla başlar. Oyunun değiştirdiği her değer başlangıç değerine dönmelidir ve çoğu zaman bunlardan biri unutulur.

Tüm başlangıç değerlerini tek bir fonksiyona koy ve bu fonksiyonu hem ilk oyundan önce hem de R'ye basıldığında çağır:

def reset():
    global player, rock, score
    player = pygame.Rect(220, 300, 40, 40)
    rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
    score = 0


reset()

global satırı önemlidir. Aksini belirtmediğin sürece, bir fonksiyon içinde atama yaptığın değişken o fonksiyona aittir. global olmadan, score = 0 fonksiyon sona erdiğinde kaybolacak yeni bir yerel score oluşturur ve oyunun puanı değişmez.

Artık bir oyunun başlangıcı yalnızca bir kez yazılır. Daha sonra can gibi yeni bir değer eklediğinde, onu tek bir yere eklersin ve hem ilk oyun hem de sonraki tüm oyunlar bu değeri alır.

challenge icon

Görev

Orta
  1. global player, rock, score ilk satırı olacak şekilde player, rock ve score değişkenlerini başlangıç değerlerine ayarlayan reset() işlevini yaz.
  2. Döngüden önce, bu değişkenleri ayarlayan üç satırın yerine bir kez reset() çağır.
  3. R tuşuna basıldığında reset() çağır ve durumu "play" olarak ayarla.

Kendin dene

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Meteor Dodge")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

player = pygame.Rect(220, 300, 40, 40)
rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
score = 0
state = "menu"

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_RETURN and state == "menu":
                state = "play"
            if event.key == pygame.K_r and state == "over":
                player.x = 220
                rock.y = -24
                rock.x = random.randint(0, 456)
                state = "play"

    if state == "play":
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            player.x -= 6
        if keys[pygame.K_RIGHT]:
            player.x += 6
        player.clamp_ip(screen.get_rect())

        rock.y += 4
        if rock.top > 360:
            rock.y = -24
            rock.x = random.randint(0, 456)
            score += 1
        if rock.colliderect(player):
            state = "over"

    screen.fill((30, 30, 46))
    if state == "menu":
        title = font.render("Meteor Dodge", True, (240, 240, 240))
        screen.blit(title, title.get_rect(center=(240, 140)))
        hint = font.render("Press Enter to play", True, (240, 240, 240))
        screen.blit(hint, hint.get_rect(center=(240, 200)))
    else:
        pygame.draw.rect(screen, (255, 196, 0), player)
        pygame.draw.rect(screen, (235, 80, 80), rock)
        score_text = font.render(f"Score: {score}", True, (240, 240, 240))
        screen.blit(score_text, (10, 10))
        if state == "over":
            message = font.render("Game over", True, (240, 240, 240))
            screen.blit(message, message.get_rect(center=(240, 160)))
            hint = font.render("Press R to play again", True, (240, 240, 240))
            screen.blit(hint, hint.get_rect(center=(240, 200)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Oyun Kuralları bölümündeki tüm dersler

Kendi başına pratik yap: Pygame playground