برمجة بايثون 2026 — جامعة هلسنكي › الجزء 13: الألعاب مع Pygame 13 / 15 السابق التالي

مكتبة pygame

أهداف التعلّم

بعد هذا القسم

  • تكون قد ثبّتَت مكتبة pygame على حاسوبك
  • ستعرف كيفية إنشاء نافذة pygame وكيفية الخروج من البرنامج
  • ستتمكّن من استخدام صورة محفوظة في ملف داخل نافذة pygame

في هذين القسمين الأخيرين من مادة المقرر سنتقن مكتبة pygame. إنها مكتبة (library) بايثون مخصّصة لبرمجة الألعاب، وتساعدك على إنشاء العناصر الرسومية، وعلى التعامل مع الأحداث (events) القادمة من لوحة المفاتيح والفأرة، وعلى تنفيذ مواصفات أخرى يلزم توفرها في الألعاب.

تثبيت pygame

لينكس

افتح سطر الأوامر، واكتب pip3 install pygame ثم اضغط enter.

pygame_linux.png

ينبغي أن يُثبِّت هذا المكتبة على حاسوبك.

ويندوز

افتح طرفية ويندوز عن طريق القائمة، واكتب cmd ثم اضغط enter:

13_1_1.png

ينبغي أن تُفتح نافذة مفسّر سطر الأوامر. اكتب pip3 install pygame ثم اضغط enter.

ينبغي أن يُثبِّت هذا المكتبة على حاسوبك.

قد يتطلّب التثبيت صلاحيات مسؤول النظام. فإذا لم ينجح ما سبق، يمكنك محاولة تشغيل تطبيق الطرفية كمسؤول: افتح قائمة ويندوز، وابحث عن تطبيق CMD، وانقر عليه بزر الفأرة الأيمن ثم اختر «Run as administrator».

يتطلّب تثبيت pygame والوصول إليها أن يكون تثبيت Python مضبوطًا في متغيّر المسار (path) وفق التعليمات هنا.

ماك

افتح Terminal، فمثلًا عبر رمز العدسة المكبّرة في الزاوية العليا اليمنى:

13-1-2.png

ينبغي أن تُفتح أداة البحث. اكتب terminal ثم اضغط enter:

13-1-3.png

اكتب ما يلي ثم اضغط enter:

pip3 install pygame

13-1-4.png

ينبغي أن يُثبِّت هذا المكتبة على حاسوبك.

برنامجك الأول

إليك برنامج بسيط للتحقّق من أن تثبيت pygame يعمل بصورة صحيحة:

import pygame

pygame.init()
window = pygame.display.set_mode((640, 480))

window.fill((0,0,0))
pygame.display.flip()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()

عند تشغيل هذا البرنامج ينبغي أن يعرض نافذة:

pygame_first.gif

لا يتكوّن البرنامج إلا من عرض نافذة، وهو يعمل حتى يُغلق المستخدم النافذة.

لنتأمّل الخطوات اللازمة لتحقيق ذلك عن قرب. يُدخل السطر الأول مكتبة pygame إلى الاستخدام: import pygame. ثم يُهيّئ الأمر التالي pygame.init وحدات pygame، ويُنشئ الأمر الذي يليها نافذةً عبر الدالة pygame.display.set_mode.

pygame.init()
window = pygame.display.set_mode((640, 480))

تأخذ الدالة set_mode أبعاد النافذة وسيطًا (argument). تشير الصف (tuple) (640, 480) إلى أن النافذة عرضها 640 بكسل وارتفاعها 480 بكسل. ويمكن استخدام اسم المتغيّر window لاحقًا للوصول إلى النافذة، فمثلًا لرسم شيء فيها.

يفعل الأمران التاليان شيئًا مماثلًا:

window.fill((0, 0, 0))
pygame.display.flip()

تملأ الطريقة fill النافذة باللون الممرور إليها كوسط. وفي هذه الحالة يكون اللون أسود، ممرورًا كقيمة RGB في الصف (0, 0, 0). ويُحدّث pygame.display.flip محتوى النافذة.

بعد أوامر التهيئة هذه يبدأ الحلقة الرئيسية للبرنامج:

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()

تتعامل الحلقة الرئيسية مع كل الأحداث التي يمرّرها نظام التشغيل إلى البرنامج. ومع كل تكرار (iteration) تُعيد الدالة pygame.event.get قائمة بالأحداث المُجمَّعة منذ التكرار السابق، إن وُجدت.

في المثال أعلاه يعالج البرنامج أحداث نوع pygame.QUIT فقط. يُرفَع هذا الحدث مثلًا عند النقر على زر الإغلاق في زاوية النافذة. وإذا رُفع حدث pygame.QUIT يخرج البرنامج عبر الدالة exit.

يمكنك أن تجرّب وترى ما يحدث إذا لم يعالج برنامجك حدث pygame.QUIT. ينبغي أن يؤدي ذلك إلى أن النقر على زر الإغلاق لا يفعل شيئًا، وهو ما قد يربك المستخدم. وبما أن البرنامج يُشغَّل من سطر الأوامر، فلا تزال قادرًا على إيقافه من سطر الأوامر باستخدام Control+C.

إضافة صورة

لنضف صورةً إلى النافذة:

import pygame

pygame.init()
window = pygame.display.set_mode((640, 480))

robot = pygame.image.load("robot.png")

window.fill((0, 0, 0))
window.blit(robot, (100, 50))
pygame.display.flip()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()

يستخدم البرنامج صورة هذا الروبوت، المحفوظة في الملف robot.png:

robot.png

يجب أن يكون الملف robot.png في الدليل نفسه الذي يقع فيه شيفرة برنامجك المصدرية، وإلا لن يتمكّن البرنامج من العثور عليه. وفي قوالب تمارين هذا القسم تنتظر الصور داخل دليل التمرين.

ينبغي أن تبدو النافذة الآن بهذا الشكل:

pygame_pic.gif

تحمّل الدالة pygame.image.load الصورة في الملف robot.png وتخزّن إحالةً إليها في المتغيّر المسمّى robot. وترسم الطريقة blit الصورة في الموقع (100, 50)، وتحدّث الدالة pygame.display.flip محتوى النافذة كما في السابق. يعني الموقع (100, 50) أن الزاوية العليا اليسرى للصورة تقع في هذا الموقع داخل النافذة.

في pygame يقع نقطة الأصل (0, 0) في الزاوية العليا اليمنى للنافذة. تزداد إحداثيات x إلى اليمين، وتزداد إحداثيات y إلى الأسفل، بحيث يكون للزاوية العليا اليسرى للنافذة الإحداثيان (640, 480). وهذا خلاف لما اعتُاد عليه في تعامل الرياضيات مثلًا مع الإحداثيات، لكنه شائع جدًا في سياق البرمجة، ويستحقّ أن تعتاد عليه.

بمجرّد تحميلك صورةً يمكنك استخدامها مرّات عديدة داخل النافذة نفسها. ترسم الشيفرة التالية صورة الروبوت في ثلاثة مواقع مختلفة:

window.blit(robot, (0, 0))
window.blit(robot, (300, 0))
window.blit(robot, (100, 200))

ينبغي أن تبدو النافذة بهذا الشكل نتيجةً لذلك:

pygame_pic2.gif

هنا نضبط موقع الصورة بحيث تقع في وسط النافذة:

width = robot.get_width()
height = robot.get_height()
window.blit(robot, (320-width/2, 240-height/2))

ينبغي أن تبدو النافذة الآن بهذا الشكل:

pygame_pic3.gif

تُعيد الطريقة get_width عرض الصورة، وتُعيد الطريقة get_height ارتفاعها، وكلاهما بالبكسل. يقع وسط النافذة عند نصف عرضها وارتفاعها، أي عند (320, 240)، ويمكننا استخدام ذلك لحساب موقع مناسب للزاوية العليا اليسرى للصورة بحيث تقع تمامًا في المنتصف.

تمارين pygame

لا تختبر تمارين هذا القسم من المقرر اختبارات آلية، إذ تُتحقَّق نتائجها بصريًا. تمنح الاختبارات النقاط تلقائيًا عند تقديم حلّك إلى الخادم، مهما كانت طريقة تنفيذك. لا تقدّم حلّك إلا عندما تكون جاهزًا وأن يكون مطابقًا لوصف التمرين. ورغم أن التمارين قد تفتقر إلى الاختبارات الآلية، فإن فريق المقرر يرى حلّك على أي حال. كذلك يمنح تقديم حلّ ناقص إلى TMC Paste نقاطًا تلقائيًا، ولذلك لا ينبغي استخدامه عند طلب المساعدة حول تمارين هذا القسم. يمكنك استخدام Pastebin.com أو أي خدمة لصق (pastebin) أخرى على الإنترنت عند طلب المساعدة في قنوات دعم المقرر.

إذا لم يكن حلّك مطابقًا لوصف التمرين بوضوح، فقد تخسر النقاط الممنوحة لتمارين هذا القسم.

تمرين برمجي: أربعة روبوتات

اكتب برنامجًا يرسم روبوتًا في كل زوايا النافذة الأربع. ينبغي أن تبدو النتيجة النهائية بهذا الشكل:

pygame_four.gif

تمرين برمجي: روبوتات في صف

اكتب برنامجًا يرسم عشرة روبوتات في صفّ واحد. ينبغي أن تبدو النتيجة النهائية بهذا الشكل:

pygame_row.gif

تمرين برمجي: مئة روبوت

اكتب برنامجًا يرسم مئة روبوت: عشرة صفوف في كل صفّ منها عشرة روبوتات. ينبغي أن تبدو النتيجة النهائية بهذا الشكل:

pygame_hundred.gif

تمرين برمجي: روبوتات عشوائية

اكتب برنامجًا يرسم ألف روبوت في مواقع عشوائية. ينبغي أن تبدو النتيجة النهائية بهذا الشكل:

pygame_thousand.gif