Sokoban

Teaca Bogdan, 335CC

Descriere generala

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.

Schema bloc

Hardware Design

Lista de piese

  1. Placa de baza ce contine microcontroller-ul ATmega324
  2. Kit-ul de componente de baza
  3. Ecran LCD Nokia 5110
  4. 4 Butoane
  5. Rezistente
  6. Conectori headere pini
  7. Cablaj de test

Schema electrica

Software Design

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
      }
   }
}

Rezultate Obtinute

Concluzii

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.

Download

Bibliografie/Resurse

pm/prj2019/adragan/sokoban_pm.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0