مشكلة في التصادم

عندما نضع شرط التصادم في اللوب while نحن وضعنا شرط عندما يكون اقل من ١٠ بين الرأس والجسم يخسر لكن بلعبة الثعبان يمكن للرأس اذا كان اتجاهه بالاعلى أن ينزل إلى الأسفل دون الالتفاف وعند ضعط على النزول إلى الأسفل سوف تصبح المسافة بين الرأس والجسد اقل من ١٠ وهو لم يصدم لكن سوف يفعل الشرط ويضع game over هل نضيف شرط داخل الشرط المسافة أو ماذا

إعجابَين (2)

نعم كلامك صحيح عندما يكون راس الثعبان متجه لاعلى فيمكن انزاله الى اسفل بدون اي التفاف ابدا وهكذا ستخسر بستضام الراس بالقطعة التي اسفله ولذلك قمت بحل المشكلة في اللعبة خاصتي لان المستر على ما اظن لم ينتبه ربما الى هذا الامر فجعلت الكود انه اذا كان راس الثعبان متجه لاعلى واراد المستخدم ان يوجهه الى اسفل فيتجاهل الكود هذا الامر لانه سيصبح تعارض وسيخسر المستخدم

ساشاركك الكود لكي تنتفع به وتصلح هذا الخطا في اللعبة اليك الكود

    def up(self):
        if self.head.heading() == 270:
            pass
        else:
            self.head.setheading(90)

    def down(self):
        if self.head.heading() == 90:
            pass
        else:
            self.head.setheading(270)

    def rghit(self):
        if self.head.heading() == 180:
            pass
        else:
            self.head.setheading(0)

    def left(self):
        if self.head.heading() == 0:
            pass
        else:
            self.head.setheading(180)

فكما سترى في الفانكشن لكل اتجاه انه اذا كان يريد المستخدم وليكن ضغط على السهم اعلى فسترى في فانكشن up انه اذا كان اتجاه راس الثعبان الى اسفل فليتجاهل الكود باستخدام pass والا فليوجه راس الثعبان لاعلى وهكذا طبقها على كل الفانكشن المخصصة للاتجاهات وستحل المشكلة باذن الله

7 إعجابات

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

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

ممكن تضيف الكود ده داخل شرط التصادم، فبدل ما تعتمد بس على المسافة بين الرأس والجسم، تضيف كمان شرط بيتأكد من اتجاه الحركة. مثلا:

if abs(مسافة_بين_الرأس_والجسم) < 10 and not (اتجاه_الرأس == "up" and اتجاه_الجسم == "down") and not (اتجاه_الرأس == "left" and اتجاه_الجسم == "right"):
    game_over()

بكده هتتفادى تفعيل شرط التصادم في الحالات اللي الثعبان فيها بيتحرك بطريقة مش طبيعية زي اللي أنت وصفته.

4 إعجابات

اللهم بارك
حلول مبتكرة
نفع الله بكم
وجزاكم الله خيرا

إعجابَين (2)

تفكير منطقي لكن نفذت هذا قمت بتجارب ع كل قطعة من الجسد وبالتجارب ع قبل اخر قطع من الجسد ومقارنتها مع رأس الثعبان عندما يكون الرأس للأعلى والجسد للأسفل أو بالعكس نفذ continue ومع ذالك يتفعل شرط التصادم

إعجابَين (2)

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

إعجابَين (2)

قمت بفعل ذالك بالفعل حزنت اتجاه السابق وقارنته لكن القائمة في كل مرة اقوم ب افراغها لا تفرغ حتى اقارن النتيجة الثانية قمت مرة اخرى ووضع المقارنة ب اخر عنصر لكن لم تعمل ما بعرف السبب بس نفذت ها حقا

إعجابَين (2)

اجع كود تحديث الاتجاه

إعجابَين (2)

هذا الكود لا يسمح للثعبان بان يتجه اتجاه معاكس

إعجاب واحد (1)