ב-Online
 
 
 
 
 
 
 
לפרק את הבייט 
מפרקים את שולה המוקשים 
 
 הקוד שמאחורי שולה המוקשים. צילומסך ועיבוד: עידו גנדל   
לפרק את הבייט |
 
עידו גנדל

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

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

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

אין מוקשים בלחיצה הראשונה - בכוונה

שולת מוקשים
 שולת מוקשים 
 צילום: פליקר, Bob Russell 
 
אחרי שכל המוקשים הוצבו במקומם, עוברים שוב על המערך וסופרים, עבור כל ריבוע ריק, כמה מוקשים יש סביבו. אם נניח שהקואורדינטות של הריבוע הנבדק הן (X, Y), עלינו לבדוק אם יש מוקש בקואורדינטות: (X-1, Y-1), (X, Y-1), (X+1, Y-1), (X-1, Y), (X+1, Y), (X-1, Y+1), (X, Y+1), (X+1, Y+1). ואם זה נראה לכם מכוער, תחשבו לכמה מכוער זה יכול להפוך כאשר תצטרכו להוסיף את כל התנאים המיוחדים עבור ריבועים שנמצאים על גבול המערך, ושבהם הפניה לריבוע "סמוך" עלולה לגרום לחריגה מגבולות המערך ולבאגים רציניים. הפתרון הקל ביותר הוא להוסיף "ריפוד" – שכבה נוספת של ריבועים ריקים, שאינם מוצגים לשחקן ואינם מקבלים מוקשים, אך משתתפים בספירה.

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

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

משחק פופולרי באפס זמן תכנות

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

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

בכתבה הבאה נדבר על נושא קרוב, ומעניין עוד יותר: האם ניתן לכתוב תוכנה שתשחק ב"שולה המוקשים" בהצלחה? ואם כן, איך? מדובר בבעיה לא טריוויאלית כלל, כפי שאפשר אולי לחשוב במבט ראשון. אתם מוזמנים לכתוב רעיונות והצעות בתגובות.
 
 
 
@@@@@@@@@@@@@@@@@@@ ilan @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 
@@@@@@@@@@@@@@@@@@@ ilan @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 
 
תגובות
הוסף תגובה0 תגובות
הוספת תגובה
מאת
 
נושא
 
תוכן
 
 
 
 
תודה! תגובתך התקבלה.
התגובה תתפרסם בכפוף לתנאי האתר.
 
 
 
 
 

כל הזכויות שמורות 2011 © נענע 10 בע"מ
 
 
 
 
כל הזכויות שמורות © Nana10 בע"מ
Video powered by