Inhoudsopgave:

Competitief vs-timingspel voor 2 spelers - Ajarnpa
Competitief vs-timingspel voor 2 spelers - Ajarnpa

Video: Competitief vs-timingspel voor 2 spelers - Ajarnpa

Video: Competitief vs-timingspel voor 2 spelers - Ajarnpa
Video: Wingspan TOURNAMENT Strategy Chat With the 2 Player Wingspan Winner 2021 2024, Juli-
Anonim
Competitief vs-timingspel voor 2 spelers
Competitief vs-timingspel voor 2 spelers

Je zal nodig hebben:

1. Digilent Basys 3, FPGA-bord (of een andere FPGA,)

2. Een relatief up-to-date versie van Vivado, of een andere VHDL-omgeving

3. Een computer die het genoemde programma kan draaien.

Stap 1: Het spel zelf

Het spel zelf
Het spel zelf

Hoe de FSM omgaat met de modules.

Hoe te spelen

Om te beginnen, druk je op de middelste knop. Dit zorgt ervoor dat "99", dat de gezondheid van speler twee vertegenwoordigt, wordt weergegeven op het display met zeven segmenten. Vervolgens zullen de LED's achtereenvolgens van rechts naar links oplichten. Dit vormt een powerbar. Zodra de powerbar vol is, wordt deze gereset. Het doel van speler één is om de schakelaar om te draaien wanneer de lat zo hoog mogelijk ligt. Hoe meer LED's branden, hoe meer schade speler één aan speler twee toebrengt. Nadat speler één zijn schakelaar heeft omgedraaid, wordt de toegebrachte schade afgetrokken van de gezondheid van speler twee. Daarna gaat het over naar de beurt van speler twee. Nu staat het weergegeven getal voor de gezondheid van speler en wordt de krachtbalk van links naar rechts gevuld. Zodra speler twee zijn zet doet, wordt de schade afgetrokken en is speler één weer aan de beurt. Dit herhaalt zich totdat een speler 0 gezondheid bereikt. Video van deze werking is bijgevoegd.

Stap 2: FSM

FSM
FSM
FSM
FSM
FSM
FSM
FSM
FSM

Deze game is in wezen één grote eindige-toestandsmachine, waarbij een complexe logica plaatsvindt op basis van de staat waarin de FSM zich bevindt.

Status 1: MenuDe eerste status is het menuscherm, dat een van de eenvoudigere statussen is. Het bevat het display met zeven segmenten met het woord "PLAY" en de knop die ervoor zorgt dat het spel begint. De knop, BTN, leidt ons naar de volgende staat, dat is de beurt van speler.

Toestand 2: Speler Een is aan de beurt

De beurt van speler één activeert een signaal dat ervoor zorgt dat het scherm met zeven segmenten de gezondheid van speler twee weergeeft. Een ander signaal gaat aan om een schuifregister te activeren dat is geïmporteerd uit een andere module die we hebben gemaakt (Pone.vhd). Dit schuifregister laat de LED's oplichten zoals een toenemende vermogensmeter zou doen in andere games, en het zou dan worden gereset naar 0 wanneer het maximale aantal LED's bereikt dat kan worden verlicht. Het wordt bijgewerkt op de stijgende flank van de klok verkregen uit barclock.vhd, die is gewijzigd vanuit een geleend lab-bestand. We lieten de balk van speler één van rechts beginnen en naar links vullen, omdat de schakelaar van speler één ook aan de linkerkant zit (voor een intuïtieve gebruikerservaring). Zodra de schakelaar is omgedraaid, gaat de status verder naar speler één aftrek, en het aantal actieve LED's wordt opgeslagen in een signaal.

Toestand 3: Speler Een aftrek Het signaal met het aantal LED's actief bepaalt de hoeveelheid gezondheid die wordt afgetrokken. Dit wordt gedaan door een ander schuifregister (deductor1.vhd) te hebben dat de LED's niet verhoogt, maar verlaagt. Dit neemt af op de stijgende flank van een van de clock div-modules die we hebben geleend en aangepast (downcounterclock.vhd). Op het moment dat één LED uitgaat, wordt één gezondheidspunt afgetrokken van de totale gezondheid van speler twee. Als tijdens dit proces speler twee 0 gezondheid bereikt, stoppen we en gaan we onmiddellijk verder naar de "Game over"-status. Anders, zodra de LED-vector "000000000000000000" bereikt, gaan we verder met de beurt van speler twee.

Toestand 4: De beurt van speler twee De beurt van speler twee is precies zoals die van speler één, behalve dat het schuifregister ervoor (Ptwo.bhd) van links naar rechts gaat en de schakelaar zich aan de rechterkant van het bord bevindt. Er wordt een signaal geactiveerd om de gezondheidsweergave van speler 1 te krijgen. Zodra schakelaar 2 actief is, gaat dit verder naar de aftrekbeurt van speler twee.

Fase 5: Speler twee aftrekken Net als de beurt van speler twee, gedraagt speler twee aftrekken zich net zoals speler één aftrek. Het belangrijkste verschil is dat het schuifregister dat het uitschakelen van de LED's regelt, in de tegenovergestelde richting gaat, wat een gemakkelijke wijziging is die je kunt maken als je eenmaal de aftrek van de speler goed hebt laten werken.

Fase 6: Game Over Als een van de spelers op enig moment nul gezondheid bereikt, schakelt het spel over naar deze status. Niets bijzonders wordt weergegeven. Als BTN één wordt ingedrukt, wordt de gezondheid gereset naar 99 en gaat de status terug naar het menu, waardoor het spel in feite opnieuw begint.

Stap 3: Modules

Modules
Modules

Black Box-diagram voor spel

Downcounterclock (gebaseerd op clk_div.vhd module door Bryan Mealy):

Dit is de klok die de timing van de deductoren afhandelt. De constante genaamd max_count is 3x meer dan de max_count constante van barclock. Hierdoor zullen de deductoren 3x langzamer zijn dan de snelheid van de balk.

Barclock - (gebaseerd op clk_div.vhd module door Bryan Mealy):

Deze klok regelt de timing van de vermogensmeters, die we snel hebben verhoogd om het spel moeilijker te maken. Deze timing kan naar wens worden aangepast door de snelheid te verhogen door de constante max_count een groter getal te maken, of te verlagen door max_count een kleiner getal te maken. Sseg_dec - (geschreven door Bryan Mealy): Deze module neemt een 8-bits getal als invoer, dat het decodeert, het getal omzet in zijn decimale equivalent en vervolgens uitvoert naar het zevensegmentendisplay. Om dit bestand te laten werken, moet u ervoor zorgen dat uw beperkingen overeenkomen met de onze.

Poon:

Dit is een schuifregister dat bits naar links verschuift, waarbij een hot bit wordt toegevoegd om het te laten lijken alsof de vermogensmeter toeneemt. Wanneer alle bits warm zijn, worden alle bits gereset naar '0' en begint de cyclus opnieuw.

twee:

Dit is een omgedraaide versie van de P1-module.

Afleider1:

Dit is een combinatie van een schuifregister en een aftrekker. Het schuifregister gaat in de tegenovergestelde richting van het schuifregister van P1, wat een aftrek aangeeft. Dit trekt ook 1 af van de gezondheid van speler 2 voor elke klokcyclus, dus met de combinatie van deze twee functies zal het lijken alsof de gezondheid van de tegenstander met 1 afneemt voor elke led van de gezondheidsbalk die naar beneden gaat.

Deductor2: Dit is een omgedraaide versie van de Deductor1-module.

PlayDecoder (geleend en langzaam gewijzigd van ekchen35649 zijn 133 instructable): Dit wordt gebruikt in de menustatus om het woord "PLAY" weer te geven op de decoder met zeven segmenten.

Stap 4: Testen

Deze game is oorspronkelijk geïnspireerd op een van de minigames van Kirby. Het is een eenvoudig spel voor twee spelers dat op een Basys 3-bord of een FPGA kan worden gespeeld.

Stap 1: Benodigde materialen

Je hebt nodig: Digilent Basys 3, FPGA Board (of een ander) Een relatief up-to-date versie van Vivado of een andere vhdl-omgeving Een computer die het genoemde programma kan draaien Een brein

Stap 2: Het spel zelf

Hoe te spelen

Om te beginnen, druk je op de middelste knop. Dit zorgt ervoor dat "99", dat de gezondheid van speler twee vertegenwoordigt, wordt weergegeven op het display met zeven segmenten. Vervolgens zullen de LED's achtereenvolgens van rechts naar links oplichten. Dit vormt een powerbar. Zodra de powerbar vol is, wordt deze gereset. Het doel van speler één is om de schakelaar om te draaien wanneer de lat zo hoog mogelijk ligt. Hoe meer LED's branden, hoe meer schade speler één aan speler twee toebrengt. Nadat speler één zijn schakelaar heeft omgedraaid, wordt de toegebrachte schade afgetrokken van de gezondheid van speler twee. Daarna gaat het over naar de beurt van speler twee. Nu staat het weergegeven getal voor de gezondheid van speler en wordt de krachtbalk van links naar rechts gevuld. Zodra speler twee zijn zet doet, wordt de schade afgetrokken en is speler één weer aan de beurt. Dit herhaalt zich totdat een speler 0 gezondheid bereikt. Video van deze werking is bijgevoegd.

Om het spel te spelen, laadt u het op een basbord en drukt u op de middelste knop. Probeer de schakelaar om te draaien met zoveel mogelijk LED's actief en wacht dan terwijl het bord die punten aftrekt van de gezondheid van je tegenstander. Geef het dan door aan je vriend, en

Stap 3: FSM

Deze game is in wezen één grote eindige-toestandsmachine, waarbij een complexe logica plaatsvindt op basis van de staat waarin de FSM zich bevindt.

(Staatsdiagram)

Staat 1: Menu

De eerste status is het menuscherm, dat een van de eenvoudigere statussen is. Het bevat het display met zeven segmenten met het woord "PLAY" en de knop die ervoor zorgt dat het spel begint. De knop, BTN, leidt ons naar de volgende staat, dat is de beurt van speler.

Toestand 2: Speler Een is aan de beurt

De beurt van speler één activeert een signaal dat ervoor zorgt dat het scherm met zeven segmenten de gezondheid van speler twee weergeeft. Een ander signaal gaat aan om een schuifregister te activeren dat is geïmporteerd uit een andere module die we hebben gemaakt (Pone.vhd). Dit schuifregister laat de LED's oplichten zoals een toenemende vermogensmeter zou doen in andere games, en het zou dan worden gereset naar 0 wanneer het maximale aantal LED's bereikt dat kan worden verlicht. Het wordt bijgewerkt op de stijgende flank van de klok die is verkregen uit barclock.vhd, die is gewijzigd vanuit een geleend laboratoriumbestand. We lieten de balk van speler één van rechts beginnen en naar links vullen, omdat de schakelaar van speler één ook aan de linkerkant zit (voor een intuïtieve gebruikerservaring). Zodra de schakelaar is omgedraaid, gaat de status verder naar speler één aftrek, en het aantal actieve LED's wordt opgeslagen in een signaal.

Staat 3: Speler één aftrek

Het signaal met het aantal actieve LED's bepaalt de hoeveelheid gezondheid die wordt afgetrokken. Dit wordt gedaan door een ander schuifregister (deductor1.vhd) te hebben dat de LED's niet verhoogt, maar verlaagt. Dit neemt af op de stijgende flank van een van de clock div-modules die we hebben geleend en aangepast (downcounterclock.vhd). Op het moment dat één LED uitgaat, wordt één gezondheidspunt afgetrokken van de totale gezondheid van speler twee. Als speler twee tijdens dit proces 0 gezondheid bereikt, stoppen we en gaan we onmiddellijk naar de "Game over"-status. Anders, zodra de LED-vector "000000000000000000" bereikt, gaan we verder met de beurt van speler twee.

Toestand 4: Speler Twee is aan de beurt

De beurt van speler twee is precies zoals die van speler één, behalve dat het schuifregister ervoor (Ptwo.bhd) van links naar rechts gaat en de schakelaar zich aan de rechterkant van het bord bevindt. Er wordt een signaal geactiveerd om de gezondheidsweergave van speler 1 te krijgen. Zodra schakelaar 2 actief is, gaat dit verder naar de aftrekbeurt van speler twee.

Fase 5: Speler twee aftrekken

Net als de beurt van speler twee, gedraagt speler twee aftrekken zich net zoals speler één aftrek. Het belangrijkste verschil is dat het schuifregister dat het uitschakelen van de LED's regelt, in de tegenovergestelde richting gaat, wat een gemakkelijke wijziging is om aan te brengen zodra je de aftrek van de speler goed hebt laten werken.

Fase 6: Game Over Als een van de spelers op enig moment nul gezondheid bereikt, schakelt het spel over naar deze toestand. Niets bijzonders wordt weergegeven. Als BTN één wordt ingedrukt, wordt de gezondheid gereset naar 99 en gaat de status terug naar het menu, waardoor het spel in feite opnieuw begint.

Zwarte doos

Stap 4: Modules

Downcounterclock (gebaseerd op clk_div.vhd module door Bryan Mealy):

Dit is de klok die de timing van de deductoren afhandelt. De constante genaamd max_count is 3x meer dan de max_count constante van barclock. Hierdoor zullen de deductoren 3x langzamer zijn dan de snelheid van de balk.

Barclock - (gebaseerd op clk_div.vhd-module van Bryan Mealy): deze klok verwerkt de timing van de vermogensmeters, die we snel hebben verhoogd om het spel moeilijker te maken. Deze timing kan naar wens worden aangepast door de snelheid te verhogen door de constante max_count een groter getal te maken, of te verlagen door max_count een kleiner getal te maken. Sseg_dec - (geschreven door Bryan Mealy): Deze module neemt een 8-bits getal als invoer, dat het decodeert, het getal omzet in zijn decimale equivalent en vervolgens uitvoert naar het zevensegmentendisplay. Om dit bestand te laten werken, moet u ervoor zorgen dat uw beperkingen overeenkomen met de onze.

Pone: Dit is een schuifregister dat bits naar links verschuift, waarbij een hot bit wordt toegevoegd om het te laten lijken alsof de vermogensmeter toeneemt. Wanneer alle bits warm zijn, worden alle bits gereset naar '0' en begint de cyclus opnieuw.

Ptwo: Dit is een omgedraaide versie van de P1-module.

Deductor1: Dit is een combinatie van een schuifregister en een aftrekker. Het schuifregister gaat in de tegenovergestelde richting van het schuifregister van P1, wat een aftrek aangeeft. Dit trekt ook 1 af van de gezondheid van speler 2 voor elke klokcyclus, dus met de combinatie van deze twee functies zal het lijken alsof de gezondheid van de tegenstander met 1 afneemt voor elke led van de gezondheidsbalk die naar beneden gaat.

Deductor2: Dit is een omgedraaide versie van de Deductor1-module.

PlayDecoder (geleend en enigszins aangepast van ekchen35649 zijn 133 instructable):

Dit wordt gebruikt in de menustatus om het woord "PLAY" weer te geven op de decoder met zeven segmenten.

To Do: foto's, video

Aanbevolen: