This shows you the differences between two versions of the page.
pp:24:teme:prolog-bloxorz [2024/05/17 23:11] andrei.olaru |
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: 17.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 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 ===== | ||
Î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%%''. | Î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. | ||
Line 145: | Line 171: | ||
* [[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 ===== | ||
Line 150: | Line 177: | ||
* 14.05 -- enunț. | * 14.05 -- enunț. | ||
* 17.05 -- teste, mai multe informații despre testare în 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 | ||