Stap 5: Programmering de spel
Beschrijving van de Shapes
Er zijn zeven tetrominos, elk met 4 pixels, en elk met vier mogelijke rotaties. We slaan dit alles in een multi-dimensionale array: de eerste dimensie van de zeven bestaande shapes, de tweede dimensie met de vier rotaties voor elke shape, de derde met vier pixel beschrijvingen die bestaan elk uit een X- en Y coördineren.
Dit beschrijft bijvoorbeeld de "T"-vorm:
/* T */ {
/ * hoek 0 * / {{0,1} {1,1}, {2,1}, {1,2}},
/ * hoek van 90 * / {{1,0} {1,1}, {2,1}, {1,2}},
/ * hoek van 180 * / {{1,0} {0,1}, {1,1}, {2,1}},
/ * hoek van 270 * / {{1,0} {0,1}, {1,1}, {1,2}}
}
Het bijhouden van het actieve stuk
Om bij te houden het stuk op dit moment in het spel, onderhoudt het programma een activePiece -variabele. Dit is de index van de actieve vorm in het hoogste niveau van de matrix. Het houdt ook een rotatie -variabele die de index van de huidige rotatie bevat. Een xOffset variabele tracks hoe ver links of rechts (0-7) elk stuk is, en yOffset worden bijgehouden hoe ver naar beneden (0-15) de Raad van bestuur is gedaald. Als u wilt tekenen van het actieve stuk wordt het programma toegevoegd dat de X en Y gecompenseerd waarden op de X- en Y-coördinaten van elke pixel van de huidige draaihoek van het geselecteerde stuk getrokken.
Het bijhouden van de vaste stukken
Het programma maakt gebruik van een 16 byte-matrix voor het bijhouden van de vaste stukken, met elke byte die een rij vertegenwoordigt. Bijvoorbeeld, zou de onderstaande matrix vertegenwoordigen een L-vormige shape zitten in het midden van de onderste twee rijen (zoals aangegeven door de 1s in de laatste twee bytes):
sampleGrid van de byte [16] ={
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00100000,
B00111000
};
Botsingdetectie
Wanneer een poging wordt gedaan om de actieve knipt, controleert het programma eerst de nieuwe positie tegen de array van vaste stukken. Er zijn geen botsingen, beweging is toegestaan als de matrix opnieuw wordt getekend. Als er een botsing is gedetecteerd tijdens een poging om te bewegen, links, rechts, of om te draaien, is de actie verboden. Als er een botsing is gedetecteerd opgetreden bij het neerzetten van een stuk, het stuk in zijn standpunt wordt vastgesteld en wordt toegevoegd aan de matrix van vaste pixels.
Dropping stukken automatisch
Het tempo van het spel wordt gecontroleerd door de variabelen gravityTrigger en stepCounter . Elke lus van het programma verhoogt stepCounter, en elke keer stepCounter het aantal opgeslagen in gravityTrigger bereikt, het het actieve stuk één niveau daalt.
Als het spel vordert, wordt de gravityTrigger verlaagd zodat het actieve stuk steeds vaker zakt totdat eindelijk het daalt in elke lus van het programma.
Elke keer dat een actieve stuk is bevestigd aan het raster wordt gecontroleerd voor volledige bytes/rijen (B11111111). Als er om het even welk wordt gevonden, het hen af en aan drie keer knippert, dan worden deze verwijderd en daalt de rijen boven de leemte op te vullen.
Probleemoplossing
Als de stukken zijn niet van boven naar beneden vallen, maar in plaats daarvan gaan van links naar rechts, wijzigt u de waarde die is doorgegeven in de lijnen "matrixTop.setRotation(1);" en/of "matrixBottom.setRotation(1);" in het "Setup"-lus.
Als de stukken in de verkeerde matrix start, schakelen de fysieke locatie van elke matrix of omkeren van de adressen die zijn gedeclareerd in de "matrixTop.begin(0x70);" en "matrixBottom.begin(0x71);" lijnen van de "Setup"-lus.
Indien sommige rijen of kolommen niet licht, wiggle de mini LED matrix in de vrouwelijke headers. Ze kunnen niet goed contact maken.