Python ומבני נתונים
מתחילים עם יסודות בפייתון

מילון ב-Python לנוער: בונים תיק ציוד למשחק בלי עשרות משתנים

חרב אחת, שלושה שיקויים, אפס מפתחות ו-12 מטבעות. אפשר לשמור כל כמות במשתנה נפרד — עד שהמשחק גדל. מילון מרכז את כל המלאי במבנה אחד שאפשר לקרוא, לעדכן ולבדוק.

עודכן: יולי 2026
כ-4 דקות קריאה
מפתחות, ערכים ולוגיקת משחק
דוח מצב מהמשחק

השחקנית הרימה מפתח חדש, אבל במסך המלאי עדיין מופיע אפס. איפה מחפשים את הטעות?

לפני שמתקנים צריך לדעת איפה נשמר המצב, באיזה שם פונים אליו ואיזו פעולה הייתה אמורה לשנות אותו. מילון טוב הופך את שלוש השאלות האלה לגלויות בקוד.

ארבעה משתנים נפרדים

swords = 1
potions = 3
keys = 0
coins = 12

מבנה אחד שמתאר את אותו מצב

inventory = {
    "sword": 1,
    "potion": 3,
    "key": 0,
    "coin": 12,
}

לא רשימה ולא אוסף משתנים

מהו מילון בפייתון, ומה בדיוק שמור בו?

מילון, או dictionary, הוא מבנה נתונים שמחבר בין מפתח לערך. בניגוד לרשימה, שבה ניגשים לפריט לפי מיקום כמו 0 או 1, במילון אפשר לבקש מידע לפי שם בעל משמעות — למשל potion. זו התאמה טבעית למלאי, ללוח תוצאות, להגדרות משחק ולכל מצב שבו לכל נתון יש זהות ברורה.

מפתח

"potion"

השם הייחודי שבעזרתו מאתרים פריט. באותו מילון לא יכולים להיות שני מפתחות זהים.

ערך

3

המידע ששמור ליד המפתח. במלאי פשוט זה מספר היחידות הזמינות.

זוג מפתח–ערך

"potion": 3

הקשר בין שם הפריט לכמות שלו. המילון אוסף זוגות כאלה בתוך סוגריים מסולסלים.

ארבע פעולות שמפעילות את תיק הציוד

מבנה נתונים נעשה שימושי רק כשהמשחק משנה אותו. בכל פעולה כדאי לנסח תחילה את חוק המשחק, אחר כך את שינוי המצב ולבסוף את מה שהממשק צריך להציג.

  1. אוספים פריט

    inventory["coin"] += 1

    הערך של coin גדל באחד.

  2. בודקים כמות

    inventory.get("key", 0)

    מקבלים את הכמות, או 0 אם המפתח עדיין לא קיים.

  3. משתמשים בפריט

    inventory["potion"] -= 1

    הכמות קטנה רק אחרי שבודקים שיש מה לצרוך.

  4. עוברים על המלאי

    for item, amount in inventory.items():

    מקבלים בכל סיבוב את שם הפריט ואת הכמות שלו.

מהפעולה לחוק

פונקציה אחת שומרת על חוקי המלאי

אם כל אויב, תיבה וכפתור מעדכנים את המילון בדרך אחרת, קל ליצור חוסר עקביות. פונקציה מרכזית מקבלת את שם הפריט, בודקת את המצב ומחזירה תשובה ברורה.

  • אין חיסור כשהכמות היא אפס.
  • פריט חסר מטופל כמו כמות אפס.
  • הערך המוחזר מספר לממשק אם הפעולה הצליחה.
def use_item(inventory, item):
    amount = inventory.get(item, 0)

    if amount == 0:
        return False

    inventory[item] = amount - 1
    return True

used = use_item(inventory, "potion")
print(used, inventory)

הפונקציה משנה את המילון שהתקבל. זו החלטה שכדאי לזהות במפורש כשקוראים את הקוד ובודקים את התוצאה.

דיבאגינג לפי מצב

שלושה באגים שמילון חושף — אם מדפיסים את הדבר הנכון

במקום להוסיף הדפסות אקראיות, בודקים את המפתח שהתבקש, את הערך לפני הפעולה ואת כל המילון אחריה. ההשוואה בין שלושתם מספרת אם התקלה היא בשם, בחוק או במקום שבו הממשק קורא את הנתון.

KeyError אחרי איסוף ראשון

מה קרה:ניסינו להגדיל פריט שמעולם לא נוסף למילון.

כיוון לבדיקה:קוראים עם get ומגדירים ברירת מחדל: inventory[item] = inventory.get(item, 0) + 1.

הכמות יורדת מתחת לאפס

מה קרה:הקוד מחסיר יחידה בלי לבדוק מה הערך הנוכחי.

כיוון לבדיקה:מוסיפים תנאי שמאפשר שימוש רק כאשר get מחזיר מספר גדול מאפס.

שני שמות לאותו פריט

מה קרה:במקום אחד כתוב potion ובמקום אחר potions, ולכן נוצרים שני מפתחות.

כיוון לבדיקה:מרכזים שמות קבועים או מדפיסים את keys בזמן דיבאגינג כדי לזהות את הפיצול.

שלב מתקדם, לא נקודת פתיחה

כשהכמות כבר לא מספיקה: מילון בתוך מילון

במשחק גדול יותר, כל פריט עשוי להזדקק לכמות, לעוצמה ולתיאור. אפשר לשמור ערך שהוא בעצמו מילון. אבל כדאי להוסיף את השכבה הזו רק אחרי שהגרסה הפשוטה עובדת; מבנה עמוק יותר מאפשר יותר מידע וגם יוצר יותר מקומות לטעות בהם.

inventory = {
    "potion": {
        "amount": 3,
        "power": 20,
    }
}

healing = inventory["potion"]["power"]
תרגיל בנייה ובדיקה

מעבדת מלאי בארבע הרצות קצרות

לא צריך לבנות משחק שלם. קובץ פייתון אחד והדפסה אחרי כל פעולה מספיקים כדי לראות איך המצב משתנה.

  1. 1יוצרים מילון עם potion אחד ו-coin אחד, ומדפיסים אותו.
  2. 2כותבים פונקציית add_item שמוסיפה פריט קיים וגם פריט חדש.
  3. 3משתמשים פעמיים באותו potion ובודקים שהניסיון השני נכשל בצורה נשלטת.
  4. 4עוברים על items ומציגים רק פריטים שהכמות שלהם גדולה מאפס.

מילון טוב הוא מודל קטן של העולם במשחק

הוא לא רק מקצר קוד. הוא מחייב להחליט איך קוראים לכל דבר, איזה מידע שייך אליו ומה מותר לשנות. במסמכי הלימוד שסופקו לפרוגיקס מופיעים מבני נתונים מתקדמים בפייתון, ובהם מילונים, לצד תכנון אלגוריתם ופרויקטים. התוכן המדויק בכל מסלול עשוי להשתנות; התרגיל כאן עומד בפני עצמו ואפשר לבצע אותו בכל סביבת Python בסיסית.

ממשיכים ללולאת משחק