En Yüksek Puan ve Güvenli Yeniden Başlatma
Coddy'nin Pygame Journey'sinin Oyun Kuralları bölümünün bir parçası. Ders 30 / 30.
Oyun sonu ekranı en iyi skoru gösterir ve Boşluk tuşuna basıldığında yeni bir oyun başlatır. best, döngüden önce ve reset() dışında bir kez ayarlanır; böylece yeni oyun başladığında değerini korur.
Boşluk tuşu artık oyun sonu ekranında üçüncü bir işlev görüyor:
elif pygame.time.get_ticks() - over_time > 500:
reset()
state = "play"Boşluk tuşu zıplama tuşudur, bu yüzden oyuncu çarpışma anında çoğu zaman bu tuşa basıyor olur. Bekleme olmadan oyun, sonucu göremeden yeniden başlardı. Çarpışma zamanını over_time içinde sakla ve oyun sonu ekranında Boşluk tuşunu yalnızca 500 ms sonra kabul et.
Görev
ZorEn iyi puanı göster ve güvenli biçimde yeniden başlat.
state = "menu"sonrasındabest = 0veover_time = 0değerlerini ayarla. Bir çarpışmabest = max(best, score)değerini ayarlar veover_timedeğerini şu ana ayarlar.- Oyun bittiğinde
Game over,Best: 00120vePress Space to play againgösterilir. - Bu ekranda Space,
reset()işlevini çağırır ve çarpışmadan yalnızca 500 ms sonra oyunu başlatır.
“Oyna” düğmesine bas ve çarpış: en iyi puanın gösterilir, Space ile yeniden başlarsın. Ardından “Kontrol et” düğmesine bas.
Kendin dene
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 320))
pygame.display.set_caption("Sky Runner")
clock = pygame.time.Clock()
font = pygame.font.Font("assets/fonts/pixel.ttf", 32)
big_font = pygame.font.Font("assets/fonts/pixel.ttf", 48)
INK = (40, 50, 80)
SKY = (140, 200, 240)
GROUND = (90, 160, 80)
GROUND_Y = 260
GRAVITY = 1
SPAWN = pygame.USEREVENT + 1
POINT = pygame.USEREVENT + 2
class Runner(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.frames = [
pygame.image.load("assets/images/player.png").convert_alpha(),
pygame.image.load("assets/images/player_walk.png").convert_alpha(),
]
self.image = self.frames[0]
self.step = 0
self.rect = self.image.get_rect(midbottom=(100, GROUND_Y))
self.vy = 0
def jump(self):
if self.rect.bottom == GROUND_Y:
self.vy = -16
def update(self):
self.vy += GRAVITY
self.rect.y += self.vy
if self.rect.bottom >= GROUND_Y:
self.rect.bottom = GROUND_Y
self.vy = 0
if self.rect.bottom == GROUND_Y:
self.step += 1
self.image = self.frames[self.step // 8 % 2]
else:
self.image = self.frames[1]
class Obstacle(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = random.choice(obstacle_images)
self.rect = self.image.get_rect(midbottom=(664, GROUND_Y))
def update(self):
self.rect.x -= speed
if self.rect.right < 0:
self.kill()
obstacle_images = [
pygame.image.load("assets/images/spike_ball.png").convert_alpha(),
pygame.image.load("assets/images/blob.png").convert_alpha(),
]
def reset():
global runner, obstacles, speed, score
runner = Runner()
obstacles = pygame.sprite.Group()
speed = 6
score = 0
pygame.time.set_timer(SPAWN, 1500)
pygame.time.set_timer(POINT, 100)
def show(text, text_font, y):
picture = text_font.render(text, True, INK)
screen.blit(picture, picture.get_rect(center=(320, y)))
reset()
state = "menu"
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
if state == "play":
runner.jump()
elif state == "menu":
reset()
state = "play"
if event.type == SPAWN and state == "play":
obstacles.add(Obstacle())
pygame.time.set_timer(SPAWN, random.randint(1000, 2000))
if event.type == POINT and state == "play":
score += 1
if state == "play":
speed = min(14, 6 + score // 100)
runner.update()
obstacles.update()
if pygame.sprite.spritecollideany(runner, obstacles, pygame.sprite.collide_mask):
state = "over"
screen.fill(SKY)
pygame.draw.rect(screen, GROUND, (0, GROUND_Y, 640, 60))
screen.blit(runner.image, runner.rect)
obstacles.draw(screen)
if state == "menu":
show("Sky Runner", big_font, 110)
show("Press Space to start", font, 170)
else:
score_text = font.render(f"{score:05}", True, INK)
screen.blit(score_text, score_text.get_rect(topright=(630, 10)))
if state == "over":
message = font.render("Game over", True, (40, 50, 80))
screen.blit(message, message.get_rect(center=(320, 140)))
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
3Zamanlayıcılar ve Dalgalar
Darbe Sonrası GüvendeBir Zamanlayıcı OlayıHer 800 ms'de Bir KayaBüyüyen DalgalarBaşlamak İçin Geri Sayım6Gökyüzü Koşucusu
KoşucuZıplamaKendi başına pratik yap: Pygame playground