Differences

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

Link to this comparison view

pp:23:teme:prolog-carcassonne [2023/05/08 23:34]
bot.pp created
pp:23:teme:prolog-carcassonne [2023/05/19 12:36] (current)
bot.pp
Line 1: Line 1:
-====== ​Carcassonne în Prolog ======+====== Prolog: Jocul Carcassonne ​======
  
-  * Data publicării: ​08.05.2023 +  * Data publicării: ​09.05.2023 
-  * Data ultimei modificări: ​08.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) 
-  * [[|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 31: Line 31:
 Carcassonne (după orașul din sudul Franței) este un joc de societate (boardgame) în care jucătorii își construiesc propriile teritorii, folosind piese pătrate ce conțin pe ele drumuri, cetăți, și pajiști. Jucătorii adună puncte în funcție de cum au plasat piesele și pe ce piese au plasat omuleți. Un joc de Carcassonne în desfășurare arată ca mai jos. Pentru o introducere succintă în esența jocului, vedeți [[https://​www.wikihow.com/​Play-Carcassonne#​Placing-Tiles-and-Meeples|aici]] - mai ales pasul 1 din partea a 2-a. Carcassonne (după orașul din sudul Franței) este un joc de societate (boardgame) în care jucătorii își construiesc propriile teritorii, folosind piese pătrate ce conțin pe ele drumuri, cetăți, și pajiști. Jucătorii adună puncte în funcție de cum au plasat piesele și pe ce piese au plasat omuleți. Un joc de Carcassonne în desfășurare arată ca mai jos. Pentru o introducere succintă în esența jocului, vedeți [[https://​www.wikihow.com/​Play-Carcassonne#​Placing-Tiles-and-Meeples|aici]] - mai ales pasul 1 din partea a 2-a.
  
-{{ ./​prolog/​gameplay.jpg?​500 |}} {{:​pic/​gameplay.jpg|Gameplay}}+{{ ./​prolog/​gameplay.jpg?​500 |}} 
 + 
 +/* {{:​pic/​gameplay.jpg|Gameplay}} ​*/
  
 În această temă ne vom ocupa în principal de: În această temă ne vom ocupa în principal de:
Line 41: Line 43:
 Pentru simplitate, în temă vom lucra doar cu **o parte din piese** față de jocul standard adevărat. Vom lucra cu aceste 16 piese: Pentru simplitate, în temă vom lucra doar cu **o parte din piese** față de jocul standard adevărat. Vom lucra cu aceste 16 piese:
  
-Piesa 1: {{:​pic/​01.jpg|Piesa 1}} Piesa 2: {{:​pic/​02.jpg|Piesa 2}} Piesa 3: {{:​pic/​03.jpg|Piesa 3}} Piesa 4: {{:​pic/​04.jpg|Piesa 4}}+Piesa 1: {{./​prolog/​01.jpg|Piesa 1}} Piesa 2: {{./​prolog/​02.jpg|Piesa 2}} Piesa 3: {{./​prolog/​03.jpg|Piesa 3}} Piesa 4: {{./​prolog/​04.jpg|Piesa 4}} 
 + 
 +Piesa 5: {{./​prolog/​05.jpg|Piesa 5}} Piesa 6: {{./​prolog/​06.jpg|Piesa 6}} Piesa 7: {{./​prolog/​07.jpg|Piesa 7}} Piesa 8: {{./​prolog/​08.jpg|Piesa 8}} 
 + 
 +Piesa 9: {{./​prolog/​09.jpg|Piesa 9}} Piesa 10: {{./​prolog/​10.jpg|Piesa 10}} Piesa 11: {{./​prolog/​11.jpg|Piesa 11}} Piesa 12: {{./​prolog/​12.jpg|Piesa 12}} 
 + 
 +Piesa 13: {{./​prolog/​13.jpg|Piesa 13}} Piesa 14: {{./​prolog/​14.jpg|Piesa 14}} Piesa 15: {{./​prolog/​15.jpg|Piesa 15}} Piesa 16: {{./​prolog/​16.jpg|Piesa 16}} 
 + 
 +/* Piesa 1: {{:​pic/​01.jpg|Piesa 1}} Piesa 2: {{:​pic/​02.jpg|Piesa 2}} Piesa 3: {{:​pic/​03.jpg|Piesa 3}} Piesa 4: {{:​pic/​04.jpg|Piesa 4}}
  
 Piesa 5: {{:​pic/​05.jpg|Piesa 5}} Piesa 6: {{:​pic/​06.jpg|Piesa 6}} Piesa 7: {{:​pic/​07.jpg|Piesa 7}} Piesa 8: {{:​pic/​08.jpg|Piesa 8}} Piesa 5: {{:​pic/​05.jpg|Piesa 5}} Piesa 6: {{:​pic/​06.jpg|Piesa 6}} Piesa 7: {{:​pic/​07.jpg|Piesa 7}} Piesa 8: {{:​pic/​08.jpg|Piesa 8}}
Line 47: Line 57:
 Piesa 9: {{:​pic/​09.jpg|Piesa 9}} Piesa 10: {{:​pic/​10.jpg|Piesa 10}} Piesa 11: {{:​pic/​11.jpg|Piesa 11}} Piesa 12: {{:​pic/​12.jpg|Piesa 12}} Piesa 9: {{:​pic/​09.jpg|Piesa 9}} Piesa 10: {{:​pic/​10.jpg|Piesa 10}} Piesa 11: {{:​pic/​11.jpg|Piesa 11}} Piesa 12: {{:​pic/​12.jpg|Piesa 12}}
  
-Piesa 13: {{:​pic/​13.jpg|Piesa 13}} Piesa 14: {{:​pic/​14.jpg|Piesa 14}} Piesa 15: {{:​pic/​15.jpg|Piesa 15}} Piesa 16: {{:​pic/​16.jpg|Piesa 16}}+Piesa 13: {{:​pic/​13.jpg|Piesa 13}} Piesa 14: {{:​pic/​14.jpg|Piesa 14}} Piesa 15: {{:​pic/​15.jpg|Piesa 15}} Piesa 16: {{:​pic/​16.jpg|Piesa 16}} */ 
 + 
 +/* []( [print("​Piesa "​+s+":​ ![Piesa "​+s+"​](pic/"​+s.rjust(2,'​0'​)+"​.jpg "Piesa "​+s+""​)"​) for s in [str(i) for i in range(1,​17)]] )
  
-[%%//%%]: <> ​([print("​Piesa "​+s+": ​![Piesa "​+s+"​](pic/"​+s.rjust(2,'​0'​)+"​.jpg ​"Piesa "​+s+"​")") for s in [str(i) for i in range(1,​17)]])+[]( [print("​Piesa "​+s+": ​{{ ./prolog/"​+s.rjust(2,'​0'​)+"​.jpg ​|Piesa "​+s+"​}}") for s in [str(i) for i in range(1,​17)]] ) */
  
 [imaginile de la [[https://​wikicarpedia.com/​index.php/​Base_game_(1st_edition)|https:​%%//​%%wikicarpedia.com/​index.php/​Base_game_(1st_edition)]] ] [imaginile de la [[https://​wikicarpedia.com/​index.php/​Base_game_(1st_edition)|https:​%%//​%%wikicarpedia.com/​index.php/​Base_game_(1st_edition)]] ]
Line 57: 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 74: Line 86:
   - reprezentarea piesei să nu fie direct derivată din numărul ei;   - reprezentarea piesei să nu fie direct derivată din numărul ei;
   - să puteți reprezenta și fiecare rotație a unei piese, dacă produce o configurație diferită de poziția originală (de exemplu, la piesa 16, toate rotațiile produc aceeași configurație).   - să puteți reprezenta și fiecare rotație a unei piese, dacă produce o configurație diferită de poziția originală (de exemplu, la piesa 16, toate rotațiile produc aceeași configurație).
 +
 +Puteți alege ce reprezentare doriți, folosind liste, tupluri, sau alți [[https://​en.wikipedia.org/​wiki/​Prolog_syntax_and_semantics#​Data_types|compuși]],​ acestea putând fi și imbricate, dacă doriți.
  
 Aveți de implementat următoarele predicate în Prolog, documentate și în sursă: Aveți de implementat următoarele predicate în Prolog, documentate și în sursă:
Line 89: 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 107: Line 121:
  
 </​code>​ </​code>​
-{{:​pic/​09.jpg|Piesa 9}}+{{./​prolog/​09.jpg|Piesa 9}} /* {{:​pic/​09.jpg|Piesa 9}} */
  
 Pentru piesa 3: Pentru piesa 3:
Line 119: Line 133:
  
 </​code>​ </​code>​
-{{:​pic/​03.jpg|Piesa 3}}+{{./​prolog/​03.jpg|Piesa 3}} /* {{:​pic/​03.jpg|Piesa 3}} */
  
 Și pentru piesa 16: Și pentru piesa 16:
Line 131: Line 145:
  
 </​code>​ </​code>​
-{{:​pic/​16.jpg|Piesa 16}}+{{./​prolog/​16.jpg|Piesa 16}} /* {{:​pic/​16.jpg|Piesa 16}} */
  
 ==== Rotire ==== ==== Rotire ====
Line 137: Line 151:
 Trebuie să putem roti piesele pentru a avea mai multe variante de plasare a lor pe tablă. Rotirea unei piese va produce o reprezentare diferită, ca și cum ar fi o piesă nouă. De exemplu, pentru piesa 2 avem următoarele rotiri **în sens trigonometric**:​ Trebuie să putem roti piesele pentru a avea mai multe variante de plasare a lor pe tablă. Rotirea unei piese va produce o reprezentare diferită, ca și cum ar fi o piesă nouă. De exemplu, pentru piesa 2 avem următoarele rotiri **în sens trigonometric**:​
  
-Piesa originală: {{:​pic/​02.jpg|Piesa 2}} Piesa rotită 1 dată: {{:​pic/​02r1.jpg|Piesa 2 rot 1}} Piesa rotită de 2 ori: {{:​pic/​02r2.jpg|Piesa 2 rot 2}} Piesa rotită de 3 ori: {{:​pic/​02r3.jpg|Piesa 2 rot 3}}+/* Piesa originală: {{:​pic/​02.jpg|Piesa 2}} Piesa rotită 1 dată: {{:​pic/​02r1.jpg|Piesa 2 rot 1}} Piesa rotită de 2 ori: {{:​pic/​02r2.jpg|Piesa 2 rot 2}} Piesa rotită de 3 ori: {{:pic/​02r3.jpg|Piesa 2 rot 3}} */ 
 + 
 +Piesa 2 originală: {{./​prolog/​02.jpg|Piesa 2}} Piesa rotită 1 dată: {{./​prolog/​02r1.jpg|Piesa 2 rot 1}} 
 + 
 +Piesa rotită de 2 ori: {{./​prolog/​02r2.jpg|Piesa 2 rot 2}} Piesa rotită de 3 ori: {{./prolog/​02r3.jpg|Piesa 2 rot 3}}
  
 La rotirea unei piese, reprezentarea trebuie să se schimbe corespunzător. De exemplu, dacă la piesa 2 original aveam drum spre sud și cetate în rest, piesa 2 rotită de 3 ori în sens trigonometric va avea drumul spre vest și va fi afișată ca: La rotirea unei piese, reprezentarea trebuie să se schimbe corespunzător. De exemplu, dacă la piesa 2 original aveam drum spre sud și cetate în rest, piesa 2 rotită de 3 ori în sens trigonometric va avea drumul spre vest și va fi afișată ca:
Line 163: 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 170: 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 ===== 
 + 
 +  * [[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 ===== 
 + 
 +  * 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.1683578080.txt.gz · Last modified: 2023/05/08 23:34 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