תכנות וזיהוי/מבוא לתכנות גרפי

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי

איך מתכנתים[עריכה]

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

איך מזהים[עריכה]

זיהוי טוב במשחק השח מט[עריכה]

זיהוי עמדה במשחק השח

הנה דוגמה מורכבת , המבהירה את תהליך הזיהוי :

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

אבל זה לא מספיק כדי להיות אלוף העולם, כי אפילו האדם תרגל המון, בגיל 40 כל מה שהוא יעשה לא יעזור לו להיות אלוף העולם,

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

טוב יותר בשח, אז מה הסיבה שכל אלופי העולם צעירים ?

התשובה לכך תמונה בתגלית של ראשון המדענים, לאונרדו דה וינצי :

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

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

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

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

לכן מה יעשה המבוגר המשתוקק להיות אלוף עולם בכל מחיר ?

אני מציע את התהליך הבא (ברפואת שיניים , או יותר מדויק בקלקול שיניים ) :

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

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

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

הסבר התמונה של זיהוי העמדה בשח[עריכה]

נניח שזוג שחקנים משחק מהיר על זמן - לכל שחקן דקה.

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

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

הוא מבזבז זמן יקר בניתוח אגף המלכה, סביר שאחר כך הוא יחשוב לאן להזיז את הפרש:

אולי קדימה ל - ה5 ? אבל אז הרץ השחור ב - ד5 יכה את הרגלי ליד המלך , ואם המלך יכה את הרץ,

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

לא נכון, כי אם הפרש יחזור להגן על המלך הוא גם יינצל וגם יגן על המלך.

אולי כדאי להזיז את הפרש אחורה ל - ה3 ? לא, כי אז הרגלי יתקדם עוד צעד אחד ושוב הפרש יותקף !

וכך הלבן חושב וחושב ומבזבז את זמנו.

כנראה המהלך הטוב ביותר של הלבן (המתקבל מזיהוי העמדה) להביא את הפרש ל - ה5 ולא לחשוב יותר מידי ,

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

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

בקיצור  : אם הלבן היה מזהה את העמדה במהירות , הוא היה

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

להרחבה: זיהוי עמדה במשחק שח אולימפי עיין בויקיפדיה נימצוביץ' - קפבלנקה .

סביבת העבודה[עריכה]

תכנות פונקציונלי[עריכה]

שיטת התכנות כאן בנויה על התכנות הפונקציונלי

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

אם נמצא שם המגדיר את פעולת השורות הללו .

למספר השורות הללו קוראים פונקציה משום

שבדרך כלל מספר השורות עובדות על נתון מסוים

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

אפשר להגדיר בצורה לא פורמלית פונקציה :

מכשיר שמקבל חומרי גלם כקלט , ומייצר תוצר. ולכן בתכנות

במקום השורות המגדירות פונקציה אפשר לדמות מכשיר .

חמש שיטות ספירה[עריכה]

כל מספר אפשר לכתוב בשיטה העשרונית, בבסיס 16 - השיטה ההקסדצימלית,

השיטה האוקטלית (בסיס 8) , ולפי בסיס 2(השיטה הבינארית), ולפי בסיס 256.

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

כוללת 10 מספרים, בשיטה ההקסדצימלית 16 מספרים , ובסיס 2 כולל 2 מספרים .

בטבלה הבאה אספור עד 20 בחמש השיטות עם קפיצה באמצע.

עשרונית 0 1 2 3 4 8 9 10 11 12 13 14 15 16 17 18 19 20
אוקטלית 0 1 2 3 4 10 11 12 13 14 15 16 17 20 21 22 23 24
בסיס 2 0 1 10 11 100 1000 1001 1010 1011 1100 1101 1110 1111 10000 10001 10010 10011 10100
הקצדסימלית 0 1 2 3 4 8 9 A B C D E F 10 11 12 13 14
בסיס 256 ° ¤ §

לכל שיטה שימושים שונים כמו בטבלה הבאה :

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

מערכת ההפעלה קבציה וספריותיה[עריכה]

מערכת ההפעלה היא חלונות, בה שמות הקבצים בנויים משלשה חלקים :

מספר החלק הוא משמש ל:
1 תחילית קביעת שם הקובץ
2 נקודה (.) להבדיל בין התחילית והסופית
3 סופית קביעת סוג הקובץ

בספר זה נשתמש בעיקר ב- 6 סוגי קבצים :

סודר סוג הקובץ סופית דוגמה הסבר
1 מקור CPP ScreenColor.cpp הקובץ משפת CPP ששמו ScreenColor מכיל פונקציות לצבע צג המחשב
2 כותרת h mmain.h הקובץ mmain המכיל את קבועי התוכנית
3 משאבים rc RRsrc.rc מכיל את הקישורים לתמונות לעזרת המהדר
4 תמונה bmp green.bmp קובץ המכיל תמונה שכתוב בה "ירוק" בתוך מסגרת
5 ריצה exe colors.exe כשמקליקים על שם הקובץ הזה פועלת התוכנית
6 טקסט txt ColorFile.txt אני משתמש בו לשמירה של נתונים מספריים

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

קבוצת הפונקציות הללו נקראות באנגלית WinAPI , מתוכם נשתמש בעיקר בפונקציות הנמצאות

בקבצים המשמשים כספריות : wingdi.h לשם גרפיקה ו - windows.h לפעולות על חלונות .

חלון ותמונת מפת סיביות[עריכה]

כל צבע אפשר להרכיב משלושה צבעים בסיסיים: אדום ירוק ו- כחול

בצג המחשב רואים תמונה אחת (הנקראת שולחן העבודה) המורכבת מתמונות משנה (הנקראות חלונות)

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

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

תמונת מפת הסיביות של חברת מיקרוסופט נקראת Bitmap .

בדוגמאות בהמשך אשתמש ב - Bitmap24 שבנוי משלשות של מספרים שלמים שגודלם נע בין 0 ל- 256 .

הגדרת משתנים ופונקציות[עריכה]

בשפת CPP הגדרת המשתנים והפונקציות דומה .

כותבים משמאל לימין אבל משמעות ההגדרה מובנת יותר אם קוראים ומתרגמים מימין לשמאל .

הגדרת משתנה בשם output מטיפוס (מסוג) מספר שלם (integer) :

 int  output;

הגדרת פונקציה בשם MyPixelColor המקבלת 3 משתני קלט ומחזירה משתנה מטיפוס מספר שלם  :

int MyPixelColor(HDC Myhdc  ,int ScreenLocateX, int ScreenLocateY) 
{ 
 int  output; // הגדר משתנה שתוכל להחזיר בו ערך מהפונקציה
... // עשה משהוא בתוך הפונקציה
return output ; // החזר את התוצאה
}