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.