كيفية برمجة لعبة في Python مع Pygame (بالصور)

جدول المحتويات:

كيفية برمجة لعبة في Python مع Pygame (بالصور)
كيفية برمجة لعبة في Python مع Pygame (بالصور)

فيديو: كيفية برمجة لعبة في Python مع Pygame (بالصور)

فيديو: كيفية برمجة لعبة في Python مع Pygame (بالصور)
فيديو: How to Convert a Python File to .EXE - تحويل ملف بايثون الي برنامج كامل 2024, يمكن
Anonim

هذه مقدمة إلى Pygame للأشخاص الذين يعرفون لغة Python بالفعل. ستعلمك هذه المقالة خطوات بناء لعبة بسيطة تجعل اللاعب يتفادى الكرات المرتدة.

خطوات

جزء 1 من 8: تثبيت Pygame

الخطوة 1. تحميل Pygame

ابحث عنه لمنصتك من

الخطوة 2. قم بتشغيل المثبت

الخطوة 3. تحقق من أن التثبيت يعمل

افتح محطة بايثون. اكتب "استيراد حزمة". إذا كنت لا ترى أي أخطاء ، فقد تم تثبيت Pygame بنجاح.

    استيراد pygame

جزء 2 من 8: إعداد نافذة أساسية

الخطوة 1. افتح ملفًا جديدًا

الخطوة 2. استيراد Pygame

Pygame هي مكتبة توفر الوصول إلى وظائف الرسومات. إذا كنت تريد مزيدًا من المعلومات حول كيفية عمل هذه الوظائف ، فيمكنك البحث عنها على موقع Pygame على الويب.

    استيراد pygame من pygame.locals import *

الخطوة 3. تعيين دقة النافذة

ستعمل على إنشاء متغير عام لدقة الشاشة بحيث يمكن الرجوع إليه في عدة أجزاء من اللعبة. من السهل أيضًا العثور عليه في الجزء العلوي من الملف بحيث يمكن تغييره لاحقًا. بالنسبة للمشاريع المتقدمة ، سيكون وضع هذه المعلومات في ملف منفصل فكرة أفضل.

    القرار = (400 ، 300)

الخطوة 4. تحديد بعض الألوان

الألوان في pygame هي (RBGA والتي تتراوح في القيم بين 0 و 255. قيمة ألفا (A) اختيارية ولكن الألوان الأخرى (الأحمر والأزرق والأخضر إلزامية).

    أبيض = (255 ، 255 ، 255) أسود = (0 ، 0 ، 0) أحمر = (255 ، 0 ، 0)

الخطوة 5. تهيئة الشاشة

استخدم متغير الدقة الذي تم تحديده مسبقًا.

    الشاشة = pygame.display.set_mode (الدقة)

الخطوة 6. اصنع حلقة لعبة

كرر بعض الإجراءات في كل إطار من لعبتنا. قم بعمل حلقة تتكرر دائمًا للتنقل بين كل هذه الإجراءات.

    احيانا صحيح:

الخطوة 7. لون الشاشة

    ملء الشاشة (أبيض)

الخطوة 8. قم بعرض الشاشة

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

    بينما صحيح:… pygame.display.flip ()

الخطوة 9. التعامل مع الأحداث

احصل على قائمة بجميع الأحداث التي حدثت في كل إطار. أنت ستهتم فقط بحدث واحد ، حدث الإقلاع عن التدخين. يحدث هذا عندما يغلق المستخدم نافذة اللعبة. سيؤدي هذا أيضًا إلى منع تعطل برنامجنا بسبب كثرة الأحداث.

    while True:… للحدث في pygame.event.get (): if event.type == QUIT: pygame.quit ()

ProgramPygamePart1
ProgramPygamePart1

الخطوة 10. جربها

إليك ما يجب أن تبدو عليه الشفرة الآن:

    استيراد pygame من pygame.locals import * Resolution = (400، 300) white = (255، 255، 255) black = (0، 0، 0) red = (255، 0، 0) screen = pygame.display.set_mode (الدقة) بينما صحيح: screen.fill (أبيض) pygame.display.flip () للحدث في pygame.event.get (): if event.type == QUIT: pygame.quit ()

جزء 3 من 8: صنع كائن لعبة

الخطوة الأولى: اصنع صنفًا ومنشئًا جديدًا

اضبط كل خصائص الكائن. تقوم أيضًا بتوفير القيم الافتراضية لجميع الخصائص.

    class Ball: def _init _ (self، xPos = Resolution [0] / 2، yPos = Resolution [1] / 2، xVel = 1، yVel = 1، rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "ball"

الخطوة 2. تحديد كيفية رسم الكائن

استخدم الخصائص التي تم تحديدها في المنشئ لرسم الكرة كدائرة وكذلك لتمرير سطح إلى الوظيفة لرسم الكائن عليه. سيكون السطح هو كائن الشاشة الذي تم إنشاؤه باستخدام الدقة مسبقًا.

    def draw (ذاتي ، السطح): pygame.draw.circle (السطح ، أسود ، (self.x ، self.y) ، نصف القطر الذاتي)

الخطوة الثالثة. قم بعمل مثال للفصل وكذلك لإخبار حلقة اللعبة برسم الكرة في كل حلقة

    ball = Ball () بينما True:… ball.draw (شاشة)

الخطوة 4. اجعل الكائن يتحرك

قم بإنشاء وظيفة من شأنها تحديث موضع الكائن. استدعاء هذه الوظيفة في كل حلقة لعبة.

    فئة الكرة: … تحديث def (self): self.x + = self.dx self.y + = self.dy

الخطوة 5. تحديد معدل عرض الإطارات

ستتحرك الكرة بسرعة كبيرة لأن حلقة اللعبة تعمل مئات المرات في الثانية. استخدم ساعة Pygame لقصر معدل الإطارات على 60 إطارًا في الثانية.

    clock = pygame.time. Clock () بينما صحيح:… clock.tick (60)

الخطوة 6. حافظ على الكرة على الشاشة

أضف الشيكات في وظيفة التحديث لعكس اتجاه الكرة إذا اصطدمت بأحد حواف الشاشة.

    class Ball:… def update (self):… if (self.x <= 0 or self.x> = Resolution [0]): self.dx * = -1 if (self.y <= 0 or self.y) > = الدقة [1]): self.dy * = -1

ProgramPygamePart2
ProgramPygamePart2

الخطوة 7. جربها

إليك ما يجب أن تبدو عليه الشفرة الآن:

    استيراد pygame من pygame.locals import * Resolution = (400، 300) white = (255، 255، 255) black = (0، 0، 0) red = (255، 0، 0) screen = pygame.display.set_mode (القرار) فئة الكرة: def _init _ (self، xPos = Resolution [0] / 2، yPos = Resolution [1] / 2، xVel = 1، yVel = 1، rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "ball" def رسم (ذاتي ، سطح): pygame.draw.circle (سطح ، أسود ، (self.x ، self.y) ، self.radius) def update (self): self.x + = self.dx self.y + = self.dy if (self.x <= 0 or self.x> = Resolution [0]): self.dx * = -1 إذا (self.y <= 0 أو self.y> = الدقة [1]): self.dy * = -1 ball = Ball () clock = pygame.time. Clock () بينما True: screen. ملء الكرة (البيضاء). رسم (الشاشة) ball.update () pygame.display.flip () clock.tick (60) للحدث في pygame.event.get (): if event.type == QUIT: pygame.quit ()

جزء 4 من 8: تنظيم اللعبة

الخطوة الأولى: استخدم الفصول الدراسية لتنظيم كل شيء

ستصبح اللعبة أكثر تعقيدًا. استخدم تقنيات موجهة للكائنات لتنظيم التعليمات البرمجية الخاصة بك.

الخطوة الثانية: اجعل حلقة اللعبة في الفصل

نظرًا لأن لعبتنا تحتوي الآن على بيانات بما في ذلك عناصر اللعبة ووظائفها ، فمن المنطقي تحويل حلقة لعبتك إلى فصل دراسي.

    لعبة فئة ():

الخطوة 3. قم بإضافة مُنشئ

هنا سوف تقوم بإنشاء مثيل لبعض كائنات اللعبة ، وإنشاء الشاشة والساعة لدينا وتهيئة Pygame. يجب تهيئة Pygame لاستخدام ميزات معينة مثل النص أو الصوت.

    فئة اللعبة (): def _init _ (self): pygame.init () self.screen = pygame.display.set_mode (القرار) self.clock = pygame.time. Clock ()

الخطوة 4. التعامل مع الأحداث في وظيفة

    فئة اللعبة (): … def handleEvents (self): for event in pygame.event.get (): if event.type == QUIT: pygame.quit ()

الخطوة 5. اجعل حلقة اللعبة وظيفة

استدعاء وظيفة معالجة الحدث كل حلقة.

    لعبة فئة (): … def run (self): while True: self.handleEvents () self.screen.fill (white) self.clock.tick (60) pygame.display.flip ()

الخطوة 6. التعامل مع العديد من كائنات اللعبة

في الوقت الحالي ، يجب على هذا الرمز استدعاء الرسم وتحديث كل إطار على كائننا. قد يتسبب ذلك في حدوث فوضى إذا كان لديك الكثير من الأشياء. دعنا نضيف كائننا إلى مصفوفة ثم نحدّث ونرسم كل الكائنات في المصفوفة في كل حلقة. الآن يمكنك بسهولة إضافة كائن آخر ومنحه موضع بداية مختلف.

    لعبة فئة (): def _init _ (self): … self.gameObjects = self.gameObjects.append (كرة ()) self.gameObjects.append (الكرة (100)) … def run (self): while True: self.handleEvents () for gameObj in self.gameObjects: gameObj.update () self.screen.fill (أبيض) لـ gameObj في self.gameObjects: gameObj.draw (self.screen) self.clock.tick (60) pygame.display.يواجه()

ProgramPygamePart3
ProgramPygamePart3

الخطوة 7. جربها

إليك ما يجب أن تبدو عليه الشفرة الآن:

    استيراد pygame من pygame.locals import * Resolution = (400، 300) white = (255، 255، 255) black = (0، 0، 0) red = (255، 0، 0) screen = pygame.display.set_mode (القرار) فئة الكرة: def _init _ (self، xPos = Resolution [0] / 2، yPos = Resolution [1] / 2، xVel = 1، yVel = 1، rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "ball" def رسم (ذاتي ، سطح): pygame.draw.circle (سطح ، أسود ، (self.x ، self.y) ، self.radius) def update (self): self.x + = self.dx self.y + = self.dy if (self.x <= 0 or self.x> = Resolution [0]): self.dx * = -1 إذا (self.y <= 0 or self.y> = Resolution [1]): self.dy * = -1 class game (): def _init _ (self): pygame.init () self.screen = pygame.display.set_mode (Resolution) self.clock = pygame.time. Clock () self.gameObjects = self.gameObjects.append (Ball ()) self.gameObjects.append (Ball (100)) def handleEvents (self): للحدث في pygame.event.get (): if event.type == QUIT: pygame.quit () def run (self): while True: self.handleEvent s () لـ gameObj في self.gameObjects: gameObj.update () self.screen.fill (أبيض) لـ gameObj في self.gameObjects: gameObj.draw (self.screen) self.clock.tick (60) pygame.display. flip () game (). run ()

جزء 5 من 8: إضافة كائن لاعب

الخطوة 1. اصنع فئة لاعب ومنشئ

ستنشئ دائرة أخرى يتحكم فيها الماوس. تهيئة القيم في المنشئ. نصف القطر هو القيمة الوحيدة المهمة.

    لاعب فئة: def _init _ (self ، rad = 20): self.x = 0 self.y = 0 self.radius = rad

الخطوة 2. تحديد كيفية رسم كائن اللاعب

ستكون بنفس الطريقة التي رسمت بها كائنات اللعبة الأخرى.

    class Player: … def draw (self، surface): pygame.draw.circle (سطح ، أحمر ، (self.x ، self.y) ، self.radius)

الخطوة الثالثة. أضف تحكم بالماوس لكائن اللاعب

في كل إطار ، تحقق من موقع الماوس وقم بتعيين موقع كائنات اللاعبين على تلك النقطة.

    class Player: … def update (self): cord = pygame.mouse.get_pos () self.x = cord [0] self.y = cord [1]

الخطوة 4. أضف كائن لاعب إلى gameObjects

قم بإنشاء مثيل لاعب جديد وإضافته إلى القائمة.

    لعبة فئة (): def _init _ (self): … self.gameObjects.append (Player ())

ProgramPygamePart4
ProgramPygamePart4

الخطوة 5. جربها

إليك ما يجب أن تبدو عليه الشفرة الآن:

    استيراد pygame من pygame.locals import * Resolution = (400، 300) white = (255، 255، 255) black = (0، 0، 0) red = (255، 0، 0) screen = pygame.display.set_mode (القرار) فئة الكرة: def _init _ (self، xPos = Resolution [0] / 2، yPos = Resolution [1] / 2، xVel = 1، yVel = 1، rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "ball" def رسم (ذاتي ، سطح): pygame.draw.circle (سطح ، أسود ، (self.x ، self.y) ، self.radius) def update (self): self.x + = self.dx self.y + = self.dy if (self.x <= 0 or self.x> = Resolution [0]): self.dx * = -1 إذا (self.y <= 0 or self.y> = Resolution [1]): self.dy * = -1 class Player: def _init _ (self، rad = 20): self.x = 0 self.y = 0 self.radius = rad self.type = "player" def draw (ذاتي ، السطح): pygame.draw.circle (السطح ، الأحمر ، (self.x ، self.y) ، self.radius) تحديث def (self): cord = pygame.mouse.get_pos () self.x = cord [0] self.y = cord [1] class game (): def _init _ (self): pygame.init () self.screen = pygame.display.set_ mode (Resolution) self.clock = pygame.time. Clock () self.gameObjects = self.gameObjects.append (Player ()) self.gameObjects.append (Ball ()) self.gameObjects.append (كرة (100))) def handleEvents (self): للحدث في pygame.event.get (): if event.type == QUIT: pygame.quit () def run (self): while True: self.handleEvents () for gameObj in self.gameObjects: gameObj.update () self.screen.fill (أبيض) لـ gameObj في self.gameObjects: gameObj.draw (self.screen) self.clock.tick (60) pygame.display.flip () game (). يركض()

جزء 6 من 8: جعل الكائنات تتفاعل مع اللاعب

الخطوة 1. تغيير وظائف التحديث

لكي تتفاعل الكائنات ، سيحتاجون إلى الوصول إلى بعضهم البعض. دعنا نضيف معلمة أخرى للتحديث لتمريرها في قائمة gameObjects. سيتعين عليك إضافته إلى كل من كائن اللاعب وكائنات الكرة. إذا كان لديك الكثير من كائنات اللعبة ، يمكن أن تساعدك الوراثة في الحفاظ على نفس تواقيع الطريقة.

    class Ball: … تحديث def (self ، gameObjects): … class Player: … def update (self ، gameObjects):

الخطوة الثانية. تحقق من الاصطدام بين اللاعب والكرات

تصفح جميع كائنات اللعبة وتحقق مما إذا كان نوع الكائنات عبارة عن كرة. ثم استخدم نصف قطر الجسمين وصيغة المسافة للتحقق مما إذا كانا متصادمين. الدوائر من السهل حقًا التحقق من الاصطدامات. هذا هو أكبر سبب لعدم استخدامك لشكل آخر لهذه اللعبة.

    class Player: … تحديث def (self ، gameObjects):… for gameObj in gameObjects: if gameObj.type == "ball": if (gameObj.x - self.x) ** 2 + (gameObj.y - self.y) ** 2 <= (gameObj.radius + self.radius) ** 2:

ProgramPygamePart5
ProgramPygamePart5

الخطوة 3. قم بإنهاء اللعبة إذا تعرض اللاعب "للضرب"

دعنا فقط نغادر اللعبة الآن.

    إذا (gameObj.x - self.x) ** 2 + (gameObj.y - self.y) ** 2 <= (gameObj.radius + self.radius) ** 2: pygame.quit ()

الخطوة 4. جربها

إليك ما يجب أن تبدو عليه الشفرة الآن:

    استيراد pygame من pygame.locals import * Resolution = (400، 300) white = (255، 255، 255) black = (0، 0، 0) red = (255، 0، 0) screen = pygame.display.set_mode (القرار) فئة الكرة: def _init _ (self، xPos = Resolution [0] / 2، yPos = Resolution [1] / 2، xVel = 1، yVel = 1، rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "ball" def رسم (ذاتي ، سطح): pygame.draw.circle (سطح ، أسود ، (self.x ، self.y) ، self.radius) def update (self، gameObjects): self.x + = self.dx self.y + = self.dy if (self.x <= 0 or self.x> = Resolution [0]): self.dx * = -1 if (self.y <= 0 or self.y> = Resolution [1]): self.dy * = -1 class Player: def _init _ (self، rad = 20): self.x = 0 self.y = 0 self.radius = rad self.type = "player" def draw (ذاتي ، سطح): pygame.draw.circle (سطح ، أحمر ، (self.x ، self.y) ، نصف قطر self. تحديث def (self، gameObjects): cord = pygame.mouse.get_pos () self.x = cord [0] self.y = cord [1] لـ gameObj في gameObjects: if gameObj.type == "ball": if (gameObj.x - self.x) ** 2 + (gameObj.y - self.y) ** 2 <= (gameObj.radius + self.radius) ** 2: pygame.quit () لعبة فئة (): def _init _ (self): pygame.init () self.screen = pygame.display.set_mode (Resolution) self.clock = pygame.time. Clock () self.gameObjects = self.gameObjects.append (Player ()) self.gameObjects.append (كرة ()) self.gameObjects.append (كرة (100)) def handleEvents (self): للحدث في pygame.event.get (): if event.type == QUIT: pygame.quit () def run (self): while True: self.handleEvents () للعبة gameObj في self.gameObjects: gameObj.update (self.gameObjects) self.screen.fill (أبيض) لـ gameObj في self.gameObjects: gameObj.draw (self.screen) self.clock.tick (60) لعبة pygame.display.flip (). تشغيل ()

جزء 7 من 8: إضافة وحدة تحكم تسالي لإنشاء كائنات

الخطوة الأولى. قم بإنشاء فئة وحدة تحكم التسالي

أجهزة التحكم في اللعبة هي المسؤولة عن "تشغيل" اللعبة. إنها تختلف عن فئة لعبتنا المسؤولة عن رسم وتحديث جميع كائناتنا. ستضيف وحدة التحكم بشكل دوري كرة أخرى إلى الشاشة لجعل اللعبة أكثر صعوبة. أضف مُنشئًا وقم بتهيئة بعض القيم الأساسية. الفاصل الزمني سيكون الوقت قبل إضافة كرة أخرى.

    class GameController: def _init _ (self ، الفاصل الزمني = 5): self.inter = الفاصل الزمني self.next = pygame.time.get_ticks () + (2 * 1000) self.type = "وحدة التحكم في اللعبة"

الخطوة 2. أضف وظيفة التحديث

سيتحقق هذا من مقدار الوقت المنقضي منذ إضافة الكرة أو من بداية اللعبة. إذا كان الوقت أكثر من الفاصل الزمني ، فستقوم بإعادة ضبط الوقت وإضافة كرة.

    class GameController:… def update (self، gameObjects): if self.next <pygame.time.get_ticks (): self.next = pygame.time.get_ticks () + (self.inter * 1000) gameObjects.append (كرة ())

الخطوة 3. أعط الكرات سرعات عشوائية

ستحتاج إلى استخدام أرقام عشوائية لجعل اللعبة مختلفة في كل مرة. ومع ذلك ، فإن سرعات الكرات هي الآن رقم فاصلة عائمة بدلاً من عدد صحيح.

    class GameController:… def update (self، gameObjects): if self.next <pygame.time.get_ticks (): self.next = pygame.time.get_ticks () + (self.inter * 1000) gameObjects.append (كرة (xVel = عشوائي () * 2 ، yVel = عشوائي () * 2))

الخطوة 4. إصلاح وظيفة السحب

لن تقبل وظيفة الرسم العوامات. دعونا نحول موضع الكرة إلى أعداد صحيحة قبل سحب الكرات.

    فئة الكرة: … def draw (ذاتي ، سطح): pygame.draw.circle (سطح ، أسود ، (int (self.x) ، int (self.y)) ، self.radius)

الخطوة 5. تحديد طريقة السحب لجهاز التحكم في اللعبة

نظرًا لأنه كائن لعبة ، ستحاول الحلقة الرئيسية رسمه. ستحتاج إلى تحديد وظيفة السحب التي لا تفعل شيئًا حتى لا تتعطل اللعبة.

    فئة GameController:… def draw (self، screen): pass

الخطوة 6. أضف وحدة التحكم في اللعبة إلى gameObjects وقم بإزالة الكرتين

يجب أن تفرخ اللعبة الآن كرة كل خمس ثوان.

    لعبة فئة (): def _init _ (self): … self.gameObjects = self.gameObjects.append (GameController ()) self.gameObjects.append (Player ())

ProgramPygamePart6
ProgramPygamePart6

الخطوة 7. جربها

إليك ما يجب أن تبدو عليه الشفرة الآن:

    استيراد pygame من استيراد عشوائي عشوائي من استيراد pygame.locals * الدقة = (400 ، 300) أبيض = (255 ، 255 ، 255) أسود = (0 ، 0 ، 0) أحمر = (255 ، 0 ، 0) شاشة = pygame. display.set_mode (Resolution) class Ball: def _init _ (self، xPos = Resolution [0] / 2، yPos = Resolution [1] / 2، xVel = 1، yVel = 1، rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "كرة" def رسم (ذاتي ، سطح): pygame.draw.circle (السطح ، أسود ، (int (self. x)، int (self.y))، self.radius) def update (self، gameObjects): self.x + = self.dx self.y + = self.dy if (self.x <= 0 or self. x> = Resolution [0]): self.dx * = -1 if (self.y <= 0 or self.y> = Resolution [1]): self.dy * = -1 class Player: def _init _ (self ، rad = 20): self.x = 0 self.y = 0 self.radius = rad self.type = "player" def draw (self، surface): pygame.draw.circle (سطح ، أحمر ، (self.x) ، self.y)، self.radius) def update (self، gameObjects): cord = pygame.mouse.get_pos () self.x = cord [0] self.y = cord [1] لـ gameObj في اللعبة الكائنات: if gameObj.type == "ball": if (gameObj.x - self.x) ** 2 + (gameObj.y - self.y) ** 2 <= (gameObj.radius + self.radius) * * 2: pygame.quit () class GameController: def _init _ (self ، الفاصل الزمني = 5): self.inter = الفاصل الزمني self.next = pygame.time.get_ticks () + (2 * 1000) self.type = "وحدة تحكم اللعبة "def update (self، gameObjects): if self.next <pygame.time.get_ticks (): self.next = pygame.time.get_ticks () + (self.inter * 1000) gameObjects.append (كرة (xVel = عشوائي () * 2، yVel = random () * 2)) def draw (self، screen): pass class game (): def _init _ (self): pygame.init () self.screen = pygame.display.set_mode (Resolution)) self.clock = pygame.time. Clock () self.gameObjects = self.gameObjects.append (GameController ()) self.gameObjects.append (Player ()) def handleEvents (self): للحدث في pygame.event.get (): if event.type == QUIT: pygame.quit () def run (self): while True: self.handleEvents () for gameObj في self.gameObjects: gameObj.update (self.gameObjects) self.screen.fill (أبيض) لـ gameObj في self.gameO bjects: gameObj.draw (self.screen) self.clock.tick (60) pygame.display.flip () game (). run ()

جزء 8 من 8: إضافة النتيجة وانتهاء اللعبة

الخطوة 1. أضف درجة إلى فئة وحدة التحكم في اللعبة

إنشاء كائن الخط ومتغير النتيجة. ستقوم برسم الخط في كل إطار لعرض النتيجة وزيادة النتيجة في كل إطار قيد التحديث.

    class GameController: def _init _ (self ، الفاصل الزمني = 5): … self.score = 0 self.scoreText = pygame.font. Font (بلا ، 12) تحديث def (self ، gameObjects): … self.score + = 1 def draw (self، screen): screen.blit (self.scoreText.render (str (self.score)، True، black)، (5، 5))

الخطوة 2. تعديل كيفية انتهاء اللعبة

دعونا نتخلص من الإقلاع عندما يكتشف اللاعب تصادمًا. بدلاً من ذلك ، ستقوم بتعيين متغير في اللاعب يمكن للعبة التحقق منه. عند ضبط gameOver ، توقف عن تحديث الكائنات. سيؤدي هذا إلى تجميد كل شيء في مكانه حتى يتمكن اللاعب من رؤية ما حدث والتحقق من نتيجته. لاحظ أنه لا يزال يتم رسم الكائنات ، فقط لم يتم تحديثها.

    class Player: def _init _ (self، rad = 20):… self.gameOver = False def update (self، gameObjects):… for gameObj in gameObjects: if gameObj.type == "ball": if (gameObj.x - self.x) ** 2 + (gameObj.y - self.y) ** 2 <= (gameObj.radius + self.radius) ** 2: self.gameOver = لعبة فئة حقيقية (): def _init _ (self): … self.gameOver = تشغيل def false (self): while True: self.handleEvents () إن لم يكن self.gameOver: لـ gameObj في self.gameObjects: gameObj.update (self.gameObjects) إذا كانت gameObj.type == "لاعب": self.gameOver = gameObj.gameOver

ProgramPygameFinal
ProgramPygameFinal

الخطوة 3. جربها

إليك ما يجب أن تبدو عليه الشفرة النهائية الآن:

    استيراد pygame من استيراد عشوائي عشوائي من استيراد pygame.locals * الدقة = (400 ، 300) أبيض = (255 ، 255 ، 255) أسود = (0 ، 0 ، 0) أحمر = (255 ، 0 ، 0) شاشة = pygame. display.set_mode (Resolution) class Ball: def _init _ (self، xPos = Resolution [0] / 2، yPos = Resolution [1] / 2، xVel = 1، yVel = 1، rad = 15): self.x = xPos self.y = yPos self.dx = xVel self.dy = yVel self.radius = rad self.type = "كرة" def رسم (ذاتي ، سطح): pygame.draw.circle (السطح ، أسود ، (int (self. x)، int (self.y))، self.radius) def update (self، gameObjects): self.x + = self.dx self.y + = self.dy if (self.x <= 0 or self. x> = Resolution [0]): self.dx * = -1 if (self.y <= 0 or self.y> = Resolution [1]): self.dy * = -1 class Player: def _init _ (self ، rad = 20): self.x = 0 self.y = 0 self.radius = rad self.type = "player" self.gameOver = رسم def false (ذاتي ، سطح): pygame.draw.circle (سطح ، أحمر ، (self.x، self.y)، self.radius) def update (self، gameObjects): cord = pygame.mouse.get_pos () self.x = cord [0] self.y = cord [1] لـ gameObj في gameObjects: if gameObj.type == "ball": if (gameObj.x - self.x) ** 2 + (gameObj.y - self.y) ** 2 <= (gameObj.radius + self.radius) ** 2: self.gameOver = True class GameController: def _init _ (self ، الفاصل الزمني = 5): self.inter = الفاصل الزمني self.next = pygame.time.get_ticks () + (2 * 1000) self. اكتب = "game controller" self.score = 0 self.scoreText = pygame.font. Font (بلا ، 12) تحديث def (self ، gameObjects): if self.next <pygame.time.get_ticks (): self.next = pygame.time.get_ticks () + (self.inter * 1000) gameObjects.append (Ball (xVel = random () * 2، yVel = random () * 2)) self.score + = 1 def draw (self، screen)): screen.blit (self.scoreText.render (str (self.score)، True، black)، (5، 5)) class game (): def _init _ (self): pygame.init () self.screen = pygame.display.set_mode (القرار) self.clock = pygame.time. Clock () self.gameObjects = self.gameObjects.append (GameController ()) self.gameObjects.append (Player ()) self.gameOver = خطأ def handleEvents (self): للحدث في pygame.event.get (): if ev ent.type == QUIT: pygame.quit () def run (self): while True: self.handleEvents () if not self.gameOver: for gameObj في self.gameObjects: gameObj.update (self.gameObjects) إذا gameObj. اكتب == "player": self.gameOver = gameObj.gameOver self.screen.fill (أبيض) لـ gameObj in self.gameObjects: gameObj.draw (self.screen) self.clock.tick (60) pygame.display.flip () لعبة (). تشغيل ()

موصى به: