# لعبة أسبوع إنقاذ المدينة الذكية

دالة عرب(قيمة):
    نص_القيمة = نص(قيمة)
    لكل أصل، بديل في [
        ("0"، "٠")،
        ("1"، "١")،
        ("2"، "٢")،
        ("3"، "٣")،
        ("4"، "٤")،
        ("5"، "٥")،
        ("6"، "٦")،
        ("7"، "٧")،
        ("8"، "٨")،
        ("9"، "٩")،
        ("."، "٫")،
        ("-"، "−")،
    ]:
        نص_القيمة = نص_القيمة.استبدل(أصل، بديل)
    ارجع نص_القيمة


دالة بين(قيمة، أدنى، أعلى):
    اذا قيمة < أدنى:
        ارجع أدنى
    اذا قيمة > أعلى:
        ارجع أعلى
    ارجع قيمة


مدة_الجولة = ٧
هدف_النبض = ٦٠


صنف حي:
    دالة جهز(ذات، اسم، سكان، عقدة، س، ص):
        ذات.اسم = اسم
        ذات.سكان = سكان
        ذات.عقدة = عقدة
        ذات.س = س
        ذات.ص = ص
        ذات.نبض = ٨٠
        ذات.مشكلة = ""
        ذات.نوع = ""
        ذات.حالة = "آمن"

    دالة جدد_الحالة(ذات):
        اذا ذات.نبض >= ٧٠:
            ذات.حالة = "آمن"
        والا_اذا ذات.نبض >= ٤٥:
            ذات.حالة = "متوتر"
        والا:
            ذات.حالة = "خطر"

    دالة اضرب(ذات، اسم_الأزمة، نوع_الأزمة، شدة):
        ذات.مشكلة = اسم_الأزمة
        ذات.نوع = نوع_الأزمة
        ذات.نبض = بين(ذات.نبض - شدة، ٠، ١٠٠)
        ذات.جدد_الحالة()

    دالة عالج(ذات، نوع_الفريق):
        اذا نوع_الفريق == ذات.نوع:
            ذات.نبض = بين(ذات.نبض + ٢٤، ٠، ١٠٠)
            ذات.مشكلة = ""
            ذات.نوع = ""
            ذات.جدد_الحالة()
            ارجع صحيح

        ذات.نبض = بين(ذات.نبض - ١٦، ٠، ١٠٠)
        ذات.مشكلة = ""
        ذات.نوع = ""
        ذات.جدد_الحالة()
        ارجع خطأ

    دالة خطر(ذات):
        قيمة = ١٠٠ - ذات.نبض
        اذا ذات.مشكلة != "":
            قيمة = قيمة + ٢٥
        ارجع قيمة

    دالة بطاقة(ذات):
        ارجع {
            "اسم": ذات.اسم،
            "سكان": ذات.سكان،
            "عقدة": ذات.عقدة،
            "س": ذات.س،
            "ص": ذات.ص،
            "حالة": ذات.حالة،
            "خطر": ذات.خطر(),
            "نبض": ذات.نبض،
            "صحة": ذات.نبض،
            "مشكلة": ذات.مشكلة،
            "نوع": ذات.نوع،
            "عجز": ١٠٠ - ذات.نبض،
            "نسبة_طاقة": ذات.نبض،
            "نسبة_ماء": ذات.نبض،
        }


صنف فريق:
    دالة جهز(ذات، اسم، نوع، رمز):
        ذات.اسم = اسم
        ذات.نوع = نوع
        ذات.رمز = رمز

    دالة بطاقة(ذات):
        ارجع {"اسم": ذات.اسم، "نوع": ذات.نوع، "رمز": ذات.رمز}


دالة انشئ_حي(اسم، سكان، عقدة، س، ص):
    جديد = حي()
    جديد.جهز(اسم، سكان، عقدة، س، ص)
    ارجع جديد


دالة انشئ_فريق(اسم، نوع، رمز):
    جديد = فريق()
    جديد.جهز(اسم، نوع، رمز)
    ارجع جديد


دالة شبكة_الطرق():
    ارجع {
        "المركز": [("السوق"، ٤)، ("الجامعة"، ٦)، ("الميناء"، ٧)]،
        "السوق": [("المركز"، ٤)، ("المستشفى"، ٣)، ("الشمس"، ٥)]،
        "الجامعة": [("المركز"، ٦)، ("المختبر"، ٢)، ("المستشفى"، ٤)]،
        "الميناء": [("المركز"، ٧)، ("البحر"، ٣)]،
        "المستشفى": [("السوق"، ٣)، ("الجامعة"، ٤)، ("الشمال"، ٤)]،
        "المختبر": [("الجامعة"، ٢)، ("الشمال"، ٥)]،
        "الشمس": [("السوق"، ٥)، ("الشمال"، ٦)]،
        "الشمال": [("المستشفى"، ٤)، ("المختبر"، ٥)، ("الشمس"، ٦)]،
        "البحر": [("الميناء"، ٣)]،
    }


دالة مواضع_العقد():
    ارجع {
        "المركز": (٥٠، ٥٠)،
        "السوق": (٣٣، ٤٢)،
        "الجامعة": (٦٥، ٣٥)،
        "الميناء": (٧٧، ٦٧)،
        "المستشفى": (٤٤، ٢٣)،
        "المختبر": (٧٢، ٢٠)،
        "الشمس": (٢٢، ٦٦)،
        "الشمال": (٣٨، ٧٨)،
        "البحر": (٨٨، ٨٥)،
    }


دالة قائمة_الروابط():
    روابط = []
    شبكة = شبكة_الطرق()
    لكل اسم في شبكة:
        لكل جار، كلفة في شبكة[اسم]:
            روابط.اضف({"من": اسم، "إلى": جار، "كلفة": كلفة})
    ارجع روابط


دالة قائمة_العقد():
    مواضع = مواضع_العقد()
    عقد = []
    لكل اسم في مواضع:
        س، ص = مواضع[اسم]
        نوع = "مرفق"
        عنوان = اسم
        حي_مرتبط = ""
        اذا اسم == "المركز":
            نوع = "مركز"
        لكل منطقة في الأحياء:
            اذا منطقة.عقدة == اسم:
                نوع = "حي"
                عنوان = منطقة.اسم
                حي_مرتبط = منطقة.اسم
        عقد.اضف({"اسم": اسم، "عنوان": عنوان، "نوع": نوع، "حي": حي_مرتبط، "س": س، "ص": ص})
    ارجع عقد


دالة اقصر_مسار(شبكة، بداية، نهاية):
    كبير = ١٠٠٠٠
    تكاليف = {}
    سابق = {}
    غير_مزارة = []

    لكل اسم في شبكة:
        تكاليف[اسم] = كبير
        سابق[اسم] = لاشيء
        غير_مزارة.اضف(اسم)

    تكاليف[بداية] = ٠

    طالما طول(غير_مزارة) > ٠:
        حالي = غير_مزارة[٠]
        لكل اسم في غير_مزارة:
            اذا تكاليف[اسم] < تكاليف[حالي]:
                حالي = اسم

        اذا حالي == نهاية:
            اكسر

        غير_مزارة.ازل(حالي)
        لكل جار، كلفة في شبكة[حالي]:
            جديد = تكاليف[حالي] + كلفة
            اذا جديد < تكاليف[جار]:
                تكاليف[جار] = جديد
                سابق[جار] = حالي

    مسار = []
    مؤشر = نهاية
    طالما مؤشر != لاشيء:
        مسار.ادرج(٠، مؤشر)
        مؤشر = سابق[مؤشر]

    ارجع مسار، تكاليف[نهاية]


دالة جدول_الأزمات():
    ارجع [
        {"اسم": "انقطاع كهرباء"، "حي": "النخيل"، "نوع": "كهرباء"، "قرار": "كهرباء"، "شدة": ١٨، "وصف": "الأضواء انطفأت في النخيل"}،
        {"اسم": "تسرب ماء"، "حي": "الميناء"، "نوع": "ماء"، "قرار": "ماء"، "شدة": ١٧، "وصف": "الماء يتسرب قرب الميناء"}،
        {"اسم": "اختناق مروري"، "حي": "الجامعة"، "نوع": "مرور"، "قرار": "مرور"، "شدة": ١٦، "وصف": "الحافلات عالقة حول الجامعة"}،
        {"اسم": "نداء صحي"، "حي": "الواحة"، "نوع": "صحة"، "قرار": "صحة"، "شدة": ١٩، "وصف": "الواحة تحتاج إسعافا ذكيا"}،
        {"اسم": "هبوط كهرباء"، "حي": "الجامعة"، "نوع": "كهرباء"، "قرار": "كهرباء"، "شدة": ٢٠، "وصف": "مختبرات الجامعة فقدت الطاقة"}،
        {"اسم": "ازدحام ميناء"، "حي": "الميناء"، "نوع": "مرور"، "قرار": "مرور"، "شدة": ١٨، "وصف": "الشاحنات تسد طريق الميناء"}،
        {"اسم": "موجة عطش"، "حي": "النخيل"، "نوع": "ماء"، "قرار": "ماء"، "شدة": ٢١، "وصف": "خزانات النخيل تهبط بسرعة"}،
    ]


دالة ابحث_حي(اسم):
    لكل منطقة في الأحياء:
        اذا منطقة.اسم == اسم:
            ارجع منطقة
    ارجع الأحياء[٠]


دالة احسب_نبض_المدينة():
    مجموع = ٠
    لكل منطقة في الأحياء:
        مجموع = مجموع + منطقة.نبض
    ارجع مجموع // طول(الأحياء)


دالة احسب_الأحياء_الآمنة():
    عدد = ٠
    لكل منطقة في الأحياء:
        اذا منطقة.نبض >= هدف_النبض:
            عدد = عدد + ١
    ارجع عدد


دالة الأزمات_القادمة():
    جدول = جدول_الأزمات()
    نتائج = []
    مؤشر = اليوم
    طالما مؤشر < طول(جدول) و طول(نتائج) < ٣:
        أزمة = جدول[مؤشر]
        نتائج.اضف({"يوم": مؤشر + ١، "اسم": أزمة["اسم"]، "حي": أزمة["حي"]، "نوع": أزمة["نوع"]})
        مؤشر = مؤشر + ١
    ارجع نتائج


دالة طبق_أزمة():
    عام الإنذار، المحدد، المسار_النشط، كلفة_المسار، الرسالة
    جدول = جدول_الأزمات()
    الإنذار = جدول[اليوم - ١]
    منطقة = ابحث_حي(الإنذار["حي"])
    منطقة.اضرب(الإنذار["اسم"]، الإنذار["نوع"]، الإنذار["شدة"])
    المحدد = منطقة.اسم
    المسار_النشط، كلفة_المسار = اقصر_مسار(شبكة_الطرق()، "المركز"، منطقة.عقدة)
    الرسالة = "إنذار: " + الإنذار["وصف"]


دالة راجع_النهاية():
    عام انتهت، فوز، النتيجة، الرسالة
    نبض = احسب_نبض_المدينة()
    اذا اليوم >= مدة_الجولة:
        انتهت = صحيح
        اذا نبض >= هدف_النبض:
            فوز = صحيح
            النتيجة = "فزت"
            الرسالة = "نجحت: المدينة بقيت حية حتى نهاية الأسبوع"
        والا:
            فوز = خطأ
            النتيجة = "خسرت"
            الرسالة = "خسرت: نبض المدينة هبط دون الهدف"
    والا_اذا نبض <= ٢٠:
        انتهت = صحيح
        فوز = خطأ
        النتيجة = "خسرت"
        الرسالة = "خسرت: المدينة انهارت قبل نهاية الأسبوع"
    والا:
        انتهت = خطأ
        فوز = خطأ
        النتيجة = "قيد اللعب"


دالة اختر_حي(اسم):
    عام المحدد، المسار_النشط، كلفة_المسار، الرسالة
    منطقة = ابحث_حي(اسم)
    المحدد = منطقة.اسم
    المسار_النشط، كلفة_المسار = اقصر_مسار(شبكة_الطرق()، "المركز"، منطقة.عقدة)
    الرسالة = "تم تحديد " + المحدد
    ارجع اعط_الحالة()


دالة نفذ_قرار(قرار):
    عام اليوم، نقاط، أثر_القرار، الرسالة
    اذا انتهت:
        أثر_القرار = "الجولة انتهت"
        ارجع اعط_الحالة()

    منطقة = ابحث_حي(الإنذار["حي"])
    اذا قرار == الإنذار["قرار"]:
        صحيح_القرار = منطقة.عالج(قرار)
        نقاط = نقاط + ١٠
        أثر_القرار = "قرار صحيح: فريق " + قرار + " أنقذ " + منطقة.اسم
    والا:
        صحيح_القرار = منطقة.عالج(قرار)
        نقاط = نقاط - ٥
        أثر_القرار = "قرار خاطئ: الأزمة كانت تحتاج فريق " + الإنذار["قرار"]

    راجع_النهاية()
    اذا انتهت:
        ارجع اعط_الحالة()

    اليوم = اليوم + ١
    طبق_أزمة()
    راجع_النهاية()
    ارجع اعط_الحالة()


دالة مجاميع():
    ارجع {
        "آمنة": احسب_الأحياء_الآمنة(),
        "كل": طول(الأحياء),
        "نسبة_آمنة": احسب_الأحياء_الآمنة() * ١٠٠ // طول(الأحياء),
        "نبض": احسب_نبض_المدينة(),
        "نسبة_طاقة": احسب_نبض_المدينة(),
        "نسبة_ماء": احسب_نبض_المدينة(),
    }


دالة اعط_الحالة():
    منطقة = ابحث_حي(المحدد)
    ارجع {
        "اليوم": اليوم،
        "مدة_الجولة": مدة_الجولة،
        "هدف_الاستقرار": هدف_النبض،
        "ميزانية": نقاط،
        "استقرار": احسب_نبض_المدينة(),
        "انتهت": انتهت،
        "فوز": فوز،
        "نتيجة": النتيجة،
        "إنذار": الإنذار،
        "أثر_القرار": أثر_القرار،
        "رسالة": الرسالة،
        "المحدد": المحدد،
        "المسار": المسار_النشط،
        "كلفة_المسار": كلفة_المسار،
        "الأحياء": [منطقة.بطاقة() لكل منطقة في الأحياء],
        "العقد": قائمة_العقد(),
        "الروابط": قائمة_الروابط(),
        "المحطات": [مجموعة.بطاقة() لكل مجموعة في الفرق],
        "مجاميع": مجاميع(),
        "تنبؤ": الأزمات_القادمة(),
        "سجل": [أثر_القرار، الرسالة],
    }


دالة ابدا():
    عام اليوم، نقاط، الأحياء، الفرق، المحدد، المسار_النشط، كلفة_المسار، الإنذار، أثر_القرار، الرسالة، انتهت، فوز، النتيجة
    اليوم = ١
    نقاط = ٠
    أثر_القرار = "أول إنذار ظهر على الخريطة"
    الرسالة = "اختر الفريق الذي يطابق نوع الإنذار"
    انتهت = خطأ
    فوز = خطأ
    النتيجة = "قيد اللعب"
    الأحياء = [
        انشئ_حي("النخيل"، ١٢٠٠٠، "الشمال"، ٣٨، ٧٨)،
        انشئ_حي("الواحة"، ٨٥٠٠، "الشمس"، ٢٢، ٦٦)،
        انشئ_حي("الميناء"، ١٥٠٠٠، "البحر"، ٨٨، ٨٥)،
        انشئ_حي("الجامعة"، ٩٢٠٠، "الجامعة"، ٦٥، ٣٥)،
    ]
    الفرق = [
        انشئ_فريق("فريق الكهرباء"، "كهرباء"، "ط")،
        انشئ_فريق("فريق الماء"، "ماء"، "م")،
        انشئ_فريق("فريق المرور"، "مرور"، "ر")،
        انشئ_فريق("فريق الصحة"، "صحة"، "ص")،
    ]
    المحدد = "النخيل"
    المسار_النشط = []
    كلفة_المسار = ٠
    الإنذار = {}
    طبق_أزمة()
    ارجع اعط_الحالة()


ابدا()
