Hinder undvika spel (6 / 9 steg)
Steg 6: Hinder uppdatering Array
Vad gör detta projekt ett spel är att du måste undvika de hinder som kan komma till 3 möjliga lägen (vänster, mitten och höger positioner). Detta innebär att vi måste hålla koll på våra hinder och skicka nya efter en viss tid passerar.
Detta innebär att vi kommer att behöva följande:
1) en reg matris att lagra hinder.
2) en räknare för att hålla reda på om eller inte tillräckligt med tid har förflutit för att veta om vi måste skicka ett nytt hinder.
3) ett sätt att generera nya hinder. (vi kommer att använda vår slumpgenerator)
4) ett sätt att flytta dessa "hinder". Vi kommer att kunna bli av med den nedersta raden som "går" vår position vektor och även infoga våra nya hinder i toppen av arrayen hinder.
1) för att hålla reda på hinder, använder vi en reg kallas "TotalArray". TotalArray använder index från 0 till 3 från slutet för hinder och de sista 3-indexet för det vi kallar vår "Position". Till exempel: I våra projekt använder vi en TotalArray med index från [0:20], så allt från 0:17 kommer att vara våra hinder, och allt från 18:20 kommer att vara vår nuvarande ståndpunkt.
Det är viktigt att veta 2 saker specifika till vårt genomförande.
en) du måste veta att hinder tolkas i grupper om tre. Så när vi skriver på skärmen eller kontroll för att se om ett hinder har kolliderat med vår ståndpunkt, måste vi tänka på de hinder 3 index i taget.
Så de första 3 hinder är TotalArray [0:2], de kommande tre skulle vara TotalArray [3:5] och så vidare.
b) hinder göra aldrig det till den sista raden där positionen indexen är. Detta innebär att placera indexerar 18:20 kommer alltid bara ha en bit vara en 1.
2) den här räknaren räknar på posedge av styrelsens inbyggd klocka som tas från PIN Y2. En parameter måste också instantieras för att konstatera vad räknares värde måste vara för att få veta att tiden har förflutit signalering för ett nytt hinder för genereras och sedan sätta in i hinder delen av matrisen. Ju större värde för den här parametern, kommer att ju längre tiden mellan nya hinder som genereras, och desto lättare spelet spela.
3) vår slumpgenerator måste "återvända" ett 3 bitars binärt värde. Vi påverka detta genom att ge slumpgenerator modulen en reg komma åt och ändra när det genererar ett nytt värde. Vi kan ta denna reg och använda den för vår updateObstacleArray modul. 3 bit värdet kommer att motsvara de nya hinder som kommer att dyka upp i 0:2 index. En sak att tänka på här är att vi inte kan ha det nya hindret vara fallet: 3' b111 eftersom det skulle innebära användaren skulle ha något sätt att undvika hindret och det är inte roligt! (Vi är trevliga människor!) Att ta hand om detta i den slumpmässigt generera modul.
Det finns ett annat fall som vi inte kan ha hända och så är fallet där en 3' b110 hinder följs av en 3' b011 hinder eftersom detta gör också en automatisk förlust scenario. I stället för kontroll av detta fall, skapa vi istället en linje av 3' b000 mellan varje hinder så att användaren kan alltid finna en väg genom hinder.
4) när tiden förflyter den fördefinierade period konstanta parametern (från 2), måste vi flytta våra hinder. Förutsatt att det finns ingen kollision mellan ett hinder och ett p-värde, kommer att då vi uppdatera matrisen för att återspegla denna tidens gång med ett nytt hinder. (Vi återkommer till denna kollision kontroll.)
Vi måste göra ett nytt hinder visas i den översta raden i TotalArray, bli av med den nedersta raden av hinder och skjuta allt från den övre delen av hinder ner en rad.
Detta sker med hjälp av en tempArray.
...
...
Förutsatt att tiden löper ut så att ett hinder måste genereras.
REG TotalAr [0:20]
REG tempArray [0:17]
input randSig [0:2];
om (obsAr [0:2] == 3' b000)
börja
om första/översta i matris är tom gen nya obs och push ursprungliga obsAr "down"
innebär varje hinder är separerade av en tom vågrät linje mellan hinder
om (randSig! = 3' b111)
börja
tempArray [3:17] < = TotalAr [0:14]; lagra de topp 15 delarna
tempArray [0:2] = randSig; Att skapa det nya hindret från randomsignal
TotalAr [0:17] = tempArray [0:17]; att sätta den nya hinder matrisen tillbaka i TotalArray
slutet
annat
börja
tempArray [3:17] < = TotalAr [0:14];
tempArray [0:2] = 3' b000; Se det nya hindret en tom rad om det fanns ett hinder i den översta raden att börja.
TotalAr [0:17] = tempArray [0:17];
slutet
slutet
...
...
Denna kod är vad skulle användas för att sätta det nya hindret högst upp liksom flytta de gamla hindren ned en rad.