Differences

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

Link to this comparison view

pp:23:teme:prolog-carcassonne [2023/05/09 17:46]
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ă ​de 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ă]]
   * [[https://​vmchecker.cs.pub.ro/​ui/#​PP|vmchecker]] (în curând)   * [[https://​vmchecker.cs.pub.ro/​ui/#​PP|vmchecker]] (în curând)
Line 69: Line 69:
   * avem numai piese cu cetăți, drumuri, și pajiști.   * avem numai piese cu cetăți, drumuri, și pajiști.
   * nu vom avea piese cu scut, și nici piese cu mânăstire.   * nu vom avea piese cu scut, și nici piese cu mânăstire.
-  * pentru modul de punctare al jucătorilor ​este relevant că:+  * pentru modul de punctare al jucătorilorrelevant ​în etapa 2, este important ​că:
     * pe o piesă pot apărea maxim 2 cetăți diferite;     * pe o piesă pot apărea maxim 2 cetăți diferite;
-    * vom considera că dacă pe o piesă există ​o intersecție ​de drumuri, atunci toate drumurile sunt drumuri diferite.+    * vom considera că dacă pe o piesă există ​mai mult de 2 margini cu drumuri, atunci toate drumurile sunt drumuri diferite ​(sunt atâtea drumuri câte sunt margini cu drumuri).
  
 ===== Etapa 1 ===== ===== Etapa 1 =====
Line 103: Line 103:
   * ''​%%hasTwoCitadels(Tile)%%''​ -- verifică dacă pe piesă sunt 2 cetăți diferite sau este una singură. Piesele 4 și 5 au două cetăți diferite.   * ''​%%hasTwoCitadels(Tile)%%''​ -- verifică dacă pe piesă sunt 2 cetăți diferite sau este una singură. Piesele 4 și 5 au două cetăți diferite.
  
-Veți putea testa implementarea predicatelor ''​%%tile%%'',​ ''​%%at%%''​ și ''​%%atL%%'',​ pe lângă teste, și folosind predicatul ''​%%printTile%%''​ din ''​%%utils.pl%%''​. De exemplu, puteți apela interogarea+Veți putea testa implementarea predicatelor ''​%%tile%%'',​ ''​%%at%%'',​ ''​%%atL%%''​ și ''​%%ccw%%'',​ pe lângă teste, și folosind predicatul ''​%%printTile%%''​ din ''​%%utils.pl%%''​. De exemplu, puteți apela interogarea
  
 <​code>​ <​code>​
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 =====
  
-9.05 -- upload inițial. 9.05 -- clarificare reprezentare+  * 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 
 +  * 14.05 -- Clarificare intersecții 
 +  * 14.05 -- Îmbunătățire teste (pentru ca implementări triviale să nu treacă testele) 
 +  * 9.05 -- upload inițial. 
 +  * 9.05 -- clarificare reprezentare 
 +  * 9.05 -- adăugare etichete teste
  
  
pp/23/teme/prolog-carcassonne.1683643617.txt.gz · Last modified: 2023/05/09 17:46 by bot.pp
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