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

משחק טיימינג תחרותי מול 2 שחקנים: 4 שלבים
משחק טיימינג תחרותי מול 2 שחקנים: 4 שלבים

וִידֵאוֹ: משחק טיימינג תחרותי מול 2 שחקנים: 4 שלבים

וִידֵאוֹ: משחק טיימינג תחרותי מול 2 שחקנים: 4 שלבים
וִידֵאוֹ: אף אחד לא יודע שאני בעצם זומבי.. ?! 2024, נוֹבֶמבֶּר
Anonim
משחק עיתוי תחרותי מול 2 שחקנים
משחק עיתוי תחרותי מול 2 שחקנים

אתה תצטרך:

1. Basil 3, לוח FPGA (או כל FPGA אחר)

2. גירסה עדכנית יחסית של Vivado, או סביבת VHDL אחרת

3. מחשב שיכול להריץ את התוכנית המוזכרת.

שלב 1: המשחק עצמו

המשחק עצמו
המשחק עצמו

כיצד FSM מתקשר עם המודולים.

איך לשחק

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

שלב 2: FSM

FSM
FSM
FSM
FSM
FSM
FSM
FSM
FSM

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

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

מצב 2: תורו של השחקן הראשון

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

מצב 3: ניכוי שחקן אחד האות עם כמות הפעילים של LED קובע את כמות הבריאות שמקבלת ניכוי. זה נעשה על ידי כך שיש לו עוד ריסט משמרת (deductor1.vhd) שבמקום להגדיל את נוריות הלדים, מפחית אותן. זה יורד בקצה העולה של אחד ממודולי div השעון שלווה ושנינו (downcounterclock.vhd). בדיוק כאשר נורית אחת כבויה, נקודת בריאות אחת מנוכה מכל הבריאות הכוללת של השחקן השני. אם במהלך תהליך זה שחקן שני מגיע ל -0 בריאות, אנו עוצרים ומיד עוברים למצב "משחק נגמר". אחרת, ברגע שווקטור ה- LED יגיע ל "0000000000000000", אנו עוברים לתורו של השחקן השני.

מצב 4: תורו של שחקן שני תורו של שחקן שני הוא בדיוק כמו תורו של שחקן אחד, למעט רישום המשמרות עבורו (Ptwo.bhd) עובר משמאל לימין, והמתג נמצא בצד ימין של הלוח. אות מופעל כדי להציג את תצוגת הבריאות של השחקן 1. ברגע שהמתג 2 פעיל, זה עובר לסיבוב הניכוי של שחקן שני.

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

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

שלב 3: מודולים

מודולים
מודולים

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

שעון למטה (מבוסס על מודול clk_div.vhd מאת בריאן מיילי):

זהו השעון המטפל בתזמון של הניכויים. הקבוע בשם max_count הוא פי 3 יותר מהקבוע max_count של barclock. זה יהפוך את המנחים לאט פי 3 ממהירות המוט.

Barclock - (מבוסס על מודול clk_div.vhd מאת בריאן מיילי):

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

לֶחֶם תִירָס:

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

Ptwo:

זוהי גרסה הפוכה של מודול P1.

מנכה 1:

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

Deductor2: זוהי גרסה הפוכה של מודול Deductor1.

PlayDecoder (שאול ושונה ללא ספק מ- ekchen35649 133 שלו ניתן להנחיה): זה משמש במצב התפריט כדי להציג את המילה "PLAY" על מפענח שבעת הקטע.

שלב 4: בדוק

המשחק הזה נוצר במקור בהשראת אחד ממשחקי המיני מקירבי. זהו משחק פשוט לשני שחקנים שניתן לשחק עליו על לוח Basys 3, או כל FPGA.

שלב 1: חומרים נדרשים

תזדקק ל: Digilent Basys 3, FPGA Board (או כל אחר) גירסה עדכנית יחסית של Vivado, או סביבת vhdl אחרת מחשב שיכול להריץ את התוכנית המוזכרת A brain

שלב 2: המשחק עצמו

איך לשחק

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

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

שלב 3: FSM

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

(תרשים המדינה)

מצב 1: תפריט

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

מצב 2: תורו של השחקן הראשון

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

מדינה 3: ניכוי שחקן אחד

האות עם כמות הפעילים של LED קובע את כמות הבריאות שמקבלת ניכוי. זה נעשה על ידי כך שיש לו עוד ריסט משמרת (deductor1.vhd) שבמקום להגדיל את נוריות הלדים, מפחית אותן. זה יורד בקצה העולה של אחד ממודולי ה- div השעון שלוונו ושינינו (downcounterclock.vhd). בדיוק כאשר נורית אחת כבויה, נקודת בריאות אחת מנוכה מכל הבריאות הכוללת של השחקן השני. אם במהלך תהליך זה שחקן שני מגיע ל -0 בריאות, אנו עוצרים ומיד עוברים למצב "משחק נגמר". אחרת, ברגע שווקטור ה- LED יגיע ל "0000000000000000", אנו עוברים לתורו של השחקן השני.

מצב 4: תורו של שחקן שני

תורו של שחקן שני הוא בדיוק כמו תורו של שחקן אחד, למעט רשימת המשמרות עבורו (Ptwo.bhd) עוברת משמאל לימין, והמתג נמצא בצד ימין של הלוח. אות מופעל כדי להציג את תצוגת הבריאות של השחקן 1. ברגע שהמתג 2 פעיל, זה עובר לסיבוב הניכוי של שחקן שני.

שלב 5: ניכוי שחקן שני

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

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

קופסה שחורה

שלב 4: מודולים

שעון למטה (מבוסס על מודול clk_div.vhd מאת בריאן מיילי):

זהו השעון המטפל בתזמון של הניכויים. הקבוע בשם max_count הוא פי 3 יותר מהקבוע max_count של barclock. זה יהפוך את המנחים לאט פי 3 ממהירות המוט.

Barclock - (מבוסס על מודול clk_div.vhd של בריאן מיילי): שעון זה מטפל בתזמון של מדי הכוח, אותם ביצענו תוספת במהירות כדי להוסיף קושי למשחק. ניתן להתאים תזמון זה לטעמך, להגדיל את המהירות על ידי הפיכת המספר המקסימלי לקבוע למספר גדול יותר, או הפחתתו על ידי הפיכת מקסימום_ספר למספר קטן יותר. Sseg_dec - (נכתב על ידי בריאן מיילי): מודול זה לוקח מספר 8 סיביות כקלט, אותו הוא מפענח, ממיר את המספר למקבילה העשרונית שלו ולאחר מכן פלט לתצוגת שבעה המגזרים. כדי שהקובץ הזה יעבוד, עליך לוודא שהאילוצים שלך תואמים את שלנו.

Pone: זהו רישום משמרות המזיז סיביות שמאלה, ומוסיף ביט חם אחד כדי שייראה כאילו מד הכוח גדל. כאשר כל הסיביות חמות, כל הסיביות מתאפסות ל- '0', והמחזור מתחיל מחדש.

Ptwo: זוהי גרסה הפוכה של מודול P1.

Deductor1: זהו שילוב של רישום משמרות וחסר. פנקס המשמרות הולך בכיוון ההפוך מרשם המשמרות של P1, מה שמעיד על ניכוי. זה גם מפחית 1 מבריאותו של שחקן 2 לכל מחזור שעון, כך שבשילוב של שתי הפונקציות הללו, ייראה כי בריאותו של היריב יורדת ב -1 עבור כל מדורגל של סרגל הבריאות שיורד.

Deductor2: זוהי גרסה הפוכה של מודול Deductor1.

PlayDecoder (שאול ושונה מעט מ- ekchen35649 133 שלו להוראה):

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

לעשות: תמונות, וידאו

מוּמלָץ: