מתכנתים לא מתחילים להקליד מיד. קודם מחליטים מה התוכנית צריכה לעשות, מפרקים אותה לחלקים קטנים, ורק אז כותבים ובודקים. כאן בונים יחד משחק ניחוש מספרים, צעד אחרי צעד. נשתמש בפונקציות, בלולאת while ובתנאים, ובטריק החצייה מחיפוש בינארי.
כל פרויקט, קטן או גדול, עובר את אותם שלבים:
כותבים במשפט אחד מה התוכנית עושה: "המחשב בוחר מספר בין 1 ל-100, והשחקן מנחש". אחר כך מחליטים מה נכנס (ניחוש) ומה יוצא (גבוה יותר, נמוך יותר, צדקת).
כל משימה קטנה מקבלת פונקציה עם שם ברור. למשל check(guess, secret) מחזירה רק את התשובה. כך אפשר לבדוק כל חלק לבד.
מריצים עם כמה מקרים: ניחוש נמוך, גבוה, מדויק, ומקרי קצה כמו 1 ו-100. כשהכול עובד מוסיפים שיפור קטן אחד, למשל הגבלה על מספר הניסיונות.
בחרו את המספר הסודי ואת מספר הניסיונות. השחקן במעבדה משחק חכם: הוא תמיד מנחש את האמצע של מה שנשאר, כמו בחיפוש בינארי. הניחושים שלו הם הקלט של התוכנית. הריצו שורה אחרי שורה וראו איך הקפיצה לפונקציה check עובדת.
נסו את אלה:
אפשר לשנות את הקוד ולהריץ פייתון אמיתי. בפעם הראשונה הטעינה לוקחת כמה שניות. בתיבה השנייה יש את הניחושים, ניחוש בכל שורה, ואפשר לשנות גם אותם.
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פונקציה שרק מדפיסה לא מחזירה כלום (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))עוברים יחד על כל שלבי התכנון. בכל שלב רואים מה החלטנו ואיזה קוד נוסף.
כותבים במשפט אחד מה התוכנית עושה, ואז מחליטים מה הקלט ומה הפלט. אחר כך מפרקים את העבודה למשימות קטנות, וכל משימה הופכת לפונקציה. רק אז מתחילים לכתוב, חלק אחרי חלק, ובודקים כל חלק לבד. ראו בדוגמה הפתורה.
פונקציה קטנה עם שם ברור קל להבין ולבדוק. אם יש טעות, יודעים איפה לחפש. אפשר גם להשתמש באותה פונקציה בכמה מקומות, ולשפר אותה בלי לגעת בשאר התוכנית.
לנחש תמיד את האמצע של הטווח שנשאר. אם התשובה היא "גבוה יותר", זורקים את החצי התחתון, ולהפך. כך בין 1 ל-100 מוצאים כל מספר בלא יותר מ-7 ניחושים. נסו במעבדה.