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.
Görev
Ortaglobal player, rock, scoreilk satırı olacak şekildeplayer,rockvescoredeğişkenlerini başlangıç değerlerine ayarlayanreset()işlevini yaz.- Döngüden önce, bu değişkenleri ayarlayan üç satırın yerine bir kez
reset()çağır. - 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()
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
1Oyun Durumları
Bir Durum DeğişkeniBir Menü EkranıYeniden Oynamak için R'ye BasınBir Sıfırlama FonksiyonuHer Durum için Bir FonksiyonKendi başına pratik yap: Pygame playground