Menu
CoddyTech

دالة لإعادة الضبط

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

العب لعبة، واكسب بعض النقاط، ثم اخسر واضغط على R. تبدأ اللعبة الجديدة بالنقاط القديمة. يجب إعادة كل قيمة تغيّرها اللعبة إلى قيمتها الأولية، وغالبًا ما يُنسى أحدها.

ضع كل القيم الأولية في دالة واحدة واستدعها قبل اللعبة الأولى وعند الضغط على 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 مهم. المتغير الذي تسند إليه قيمة داخل دالة يتبع تلك الدالة ما لم تحدد خلاف ذلك. من دون global، سينشئ score = 0 متغيرًا محليًا جديدًا باسم score يختفي عند انتهاء الدالة، ولن تتغير نقاط اللعبة.

الآن، يُكتب بدء اللعبة مرة واحدة. عندما تضيف قيمة لاحقًا، مثل عدد الأرواح، تضيفها في موضع واحد، فتُضاف إلى اللعبة الأولى وكل لعبة جديدة.

challenge icon

التحدي

متوسط
  1. اكتب reset() لضبط player وrock وscore على قيم البداية، واجعل global player, rock, score السطر الأول فيها.
  2. استدعِ reset() مرة واحدة قبل الحلقة، بدلًا من الأسطر الثلاثة التي تضبطها.
  3. عند الضغط على R، استدعِ reset() واضبط الحالة على "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 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 iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

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

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