מירי
כיתה ט · תכנות בפייתון

מתכננים תוכנית מרעיון למשחק שעובד

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

1

הרעיון

כל פרויקט, קטן או גדול, עובר את אותם שלבים:

  1. מטרה
  2. קלט ופלט
  3. פירוק לפונקציות
  4. כתיבה
  5. בדיקה
  6. שיפור

מטרה, קלט ופלט

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

מפרקים לפונקציות

כל משימה קטנה מקבלת פונקציה עם שם ברור. למשל check(guess, secret) מחזירה רק את התשובה. כך אפשר לבדוק כל חלק לבד.

בודקים ומשפרים

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

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

מעבדה: משחק הניחוש

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

נסו את אלה:

הריצו בעצמכם

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

3

טעויות שכולם עושים

שוכחים את int

input() תמיד מחזיר מחרוזת. השוואה בין מחרוזת למספר עם < עוצרת את התוכנית בשגיאה.

✗ לא נכון

guess = input()
if guess < secret:
# TypeError

✓ נכון

guess = int(input())
if guess < secret:

לולאה שלא נגמרת

אם שוכחים לקדם את המונה, התנאי של while נשאר נכון לתמיד, והמשחק לא נגמר.

✗ לא נכון

while tries < max_tries:
    guess = int(input())

✓ נכון

while tries < max_tries:
    guess = int(input())
    tries = tries + 1

print במקום return

פונקציה שרק מדפיסה לא מחזירה כלום (None). הקוד שקרא לה לא יכול לבדוק את התשובה.

✗ לא נכון

def check(guess, secret):
    if guess == secret:
        print("correct")

✓ נכון

def check(guess, secret):
    if guess == secret:
        return "correct"

בודקים רק מקרה אחד

התוכנית עבדה עם 50? זה לא מספיק. בדקו ניחוש נמוך, גבוה, מדויק, ואת הקצוות 1 ו-100.

✗ לא מספיק

print(check(50, 50))

✓ טוב

print(check(10, 50))
print(check(90, 50))
print(check(50, 50))
4

דוגמה פתורה: מתכננים את המשחק

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

  1. מטרה
  2. קלט ופלט
  3. פירוק לפונקציות
  4. כתיבה
  5. בדיקה
  6. שיפור
5

תרגול

6

שאלות שכולם שואלים

איך מתחילים לתכנן תוכנית בפייתון?

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

למה לפרק תוכנית לפונקציות?

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

מה האסטרטגיה הכי טובה במשחק ניחוש מספרים?

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