היום נלמד את פנים המשחק של טטריס שנכתב מתחת לרציף arduino ומטריקס LED.
מחבר המוצר הביתי הזה הוא AlexGyver, מחבר ערוץ היוטיוב באותו שם. ברוך הבא לעולם הנפלא של הפיקסלים המרובעים.
נתחיל בסיפור. טטריס הוא משחק בו דמויות המורכבות מ -4 ריבועים נופלים מלמעלה למטה. בשילובים שונים ניתן לסובב צורות אלה ולהעביר שמאלה וימינה. מטרת המשחק היא לאסוף רמות אופקיות שמוסרות ונקודות מוענקות לך. ההפסד נחשב לרגע בו הדמות החדשה אין לאן ליפול. את טטריס הומצא על ידי המתכנת הסובייטי אלכסיי לאונידוביץ 'פז'יטנוב.
גרסת הפסקל המקורית הופיעה ב- 6 ביוני 1984. מאז, טטריס עשתה דרך ארוכה והיא הועברה לכל הפלטפורמות עליהן ניתן בדרך כלל לשחק משחקים, כמו גם למכשירים שלא מיועדים כלל למשחקים, כמו מחשבון הנדסי, אוסצילוסקופ, ולא תאמינו, מגהץ.
על פי מספר הגרסאות המסחריות שנמכרו, טטריס עדיפה על כל משחק אחר בתולדות האנושות. עבור משחק אחד בלבד, נמכרו 35 מיליון עותקים, שלא לדבר על משחק הבריקים הנייד, שהיה כמעט לכולם בפעם אחת.
נתחיל ביישום טטריס על ארדואינו ומטריצה צבעונית בעזרת ניתוח "קביים". המטריצה מורכבת מנורות LED של שלושה צבעים. הבעיה עם סוג זה של מטריצה היא שהיא קרירה מדי. הצבע של כל פיקסל מקודד 24 סיביות, כלומר 8 סיביות לכל רכיב: אדום, ירוק וכחול. אין סוג כזה של נתונים על arduino, יש את הדברים הבאים - 32 ביטים.
יש לאחסן את הצבעים של כל נוריות ה- LED RAM, מכיוון שנשנה אותם. וזה, עבור מטריצה של 16 על 16, יש לנו בדיוק 1 קילוגרם של זיכרון דינמי תפוס, ולארדואינו ננו יש רק 2 כאלה.
הוסף עוד כמה ספריות והתחל לכתוב קוד, הזיכרון יסתיים. המחבר בעצם לא משתמש, למשל, במגה ארדואינו, שם יש יותר זיכרון. המטרה היא לייצר את המשחק באופן ספציפי על ארדואינו ננו, באמצעות כלים פשוטים, סטנדרטיים וידועים, אך יחד עם זאת גישות ו"קביים "לא סטנדרטיים ובעזרתם להשיג את הקוד האופטימלי ביותר.
"הקב" הראשון יהיה הסירוב לאחסן בנפרד בזיכרון את עמדות הדמויות ובכלל את כל מה שקורה על המסך.עלינו לאחסן את הקואורדינטות של הנקודות של דמות ההזנה ואת הקואורדינטות של הנקודות של הדמויות שכבר נשמטו, כלומר, כמקסימום, אנו זקוקים למערך אחד נוסף, דו ממדי 16 על 16, וזה ככל 256 בתים.
יש לך ולנו מערך של צבעים לכל הפיקסלים, בוא נשתמש בזה. אכן, בנוסף לעובדה שנוכל לשים נקודה צבעונית על המטריצה, אנו יכולים למדוד את האור של נקודה קיימת כך שנעבוד עם צבעים.
טטריס מתחיל בלוק נפילה, הנשלט על ידי כפתורים ויש לו 2 קואורדינטות במערכת קואורדינטות המטריצה. זה פשוט מאוד, אנו בונים טיימר, לפיו הבלוק ייפול. זו הספרייה של הכותב, תוכלו לקרוא באתר.
כדי לעבד כפתורים, המחבר משתמש גם בספריה שלו. מערך החיבור של הכפתורים פשוט עד כדי גיחוך: 4 כפתורים, 8 חוטים.
בכל שלב של הטיימר, אנו מציירים נקודה פיקסל מתחת לזו הישנה, ומציירים את הנקודה הישנה בשחור, כלומר כבו את הנורית. בלחיצה על הכפתור אנו עושים זאת, אך עם קואורדינטה אופקית. ובכן, למען הגינות, נגביל את גודל המטריצה כך שהנקודה לא תחרוג מהתחום.
ראה, שום דבר מסובך. אבל זה לא לאורך זמן כי הגיע הזמן לצייר דמויות. נעבוד כך: נשמור על ההתייחסות לנקודת האספקה, שכבר כתבנו, נקרא לה הנקודה העיקרית או החסימה הראשית. החסימה הראשית נעה במערכת קואורדינטות המטריצות, כבר עשינו זאת. כל הדמויות של טטריס מורכבות מארבע בלוקים, וזו הסיבה, אגב, היא נקראת טטריס.
בהתאם, נותר לנו לסיים להוסיף עוד 3 בלוקים לבלוק הראשי. בואו נכתוב את הקואורדינטות שלהם במערכת הקואורדינטות של החסימה הראשית, כך שהבלוק הראשי נמצא תמיד מתחת. זה פשוט מאוד, קח את הדמות של האות ההפוכה. החסימה הראשית מלמטה למרכז מכילה קואורדינטות 0.0 במערכת הקואורדינטות שלה.
החסימה העליונה היא 0.1, הימנית היא 1.1 והשמאלית -1.1.
קח את האות G. החסימה התחתונה היא 0.0, 0.1 הבאה, 0.2 הבאה, וקצה האות 1.2.
אנו כותבים את התיאום הללו למערך בצורה הבאה: {0.1, 0.2, 1.2} ומשחררים את המערך לזיכרון הבזק כדי לא לבזבז זיכרון דינמי. באשר לסיבוב הדמויות. אי אפשר לסובב את הדמויות. זה קרני מאוד קשה להסביר למיקרו-בקר כיצד לעשות זאת. לשם כך עליכם להגדיר את מרכז הסיבוב, איכשהו לפרק את הדמות לחלקים ולחפש קואורדינטות חדשות עבור כל חלק, תוך התחשבות בפיקסלציה חזקה, מה שברור שיוביל לשגיאות וזה יתברר שטויות. הבעיה נפתרת בפשטות רבה, אנו נשמור בזיכרון את כל 4 העמדות עבור כל הדמויות והכול.
למעשה, כעת נותר לבחור באקראי את מספר הדמות ולצייר אותו סביב הגוש הנופל. כאן, עבור כל 3 הבלוקים שנותרו, אנו לוקחים את הקואורדינטות מזיכרון הפלאש, מתרגמים אותם לקואורדינטות הגלובליות של המטריצה ומדליקים את נוריות הלד. אגב, הצבע נבחר גם באופן אקראי מתוך 6 הצבעים הפשוטים והבהירים ביותר של חלל ה- rgb. זווית הסיבוב של הדמות בתחילת הסיבוב נקבעת גם באופן אקראי, וכשאתה לוחץ על הכפתור כלפי מעלה, פשוט קח את קבוצת הקואורדינטות הבאה כדי לצייר ולסובב אותה עם כיוון השעון. העברת צורה עובדת אותו דבר. ראשית, אנו מוחקים את הדמות במיקום הקודם, כלומר, מציירים אותה בשחור, ואז במיקום החדש מציירים את הצבע הנוכחי של הדמות. כשמסתובבים, שוב, אנו מוחקים את העמדה הישנה ופשוט מציירים עמדה חדשה.
ניתן להוריד קושחה בכתובת. ננתח רק את המהות. נתחיל בבדיקת הקירות השמאלי והימני והתחתית. הכל מאוד פשוט עם החלק התחתון, אנו מסתכלים על כל שלב של הנפילה, האם יחידת הבסיס הגיעה לגובה 0, זה לא קשה, אבל בכל פעם שאנחנו לוחצים על כפתור הבקרה, עלינו לבדוק אם נקודת הקיצון של צורת דפנות הצד של המטריקס נגעה.
אם נגעו בה, אל תזיזו את הדמות. כנ"ל לסיבוב הדמויות. לדוגמה, אם המיקום החדש של הדמות משתרע מעבר לקירות, אזי הסיבוב אסור, ומכיוון שכל הדמויות שיש לנו יש צורות שונות, אז הבלוקים הקיצוניים עבורם כולם שונים. ניתן יהיה לצבוע בלוקים קיצוניים בודדים עבור כל דמות על מנת לפשט את עבודתו של המיקרו-בקר, אך ניתן לשקול שהם המציאו אותה לשם כך.
הכל פשוט מאוד. אבל המשימה הבאה מעניינת הרבה יותר. עלינו לבדוק אם התנגשויות עם בלוקים שכבר נמצאים מתחת.אם היה לנו מערך שמכיל את המצב של כל התאים בשדה, זה היה קל יותר, אך נשתמש במערך צבעים עבור פיקסלים של הקלטת, כך שיהיה לנו "הקב" המגניב ביותר. מה הבעיה בפועל. הכל נראה פשוט, דמות ירוקה תיפול, וכל צעד בנפילה, כל מעבר לצד וכל ניסיון לפנות צריך לבדוק אם הדמות במיקום החדש נשענת על הדמויות שכבר שכבו. אם עבור כל החוסמים הצבע שמסביב שווה לשחור או שווה לצבע הדמות, אז אנו מאפשרים תנועה בכיוון הרצוי. זה יעבוד עד שהצורה שמתחתינו זהה לצבע הנופל. זהו למעשה "הקב": אנו נצבע מחדש את הצורה שנפלה בצבע אחר. צייר מחדש באופן בלתי מורגש לעיניים, אך מורגש בתוכנית. כל שעליך לעשות הוא להגדיל מעט את בהירות הצבע הנוכחי של הצורה וזה הכל.
הדמות נפלה על הקרקעית או דמות אחרת, בהירותה לא עלתה בצורה ניכרת, ובסבב החדש הדמויות הנופלות כבר לא יבלבלו את צבעה עם שלהן, הן ייפלו עליה ובאותה מידה קבועות, מעט מוסיפות בהירות.
אגב, כשלוחצים על הכפתור כלפי מטה, הדמות נופלת במהירות גבוהה ותופסת את מקומה.
הטטריס שלנו נותר עם הנגיעה הסופית, כלומר בדיקה ופינוי אופקי של הרמות המלאות. הכל פשוט כאן. לאחר תיקון הדמות בסיבוב הנוכחי, אנו נעים לאורך הקווים ומשווים בין צבעי הפיקסלים לשחור. אם אין פיקסל שחור אחד בשורה כולה, אנו ננקה את כל הקו.
הקווים שזוהו מלאים בלבן ואז בהירות יורדת בהדרגה לאפס וההנפשה מתקבלת. יתר על כן, כל הפיקסלים, החל מהשורה הממלאת הראשונה למעלה, מועברים על ידי ומספר השורות שנמחקו. תהליך זה חוזר על עצמו עד שאין רמות שהושלמו. אנו בודקים גם אם הגענו לפסגה, שמשמעותה הפסד. במקרה זה, מוצג חשבון השווה למספר הרמות שנמחקו.
החשבון מוצג במספרים, המאוחסנים בזיכרון כערך של אפסים ואפסים, שבאמצעותם נדלקים ונכבים נוריות LED. כך נראה טטריס שנכתבה במטריצת הכתובות. תודה על תשומת הלב. נתראה בקרוב!
וידאו: