לדלג לתוכן

בונים וורדל משלכם בפייתון - הפרויקט הקטן שמלמד חשיבה לוגית אמיתית

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

מה המשחק בעצם דורש מכם לבנות

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

שלב ראשון - בוחרים מילה ומקימים את לולאת המשחק

מתחילים עם רשימת מילים קבועה ובוחרים מילה רנדומלית ממנה עם מודול ה-random. לולאת המשחק הבסיסית מבקשת ניחוש מהמשתמש, בודקת שהוא באורך הנכון, ומריצה את בדיקת ההתאמה עד שהמילה נוחשת נכון או שנגמרים הניסיונות (בדרך כלל שישה, כמו במקור):

import random

words = ["תפוח", "בננה", "ענבים"]
secret = random.choice(words)
attempts = 6

while attempts > 0:
    guess = input("נחשו מילה: ")
    if guess == secret:
        print("כל הכבוד, ניצחתם!")
        break
    attempts -= 1

זה עדיין לא משחק אמיתי - זה רק שלד. המשחק האמיתי מתחיל כשמוסיפים משוב על כל אות.

שלב שני - הלוגיקה שבאמת מלמדת משהו

כאן נכנס האתגר המעניין. עבור כל אות בניחוש צריך לבדוק שלושה מצבים: האם היא באותו מקום בדיוק כמו במילה הסודית (ירוק), האם היא קיימת במילה אבל במקום אחר (צהוב), או שהיא לא קיימת בכלל (אפור). הטעות הכי נפוצה כאן היא לבדוק "האם האות קיימת במילה" בצורה נאיבית עם in, בלי לשים לב למקרה של אותיות כפולות - למשל אם המילה הסודית מכילה אות אחת מסוג מסוים, אבל הניחוש מכיל אותה פעמיים. פתרון נכון דורש לספור כמה פעמים כל אות מופיעה, ולא רק לבדוק אם היא "נמצאת שם איפשהו".

def check_guess(guess, secret):
    result = []
    for i, letter in enumerate(guess):
        if letter == secret[i]:
            result.append("ירוק")
        elif letter in secret:
            result.append("צהוב")
        else:
            result.append("אפור")
    return result

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

שלב שלישי - הופכים את זה למשחק אמיתי

אחרי שהלוגיקה עובדת, אפשר להוסיף שכבות: לוודא שהמילה שהוקלדה בכלל קיימת ברשימת מילים חוקית (כדי שלא ינחשו "קקקקק"), להציג את התוצאה בצורה ויזואלית עם צבעים בטרמינל, לשמור רצף ניצחונות בין משחקים, או אפילו להוסיף רמת קושי עם מילים ארוכות יותר. כל תוספת כזו היא הזדמנות ללמוד נושא חדש - קריאה מקובץ, עבודה עם מילונים, או פורמט טקסט.

למה דווקא הפרויקט הזה שווה יותר ממה שנראה

משחקי ניחוש מכריחים אתכם להתמודד עם קצוות (edge cases) - מה קורה אם המשתמש מקליד אורך לא נכון, אותיות לא בעברית, או משהו ריק. זו בדיוק החשיבה שמפרידה בין קוד ש"עובד פעם אחת" לקוד שבאמת עמיד. וזה בדיוק סוג התרגול שאנחנו דוחפים אליו את התלמידים בקורס תכנות בסיסי החינמי שלנו - לא רק לפתור את המקרה הקל, אלא לחשוב מה עלול להשתבש.

מה מקבלים בסוף

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

הצטרפו לקהילה בדיסקורד