دالة لإعادة الضبط
جزء من قسم قواعد اللعبة في رحلة 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 يختفي عند انتهاء الدالة، ولن تتغير نقاط اللعبة.
الآن، يُكتب بدء اللعبة مرة واحدة. عندما تضيف قيمة لاحقًا، مثل عدد الأرواح، تضيفها في موضع واحد، فتُضاف إلى اللعبة الأولى وكل لعبة جديدة.
التحدي
متوسط- اكتب
reset()لضبطplayerوrockوscoreعلى قيم البداية، واجعلglobal player, rock, scoreالسطر الأول فيها. - استدعِ
reset()مرة واحدة قبل الحلقة، بدلًا من الأسطر الثلاثة التي تضبطها. - عند الضغط على 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()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس قواعد اللعبة
تدرّب بنفسك: Playground لـ Pygame