
برمجة نظام إشارة مرورية: تحسين الكود

قم بالترقية للحصول على المزيد من المحتوى
صحيح أم خطأ؟ عندما تبدأ البرامج، تكون الأولوية للحافلة.
إشارات المرور العادية تتبدل بين الأحمر والأصفر والأخضر بمعدلات منتظمة، سواءا جاءت سيارة أم لا. لكن هذه إشارة مرور ذكية! يمكنها التفاعل مع إشارة آتية من حافلة تريد الضوء الأخضر. لكنها تحتاج لبعض التطوير. فهي تظل حمراء إلى أن تطلب الحافلة الضوء الأخضر، ولا تستخدم ضوئها الأصفر أبدا. لنقم الآن بهذا التطوير. لنبدأ بالسودوكود الذي كتبناه في فيديو آخر. إذا تم ضغط الزر A، تُرسل الحافلة إشارة عبر مجموعة الراديو "واحد". الرسالة هي "واحد" وتعني"أريد الضوء الأخضر". في برنامج السودوكود الخاص بإشارة المرور، بدأنا بضبط مجموعة الراديو لـ "واحد". يتحكم المتغير "prio" في منح الأولوية للحافلة. في البداية لا تكون الأولوية للحافلة، لذا "prio" يكون "خطأ"، ثم عند استقبال رسالة "واحد"، يصبح "prio" "صحيحا"، وتحصل الحافلة على الضوء الأخضر. لننظر الآن إلى الكود الذي يتحكم في تغير اللون بإشارة المرور. تعمل الـ loop باستمرار طالما ظل الشرط صحيحا. إذا كان "prio" "خطأ" يُضيء الضوء الأحمر، وإلا فإنه ينطفئ ويُضيء الضوء الأخضر. ينطفئ الضوء الأخضر بعد مرور ثلاثة ثوان، ويصبح "prio" "خطأ"، ونعود لبداية الـ loop ثانية، ويُضيء الضوء الأحمر. التطوير الذي نريد عمله الآن هو إخبار الإشارة بتوقيت تشغيل الضوء الأصفر. نريد بأن يُضيء الضوء الأصفر بين الأحمر والأخضر، ورجوعا كذلك بين الأخضر والأحمر. نُضيف: إطفاء الأحمر، تشغيل الأصفر و إطفاء الأخضر، تشغيل الأصفر. لنقم باختبار الكود. أوه، هذا سريع جدا. علينا إخباره بمدة إضاءة الأحمر قبل تشغيل الأصفر، ومدة إضاءة الأصفر قبل تشغيل الأخضر. لذا نُضيف: وقفة لمدة ثلاثة ثوان بعد إضاءة الأحمر، هنا، ووقفة لمدة ثانية بعد إضاءة الأصفر، في كل من هذين الموضعين، وهنا نكتب: إطفاء الأصفر، تشغيل الأخضر، وكذلك نكتب: إطفاء الأصفر قبل أن يصبح "prio = خطأ". قمنا بعمل تطوير واحد الآن: يُضيء الضوء الأصفر عندما نريد منه ذلك. لكن الإشارة لا تصبح خضراء إلا عندما يضغط سائق حافلة على الزر. هذا لأننا كتبنا الكود المتحكم في الضوء الأخضر كعبارة - وإلا. هذا يعني أنه لا يعمل إلا عندما يكون شرط ما غير صحيح. من الأفضل أن نخبره بأن يعمل بإيجابية باستمرار. لذا نُزيل عبارة - وإلا، فيُضيء كل من الأصفر والأخضر عندما نريد منهما ذلك: أي في كل مرة تعمل الـ loop. لنقم باختبار هذا التطوير. هناك حافلة آتية. يضغط سائقها على الزر. يصبح "prio" "صحيحا" مباشرة. لكن لم يتغير شيء. لماذا؟ إنها تُضيء بالأحمر ثم الأصفر فقط! ما الذي حدث؟ أوه، كنا هنا في السودوكود، عندما تم ضغط الزر، ولم يتم اختبار كون "prio" "صحيحا" حتى عادت الـ loop للبداية ثانية. لذا كان على الحافلة الانتظار في الضوء الأحمر. تسببت لنا الوقفات في الكود إلى مشكلات لم نكن نتوقعها. علينا جعل الكود يقوم باختبار صحة "prio" أكثر. عندما برمجناه للـ "توقف"، توقف الكود: إنه لا يستمع. إنه لا يختبر صحة "prio" سوى هنا: عند عبارة - لو أن. لجعل إشارة المرور تستمع مرات أكثر، فإننا نحتاج للمزيد من عبارات - لو أن. لنقم بتقليل التأخير لثانية من خلال تقسيم الوقفات هكذا: يستطيع الكود الآن الانتقال للأخضر من مواضع مختلفة. لكن علينا التأكد من أن لا يعمل أكثر من ضوء واحد كل مرة. إذا كان "prio" "صحيحا" هنا، ونتخطى هذا الصف، لا ينطفئ الضوء الأحمر. نريد أن لا يعمل سوى الضوء الأخضر للحافلة، لذا علينا إخبار الكود بإطفاء الضوئين الأحمر والأصفر هنا. لنعيد الاختبار. ها هي الحافلة المتأخرة قادمة، يُضغط الزر A وتتحول إشارة المرور للأخضر بسرعة. لقد أصبحت إشارة المرور أكثر ذكاءً! ربما يمكنك ابتكار تطويرات أكثر بنفسك!