Sokoban este un joc puzzle in care jucatorul impinge cutii in interiorul unei camere cu scopul de a ajunge cu toate cutiile in anumite locatii tinta marcate in nivel.
Voi folosi un ecran LCD Nokia 5110 si 4 butoane. Pe ecran se v-a afisa grafic starea curenta a nivelului (cutiile, jucatorul si locatiile tinta). Jucatorul se misca in camera folosind cele 4 butoane. Jocul se termina dupa ce toate cutiile au ajuns la locatiile tinta.
Am utilizat biblioteca grafica pentru afisarea pe display-ul LCD. Jocul incepe in ecranul de start in care se afiseaza numele jocului (“Sokoban”) si text-ul “Start”), dupa care programul asteapta ca utilizatorul sa apese orice buton pentru a intra in starea “RUN” in care se afiseaza harta jocului in care jucatorul poate muta cutiile. Am implementat functii pentru afisarea elementelor grafice din joc (cutiile, target-urile si jucatorul). Harta jocului (game board-ul) este abstractizata printr-o matrice 20×10 in care valoarea 0 semnifica spatiu liber, valoarea 1 semnifica o cutie, valoarea 2 semnifica o tinta, iar valoarea 3 semnifica jucatorul. Toate aceste valori de pe harta sunt afisate folosind functiile de afisare mentionate anterior, astfel incat pe display-ul LCD sa fie afisate patrate pe pozitiile cutiilor, X-uri pe pozitiile target-urilor si un cerc pe pozitia jucatorului. Utilizatorul controleaza jucatorul apasand pe cele 4 butoane de pe cablajul de test: Left, Right, Up, Down. Daca jucatorul se misca pe pozitia unei cutii, atunci cutia este impinsa in directia in care s-a miscat jucatorul. Daca toate cutiile au ajuns pe tinte, atunci nivelul s-a terminat si se revine la ecranul de start.
Sumarul codului este urmatorul:
main(){ state = START // main loop while(1){ clear_board if(state == START){ afisare_ecran_start if(press_any_button){ state = RUN } }else if(state == RUN){ if(press_left){ move_player_left if(player_pushes_box) push_box } if(press_right){ move_player_right if(player_pushes_box) push_box } if(press_up){ move_player_up if(player_pushes_box) push_box } if(press_down){ move_player_down if(player_pushes_box) push_box } if(level_is_complete){ // check if all boxes are on targets state = START continue; } afiseaza_harta_joc } } }
Mi-a placut sa realizez placuta, lipind toate componentele folosind letcon si fludor. Nu am mai lucrat cu letcon si fludor pana acum, iar acest proiect a fost o experienta noua pentru mine. Am invatat sa utilizez o biblioteca pentru display-ul LCD si am implementat functii care sa afiseze elemente grafice pentru jocul meu (cutiile, target-urile si jucatorul) pe display-ul LCD.