This shows you the differences between two versions of the page.
pp:23:teme:prolog-carcassonne [2023/05/16 00:49] bot.pp |
pp:23:teme:prolog-carcassonne [2023/05/19 12:36] (current) bot.pp |
||
---|---|---|---|
Line 2: | Line 2: | ||
* Data publicării: 09.05.2023 | * Data publicării: 09.05.2023 | ||
- | * Data ultimei modificări: 09.05.2023 | + | * Data ultimei modificări: 19.05.2023 (vezi [[#Changelog|changelog]] ) |
* Deadline hard: ziua laboratorului 12 (la o săptămână după ziua laboratorului 12 pentru seria CB, adică în zilele de 24-25 mai în funcție de ziua laboratorului) | * Deadline hard: ziua laboratorului 12 (la o săptămână după ziua laboratorului 12 pentru seria CB, adică în zilele de 24-25 mai în funcție de ziua laboratorului) | ||
* [[https://curs.upb.ro/2022/mod/forum/view.php?id=188540|Forum temă]] | * [[https://curs.upb.ro/2022/mod/forum/view.php?id=188540|Forum temă]] | ||
Line 181: | Line 181: | ||
* ''%%findRotation(Tile, Neighbors, Rotation)%%'' leagă ''%%Rotation%%'' la un număr între 0 și 3 inclusiv, semnificând e câte ori ar trebui rotită piesa ''%%Tile%%'' în așa fel încât să se potrivească cu toți vecinii, specificați prin perechi pisă - direcție. | * ''%%findRotation(Tile, Neighbors, Rotation)%%'' leagă ''%%Rotation%%'' la un număr între 0 și 3 inclusiv, semnificând e câte ori ar trebui rotită piesa ''%%Tile%%'' în așa fel încât să se potrivească cu toți vecinii, specificați prin perechi pisă - direcție. | ||
* nu uitați că Prolog caută automat soluții în funcție de condițiile care sunt puse pentru un scop. | * nu uitați că Prolog caută automat soluții în funcție de condițiile care sunt puse pentru un scop. | ||
+ | |||
+ | ===== Etapa 2 ===== | ||
+ | |||
+ | În etapa 2 ne vom concentra pe reprezentarea și lucrul cu o tablă de joc și pe plasarea pieselor în joc. Veți lucra tot în fișierul ''%%ccs.pl%%'', unde trebuie să existe deja predicatele din prima etapă. | ||
+ | |||
+ | Jocul Carcassonne începe cu plasarea unei piese undeva pe masă, și apoi cu plasarea altor piese. În afară de prima piesă, orice altă piesă trebuie plasată lângă (având o muchie comună) una sau mai multe piese deja plasate pe masă, și trebuie să se potrivească cu toate piesele vecine deja plasate pe masă. Vedeți acest [[https://www.youtube.com/watch?v=gX8jFLUw8D4|clip]], cu mențiunea că noi ne vom ocupa doar de plasarea pieselor, nu și de plasarea omuleților sau de calculul punctelor. | ||
+ | |||
+ | ==== Reprezentarea tablei ==== | ||
+ | |||
+ | Trebuie să vă construiți o reprezentare pentru starea tablei de joc. Această reprezentare trebuie să conțină piesele aflate pe masă (în reprezentarea construită la etapa 1) și pozițiile lor, în coordonate carteziene. | ||
+ | |||
+ | În predicatele de mai jos, pozițiile vor fi perechi ''%%(X, Y)%%''. Notați că pozițiile sunt relative la o piesă arbitrară, și putem avea și coordonate negative. | ||
+ | |||
+ | Aveți de implementat predicatele de mai jos, cu observația că trebuie să implementați cel puțin primele 3 predicate pentru a putea testa: | ||
+ | |||
+ | * ''%%emptyBoard(Board)%%'' - leagă ''%%Board%%'' la reprezentarea unei mese goale, fără piese. | ||
+ | * ''%%boardSet(BoardIn, Pos, Tile, BoardOut)%%'' - leagă BoardOut la rezultatul plasării pe tabla ''%%Board%%'' a piesei ''%%Tile%%'' la poziția ''%%Pos%%''. Folosiți ''%%canPlaceTile%%'' (vezi mai jos) pentru a verifica dacă plasarea este validă. | ||
+ | * ''%%boardGet(Board, Pos, Tile)%%'' - leagă ''%%Tile%%'' la piesa de pe poziția ''%%Pos%%'' pe tabla ''%%Board%%''. | ||
+ | * ''%%boardGetLimits(Board, XMin, YMin, XMax, YMax)%%'' - leagă ultimele 4 argumente la coordonatele minime/maxime ale pieselor de pe tabla ''%%Board%%''. | ||
+ | |||
+ | Hint: ca să puteți testa parțial tema, implementați inițial ''%%boardSet%%'' fără verificarea validității mutării. | ||
+ | |||
+ | Ca să puteți verifica predicatele de mai sus, puteți folosi ''%%printBoard/1%%'' din ''%%utils.pl%%'', folosind interogări de tipul (vedeți predicatul ''%%boardTiles/2%%'' din ''%%testing.pl%%'' pentru valori de indecși): | ||
+ | |||
+ | <code> | ||
+ | boardSetTest(Index, Board), printBoard(Board). | ||
+ | |||
+ | </code> | ||
+ | Predicatul ''%%printBoard/1%%'' afișează și coordonatele pe margini, cu coordonatele x mai mici în dreapta și cu coordonatele y mai mici în jos. De exemplu, pentru tabla cu indexul 1 în teste -- corespunzând cu zona din centru-dreapta în imaginea de mai sus, afișarea este: | ||
+ | |||
+ | <code> | ||
+ | -1 0 1 2 | ||
+ | |||
+ | |||
+ | .+++. | ||
+ | + | ||
+ | 1 | ||
+ | + | ||
+ | .+++. | ||
+ | . .. .+++++. . | ||
+ | ++ +++++++ | ||
+ | +++++++++++++++ 0 | ||
+ | ++++ ++ ++ | ||
+ | .++++. .. | .. . | ||
+ | .+++. . | . | ||
+ | + \ | ||
+ | ----- - -1 | ||
+ | |||
+ | . . . . | ||
+ | |||
+ | |||
+ | </code> | ||
+ | ==== Plasarea pieselor ==== | ||
+ | |||
+ | Pentru plasarea corectă a pieselor pe tablă, trebuie implementate predicatele: | ||
+ | |||
+ | * ''%%canPlaceTile(Board, Pos, Tile)%%'' - întoarce adevărat dacă piesa ''%%Tile%%'' se poate plasa la poziția ''%%Pos%%'' pe tabla ''%%Board%%'' (vedeți sursa pentru lista de condiții). | ||
+ | * ''%%getAvailablePositions(Board, Positions)%%'' - leagă Positions la lista de poziții disponibile pentru a plasa piese. | ||
+ | * ''%%findPositionForTile(Board, Tile, Position, Rotation)%%'' - găsește pentru piesa ''%%Tile%%'' o poziție și o rotație în așa fel încât să se potrivească cu piesele existente pe tabla ''%%Board%%''. Predicatul întoarce ca soluții diferite toate posibilele plasări ale piesei pe tablă. | ||
===== Testare ===== | ===== Testare ===== | ||
Line 188: | Line 247: | ||
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 interogarea în consolă cu scopurile plasate (de obicei) între ghilimele în primul argument. | 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 interogarea în consolă cu scopurile plasate (de obicei) între ghilimele în primul argument. | ||
- | Pentru rezultate mai detaliate ale testării, puteți decomenta linia ''%%%detailed_mode_disabled :- !, fail.%%'' din fișierul ''%%tester.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ă. |
===== Resurse ===== | ===== Resurse ===== | ||
* [[https://ocw.cs.pub.ro/courses/_media/pp/23/teme/prolog/etapa1.zip|Schelet etapa 1]] | * [[https://ocw.cs.pub.ro/courses/_media/pp/23/teme/prolog/etapa1.zip|Schelet etapa 1]] | ||
+ | * [[https://ocw.cs.pub.ro/courses/_media/pp/23/teme/prolog/etapa2.zip|Schelet etapa 2]] | ||
===== Changelog ===== | ===== Changelog ===== | ||
+ | * 19.05 -- corecție a testului canPlaceA|a | ||
+ | * 18.05 -- clarificare necesitate prima etapă; îmbunătățire afișare teste cu mulțimi | ||
+ | * 17.05 (seara) -- testele pentru etapa 2, mici corecții în comentarii și enunț, mai ales observații despre poziții | ||
+ | * 17.05 -- etapa 2 publicată (fără teste) | ||
+ | * 16.05 -- pus la loc linia pentru activarea modului de testare detaliat din ''%%testing.pl%%'' | ||
* 15.05 -- corecție observație legată de printTile | * 15.05 -- corecție observație legată de printTile | ||
* 14.05 -- Clarificare intersecții | * 14.05 -- Clarificare intersecții |