תוכן עניינים:

מהדורת מוקשים-פטל-פי-מהדורה: 7 שלבים (עם תמונות)
מהדורת מוקשים-פטל-פי-מהדורה: 7 שלבים (עם תמונות)

וִידֵאוֹ: מהדורת מוקשים-פטל-פי-מהדורה: 7 שלבים (עם תמונות)

וִידֵאוֹ: מהדורת מוקשים-פטל-פי-מהדורה: 7 שלבים (עם תמונות)
וִידֵאוֹ: ערוץ 2: כל הפתיחים של מהדורת החדשות, 1993-היום 2024, יולי
Anonim
שואב מוקשים-פטל-מהדורה
שואב מוקשים-פטל-מהדורה
שואב מוקשים-פטל-מהדורה
שואב מוקשים-פטל-מהדורה

פרויקט הגמר שלי לסדרת CSC 130 באוניברסיטת הטכנולוגיה של לואיזיאנה הוא מהדורת Minesweeper Raspberry Pi. בפרויקט זה, ביקשתי לשחזר את המשחק הקלאסי של מטאטא מוקשים על ידי שימוש בספריית Tkinter של שפת התכנות פייתון. הרשת שמשחק המוקשים מקיפה היא שמונה אריחים ברוחב וחמישה אריחים בגובה. עיצוב הפרויקט התאים והשתכלל לשימוש ב- Raspberry Pi המותקן עם Python 2.7.

ניתן להוריד את הקוד והתמונות לפרויקט הגמר של Minesweeper Raspberry Pi Edition בקישור הבא:

שואב מוקשים-פטל-מהדורה

אספקה

x1 פטל פטל

Python 2.7 מותקן ב- Raspberry Pi

Microsoft Powerpoint (או תוכנה אחרת ליצירת תמונות לכפתורים)

שלב 1: צור תמונות לחצן

צור תמונות כפתורים
צור תמונות כפתורים

הֶסבֵּר:

יהיה צורך ליצור כל כפתור המרכיב את ה- GUI. לצורך משימה זו השתמשתי ב- Microsoft Powerpoint כדי ליצור את התמונות שהייתי צריך להציג בכפתורים.

ראשית, יצרתי את עשרת לחצני האריחים הדרושים ליצירת רשת מטאטא המוקשים (ריק, בוב, אפס, אחד, שניים, שלושה, ארבעה, חמישה, שש, שבע ושמונה) באמצעות Microsoft Powerpoint.

שנית, הכנתי את ארבע התמונות הדרושות למסך התפריט (תצוגת תפריט, לחצן קושי קל, לחצן קושי בינוני וכפתור קושי קשה) באמצעות Microsoft Powerpoint.

שלישית, יצרתי את התמונה הדרושה לכפתור ההפעלה מחדש ואת התמונות הדרושות לשאר לחצני התצוגה השונים (תצוגת "משחק מעל", תצוגת "אתה מנצח" ותצוגת "כללים") באמצעות Microsoft Powerpoint.

רביעית, יהיה עליך לשנות את גודל התמונות שלך כך שיתאימו למסך שלך. עבור ה- Rasberry Pi שלי, השתמשתי במידות הבאות לחלון (בהתייחסות לפיקסלים באורך וברוחב): 432x576.

שלב 2: עיצוב תוכנית

תוכנית עיצוב
תוכנית עיצוב

הֶסבֵּר:

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

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

שלב 3: צור את GUI (תפריט ורשת מטאטא מוקשים)

צור את GUI (תפריט ורשת מטאטא מוקשים)
צור את GUI (תפריט ורשת מטאטא מוקשים)
צור את GUI (תפריט ורשת מטאטא מוקשים)
צור את GUI (תפריט ורשת מטאטא מוקשים)
צור את GUI (תפריט ורשת מטאטא מוקשים)
צור את GUI (תפריט ורשת מטאטא מוקשים)
צור את ממשק המשתמש (תפריט ורשת מטאטא מוקשים)
צור את ממשק המשתמש (תפריט ורשת מטאטא מוקשים)

הֶסבֵּר:

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

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

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

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

רביעית, נקה את ה- GUI של הכפתורים שנעשו בשיטת "setupMenu" על ידי ביצוע שיטת "clearMenu" (באמצעות הפונקציה button.destroy () במספר מופעים) וקרא לשיטת "clearMenu" בשיטת "תהליך" (תחת כל אחד מכפתורי הקושי נרשם לאחר הקצאת משתנה הקושי).

חמישית, רענן את GUI על ידי ביצוע שיטת "setSLASHresetGUI" (הלחצנים נעשים באותו אופן כמו בשיטת "setupMenu") וקרא לשיטת "setSLASHresetGUI" בשיטת "תהליך" (תחת כל אחד מכפתורי הקושי נרשם לאחר הקצאת הקצאת משתנים וקריאת שיטת "clearMenu").

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

שלב 4: הפוך את הלחצנים במסך בתוך המשחק לפעול

הפוך את הכפתורים במסך בתוך המשחק לפעול
הפוך את הכפתורים במסך בתוך המשחק לפעול
הפוך את הכפתורים במסך בתוך המשחק לפעול
הפוך את הכפתורים במסך בתוך המשחק לפעול
הפוך את הכפתורים במסך בתוך המשחק לפעול
הפוך את הכפתורים במסך בתוך המשחק לפעול
הפוך את הכפתורים במסך בתוך המשחק לפעול
הפוך את הכפתורים במסך בתוך המשחק לפעול

הֶסבֵּר:

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

ראשית, נכין שתי רשימות. תהיה רשימה שנקראת "רשת". רשימת "רשת" זו תכלול רק את המספרים השלמים 9 ו- 0. ברשימה זו תשע ייצגו פצצות, ואפסים ייצגו שאינם פצצות. כך התוכנית תבחין אם אריח הוא פצצה או לא. רשימה שנייה תיעשה, והיא תיקרא "סטטוס". רשימת "סטטוס" זו כוללת רק מחרוזות תווים אחת ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b" "). ברשימה זו, כל מחרוזת תווים תתאים לתמונה מסוימת. כך התוכנית תדע איזו תמונה להציג בכל כפתור ברשת מטאטא המכרות. לכל כפתור ברשת מטאטא המכרות יהיה אינדקס מתאים בכל רשימה על סמך מיקומו ברשת. האינדקס המתאים יוקצה על פי ההליך הבא (מספר לחצן - 1). לדוגמה, האינדקס המקביל של כפתור בכל רשימה הוא אינדקס אפס. לבסוף, שתי רשימות אלה יבוצעו לפני ביצוע המחלקה "MainGUI" ותיווצר מחוץ למחלקה "MainGUI". מחלקת "רשת" תיווצר כרשימה ריקה (grid = ) ורשימת "הסטטוס" תיווצר על ידי פונקציית טווח (הוספת ארבעים מחרוזות תווים בודדות של "n" לרשימת "סטטוס").

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

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

רביעית, למעשה ניכנס לאופן שבו הלחצנים הופכים לפעילים. כפי שצוין קודם לכן, הצהרות if-else מרובות ממוקמות בשיטת "התהליך" ומבצעות שיטות ושורות קוד מסוימות אחרות בהתאם למה שהכפתור שווה (הלחצן שווה לא משנה מה המחרוזת שנרשמה לאחרונה). בתוך הצהרות אלה אם-אחרת, הדברים הבאים יתרחשו לפי הסדר: אינדקס יוקצה ברחבי העולם, האינדקס המתאים ברשימת ה"סטטוס "יוקצה מחדש למחרוזת" b "(אם האינדקס המקביל של רשימת" הרשת "שווה המספר השלם תשע), תתבצע שיטת "פעולה" מקבילה (אם המדד המתאים של רשימת "הרשת" שווה לאפס המספר השלם), אותו אינדקס תואם ברשימת "הסטטוס" יוקצה מחדש למחרוזת השווה למשתנה "NumOfMines" (אם האינדקס המקביל של רשימת "הרשת" שווה לאפס המספר השלם), וה- GUI יתחדש על ידי קריאה לשיטת "setSLASHresetGUI".

שלב 5: שיטת "setDif קושי" ושיטת "הפעלה מחדש"

תמונה
תמונה
תמונה
תמונה

הֶסבֵּר:

לאחר מכן, יהיה צורך ליצור שיטת "setDifilie" ולחצן ההפעלה הממוקם בתחתית מסך המשחק יצטרך לפעול (על ידי יצירת שיטת "הפעלה מחדש" כדי שתוכל לבצע אותה כאשר המשתמש לוחץ עליה.).

ראשית, יש ליישם את שיטת "setDif קושי" בהצהרות אם-אחר של כפתורי הקושי בשיטת "תהליך" ובשיטת "הפעלה מחדש". שורות הקוד והשיטות המבוצעות בשיטה זו הן פשוטות למדי. בשיטת "setDif קושי" נצרף כמות מסוימת של אפסים (שאינם פצצות) ותשעות (פצצות) לרשימת "רשת" (באמצעות שתי פונקציות טווח בתוך כל הצהרת אם-אחר), ואז נערבב את רשימת "רשת" (עם פונקציית הדשדוש של הספרייה האקראית) בתוך שיטת "setDif קושי" (לאחר ביצוע הצהרות if-else). היחס בין אפסים לתשעים יקבע לפי איזו מחרוזת המשתנה "קושי" מוגדר ("קל": 34-6, "בינוני": 28-12, "קשה": 16-24).

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

שלב 6: תרחישי סיום משחק

תרחישים לסיום משחקים
תרחישים לסיום משחקים
תרחישים לסיום משחקים
תרחישים לסיום משחקים
תרחישים לסיום משחקים
תרחישים לסיום משחקים
תרחישים לסיום משחקים
תרחישים לסיום משחקים

הֶסבֵּר:

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

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

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

שלישית, תצוגת מסך המשחק תתעדכן בכל פעם שרענון ה- GUI יתבצע על ידי מעט מעט עריכות קלות בשיטת "setSLASHresetGUI". לאחר הגדרת הרשת של ממשק המשתמש, נציב שלוש הצהרות אם-אחרת במקום שבו מוקמת הקצאת כפתור התצוגה הנוכחית. אחד משלושת הצהרות אם-אחר יבוצע על סמך השווים של המשתנים הבאים: "GameOverDETECTOR", "קושי", "NumOfMinesLEFT" ו- "NumOfStartingTilesLEFT". כפי שאתה עשוי לתהות, המשתנה "GameOverDETECTOR" הוא חדש משתנה. משתנה זה ייווצר ממש לפני שהמשפטים אם-אחר יבוצעו בשיטת "setSLASHresetGUI". המשתנה "GameOverDETECTOR" יהיה שווה למספר השלם שנמצא באמצעות אלגוריתם שמוצא כמה אינדקסים בתוך "הרשת" רשימה הוקצו מחדש למספר התשיע ותשע (כיצד הכפתורים הופכים לחסרי תועלת). על סמך אשר מתקיימים התנאים של הצהרת if-else, תתבצע הקצאה מחדש לתצוגה.

שלב 7: הפעלת לחצן הפעלה מחדש

הפעלת לחצן הפעלה מחדש
הפעלת לחצן הפעלה מחדש

הֶסבֵּר:

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

ראשית ואחרונה, נבצע את שיטת "הפעלה מחדש" בשיטת "תהליך" עם משפט אם-אחר. אם המחרוזת "!" הוא רשום, ואז תתבצע שיטת "הפעלה מחדש". כמו כן, יהיה עלינו ליצור כפתור שנקרא הפעלה מחדש בסוף שיטת "setSLASHresetGUI" לפני שתכולת הרשת תיארז יחד. כפתור הפעלה מחדש זה יעבד את המחרוזת "!" (פקודה lambda: self.process ("!")) ובצע את שיטת "הפעלה מחדש" המתאימה בתוך שיטת "תהליך".

מוּמלָץ: