Menu
CoddyTech

اضغط على R للعب مجددًا

جزء من قسم قواعد اللعبة في رحلة Pygame على Coddy. الدرس 3 من 29.

عندما تنتهي اللعبة، يريد اللاعب أن يلعب مرة أخرى من دون إعادة تشغيل البرنامج. أضف سطرًا إلى شاشة انتهاء اللعبة ومفتاحًا يبدأ لعبة جديدة:

if event.key == pygame.K_r and state == "over":
    player.x = 220
    rock.y = -24
    rock.x = random.randint(0, 456)
    state = "play"

إعادة ضبط الحالة إلى "play" لا تكفي. فما زالت الصخرة تلامس اللاعب، لذا ستنتهي اللعبة مجددًا في الإطار التالي. أعد العناصر التي تحركت إلى مواضع البداية في اللعبة الجديدة.

هذا هو النمط نفسه المستخدم في القائمة: مفتاح، واختبار للحالة الحالية، وحالة جديدة.

challenge icon

التحدي

سهل
  1. على شاشة انتهاء اللعبة، اعرض Game over أسفلها Press R to play again في المنتصف عند (240, 200).
  2. عند الضغط على R وتكون الحالة "over": أعد اللاعب إلى x 220، والصخرة إلى y -24 مع قيمة x عشوائية من 0 إلى 456، واضبط الحالة على "play".

جرّب بنفسك

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 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)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

جميع دروس قواعد اللعبة

تدرّب بنفسك: Playground لـ Pygame