Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pp:24:teme:prolog-bloxorz [2024/05/15 00:19]
andrei.olaru created
pp:24:teme:prolog-bloxorz [2024/05/22 17:39] (current)
andrei.olaru
Line 2: Line 2:
  
   * Data publicării:​ 14.05.2024   * Data publicării:​ 14.05.2024
-  * Data ultimei modificări: ​14.05.2024 (vezi [[#​Changelog|changelog]] )+  * Data ultimei modificări: ​22.05.2024 (vezi [[#​Changelog|changelog]] )
   * [[https://​curs.upb.ro/​2023/​mod/​forum/​view.php?​id=177338|Forum temă]]   * [[https://​curs.upb.ro/​2023/​mod/​forum/​view.php?​id=177338|Forum temă]]
-  * [[https://​vmchecker.cs.pub.ro/​ui/#​PP|vmchecker]] ​(în curând)+  * [[https://​vmchecker.cs.pub.ro/​ui/#​PP|vmchecker]]
  
 ===== Obiective ===== ===== Obiective =====
Line 28: Line 28:
 ===== Perspectivă generală ===== ===== Perspectivă generală =====
  
-{{ref/Stage01.png|Stage01}}+{{:​pp:​24:​teme:​prolog:​stage01.png?400|}}
  
 Fiecare nivel (//stage//) din [[https://​www.albinoblacksheep.com/​games/​bloxorz|Bloxorz]] conține o suprafață de joc formată din **pătrățele** (//tiles//) care pot fi normale sau au diverse proprietăți. Jucătorul controloează un **bloc** care trebuie dus prin mișcări sus / jos / dreapta / stânga până la trecerea printr-o pătrățică lipsă din suprafața de joc (o numim scop sau gaură). Puteți urmări rezolvarea nivelurilor de Bloxorz [[https://​www.youtube.com/​@OfficialBloxorzGuide/​videos|aici]]. Fiecare nivel (//stage//) din [[https://​www.albinoblacksheep.com/​games/​bloxorz|Bloxorz]] conține o suprafață de joc formată din **pătrățele** (//tiles//) care pot fi normale sau au diverse proprietăți. Jucătorul controloează un **bloc** care trebuie dus prin mișcări sus / jos / dreapta / stânga până la trecerea printr-o pătrățică lipsă din suprafața de joc (o numim scop sau gaură). Puteți urmări rezolvarea nivelurilor de Bloxorz [[https://​www.youtube.com/​@OfficialBloxorzGuide/​videos|aici]].
Line 91: Line 91:
 Partea de switches rămâne pentru etapa 2; switch-urile vor fi adăugate cu predicatul ''​%%set_switch%%''​. Partea de switches rămâne pentru etapa 2; switch-urile vor fi adăugate cu predicatul ''​%%set_switch%%''​.
  
-{{ref/​Stage03_edit-res.png|Stage03 annotated}}+{{:​pp:​24:​teme:​prolog:​stage03_edit.png?400|}}
  
 Coordonatele pozițiilor sunt perechi de forma ''​%%(X,​ Y)%%'',​ cu ''​%%X=0%%''​ pe cea mai din stânga coloană pe care există pătrățele și cu ''​%%Y=0%%''​ pe cea mai de sus linie pe care există pătrățele. Predicatele ''​%%set_*%%''​ vor fi apelate în ordine pentru toate pătrățelele,​ de la stânga la dreapta, și de sus în jos. În imaginea de mai sus, am notat cu buline albe pozițiile pentru care se va apela, la construcția reprezentării ''​%%set_blank%%''​. Coordonatele pozițiilor sunt perechi de forma ''​%%(X,​ Y)%%'',​ cu ''​%%X=0%%''​ pe cea mai din stânga coloană pe care există pătrățele și cu ''​%%Y=0%%''​ pe cea mai de sus linie pe care există pătrățele. Predicatele ''​%%set_*%%''​ vor fi apelate în ordine pentru toate pătrățelele,​ de la stânga la dreapta, și de sus în jos. În imaginea de mai sus, am notat cu buline albe pozițiile pentru care se va apela, la construcția reprezentării ''​%%set_blank%%''​.
Line 119: Line 119:
  
 **Nu uitați** că aveți predicate utile pentru calculul pozițiilor în fișierul ''​%%util.pl%%''​. **Nu uitați** că aveți predicate utile pentru calculul pozițiilor în fișierul ''​%%util.pl%%''​.
 +
 +===== Etapa 2 =====
 +
 +În această etapă trebuie să includeți funcționalitatea switch-urilor în mecanica jocului și să rezolvați nivelurile de Bloxorz date.
 +
 +Un //switch// în Bloxorz permite activarea și/sau dezactivarea unor pătrățele din tabla de joc (numite și pod -- //​bridge//​).
 +
 +  * Avem 2 **tipuri** de switch-uri: un o-switch funcționează oricum ar fi apăsat de bloc; un x-switch funcționează doar dacă este apăsat de blocul așezat în picioare.
 +  * Avem 3 posibile funcționalități pentru switch-uri: doar activează un pod (//​uponly//​),​ doar dezactivează un pod (//​downolnly//​) sau comută starea podului (//​switch//​). Exemple din toate cele trei funcționalități pot fi văzute în nivelul 5.
 +
 +Aveți de implementat:​
 +
 +  * predicatul ''​%%set_switch(S,​ Pos, Switch, Func, Positions, SOut)%%''​ care leagă ''​%%SOut%%''​ la o stare cu aceleași informații ca și ''​%%S%%'',​ având în plus un switch în poziția ''​%%Pos%%''​. ''​%%Switch%%''​ este tipul (''​%%oswitch%%''​ sau ''​%%xswitch%%''​);​ ''​%%Func%%''​ este funcționalitatea (''​%%uponly%%'',​ ''​%%dnonly%%''​ sau ''​%%switch%%''​);​ ''​%%Positions%%''​ sunt pozițiile celulelor podului care este activat / dezactivat de switch. Odată implementat acest predicat, se așteaptă următorul comportament:​
 +    * ''​%%get_cell%%''​ trebuie să lege ultimul argument la ''​%%oswitch%%''​ sau ''​%%xswitch%%''​ pentru poziția switch-urilor,​ pentru ca ele să fie afișate corect
 +    * pentru poduri, dacă podul este activat atunci ''​%%get_cell%%''​ trebuie să lege ultimul argument la ''​%%tile%%''​ pentru toate pozițiile podului, iar dacă podul este dezactivat ''​%%get_cell%%''​ trebuie să eșueze (să întoarcă ''​%%false%%''​) pentru toate pozițiile podului
 +    * predicatul ''​%%move%%''​ va fi ajustat în așa fel încât să modifice starea tablei de joc în mod corespunzător cu funcționalitatea switch-urilor.
 +
 +Pentru rezolvarea unui nivel, aveți de implementat predicatul:
 +
 +  * ''​%%solve(S,​ Moves)%%''​ care leagă ''​%%Moves%%''​ la o listă de mutări necesare pentru a rezolva starea ''​%%S%%''​.
 +    * Pentru ''​%%solve%%'',​ ar trebui să fie suficient să lăsați pe Prolog să facă backtracking,​ alegând din mutările disponibile și avansând starea corespunzător.
 +    * Pentru a nu trece prin aceeași poziție de două ori, folosiți o listă de poziții deja vizitate.
 +    * Observați că, de exemplu la nivelul 5, este necesar ca unele switch-uri să fie apăsate de 2 ori, ceea ce înseamnă că în acest caz trebiue să permiteți blocului să fie de două ori în aceeași poziție, dacă a apăsat pe un switch.
 +    * pentru ultimele puncte, încercați să obțineți o rezolvare în mai puține mutări. Hint: alegeți mai întâi o mutare care duce blocul mai aproape de scop. Puteți folosi predicatul ''​%%msort/​2%%''​ din Prolog.
  
 ===== Testare ===== ===== Testare =====
  
-Pentru testare folosiți predicatele ''​%%check%%''​ sau ''​%%vmcheck%%''​.+Încărcați în Prolog fișierul ''​%%blox.pl%%''​. ​Pentru testare folosiți predicatele ''​%%check%%''​ sau ''​%%vmcheck%%''​. Pentru teste individuale folosiți ''​%%vmtest(<​nume_test>​).%%'',​ e.g. ''​%%vmtest(s0)%%''​. Vedeți și observația de la începutul fișierului ''​%%testing.pl%%''​. 
 + 
 +La trimiterea temei, este suficient să puneți în arhivă fișierul ''​%%blox.pl%%''​.
  
 Testele se află în fișierul ''​%%testing.pl%%''​. Tipurile testelor sunt descrise succint la începutul fișierului. Pentru a verifica un test, puteți face o interogarea în consolă care conține scopurile plasate (de obicei) între ghilimele în primul argumental testului. Testele se află în fișierul ''​%%testing.pl%%''​. Tipurile testelor sunt descrise succint la începutul fișierului. Pentru a verifica un test, puteți face o interogarea în consolă care conține scopurile plasate (de obicei) între ghilimele în primul argumental testului.
 +
 +De exemplu, pentru a replica testul ''​%%s0|b%%''​ puteți interoga la consolă:
 +
 +<​code>​
 +empty_state(S),​ ttSetCell(S,​ 0, 0, +, _, _)
 +</​code>​
 +
 +iar pentru testul ''​%%s0|c%%'':​
 +
 +<​code>​
 +empty_state(S),​ ttSetCell(S,​ 0, 0, '​B',​ _, S1), get_cell(S1,​ (0, 0), X)
 +</​code>​
  
 Pentru rezultate mai detaliate ale testării, puteți decomenta linia ''​%%%detailed_mode_disabled :- !, fail.%%''​ din fișierul ''​%%testing.pl%%''​. Atenție! În acest caz, este posibil ca punctarea să fie diferită decât rezultatul de pe vmchecker, unde linia este comentată. Pentru rezultate mai detaliate ale testării, puteți decomenta linia ''​%%%detailed_mode_disabled :- !, fail.%%''​ din fișierul ''​%%testing.pl%%''​. Atenție! În acest caz, este posibil ca punctarea să fie diferită decât rezultatul de pe vmchecker, unde linia este comentată.
 +
 +Pentru a face debug pe secvențe de mutări, puteți folosi predicatul ''​%%ttSeqDbg%%''​ din ''​%%testing.pl%%'',​ care afișează starea după fiecare mutare din secvență.
  
 ===== Resurse ===== ===== Resurse =====
  
   * [[https://​ocw.cs.pub.ro/​courses/​_media/​pp/​24/​teme/​prolog/​etapa1.zip|Schelet etapa 1]]   * [[https://​ocw.cs.pub.ro/​courses/​_media/​pp/​24/​teme/​prolog/​etapa1.zip|Schelet etapa 1]]
 +  * [[https://​ocw.cs.pub.ro/​courses/​_media/​pp/​24/​teme/​prolog/​etapa2.zip|Schelet etapa 2]]
  
 ===== Changelog ===== ===== Changelog =====
  
   * 14.05 -- enunț.   * 14.05 -- enunț.
 +  * 17.05 -- teste, mai multe informații despre testare în enunț.
 +  * 20.05 -- configurare vmchecker
 +  * 20.05 -- corectare teste, adăugare condiții teste negative.
 +  * 22.05 -- adăugare etapa 2, prime teste etapa 2
 +  * 22.05 -- completare teste etapa 2, configurare vmchecker
  
pp/24/teme/prolog-bloxorz.1715721568.txt.gz · Last modified: 2024/05/15 00:19 by andrei.olaru
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