This shows you the differences between two versions of the page.
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 | ||