[CZĘŚĆ 1] STM32Butterfly2: Tetris na STM32 – wprowadzenie do mechanizmu gry
Kompletna funkcja będzie zatem wyglądała tak:
void Redukcja(void) { unsigned char x,y,k,yy; for(y=0;y<20;y++) //pętla oblicza kolejne linie planszy { k=1; for(x=0;x<10;x++) if(plansza[x][y] == 0) k=0; //pętla sprawdza każdy punkt danej linii //jeżeli brakuje któregoś klocka to k=0; if(k == 1) //jeżeli bieżąca linia jest kompletna { linie++; //zwiększ punkty punkty+=10; for(yy=y;yy>0;yy--) //pętla odlicza kolejne linie od bieżącej w górę { for(x=0;x<10;x++) //pętla kopiuje linię yy-1 do linii yy plansza[x][yy]=plansza[x][yy-1]; //spowoduje to skasowanie pełnej linii //i przesunięcie wszystkich linii ponad w dół } } } }
Kolejna nowa zmienna linie zlicza ilość ułożonych przez gracza linii poziomych, należy ją zadeklarować tak samo jak zmienną punkty.
Napisaliśmy wszystkie funkcje potrzebne podczas opuszczania klocka, więc czas na samą funcję KlocekDol:
void KlocekDol(void) { if(Kolizja(klocekx,kloceky+1,klocekr) == 0) //sprawdzenie czy przesunięty klocek nie wywoła kolizji { //jeżeli nie to: kloceky++; //zwiększ zmienną y położenia klocka }else { //jeżeli wykryto kolizję: KlocekWklej(); //skopiuj segmenty klocja na planszę Redukcja(); //sprawdź czy nie ma pełnych linii KlocekNowy(); //załaduj nowy klocek } }
Dzięki temu, że rozbiliśmy poszczególne czynności na odrębne kawałki kodu, cały program staje się bardzo czytelny i łatwo nam będzie w przyszłości dokonywać w nim zmian. Zapewne każdy z czytelników będzie chciał zmodyfikować grę po swojemu, dlatego starałem się pisać ją jak najprzejrzyściej, a zarazem „rozwojowo”.
Mamy więc komplet funkcji odpowiedzialnych za mechanikę gry, natomiast brakuje istotnego elementu jakim jest interfejs użytkownika - jak go przygotować pokażemy w kolejnym artykule.
Rafał Kędzierski