This shows you the differences between two versions of the page.
poo-ca-cd:teme:2025:8e211bfe-f6eb-467c-9e54-f8e6df4c1535:tema-1 [2025/10/04 02:33] ioana.tudorache2507 [getEnergyStatus] |
poo-ca-cd:teme:2025:8e211bfe-f6eb-467c-9e54-f8e6df4c1535:tema-1 [2025/10/04 16:40] (current) ioana.tudorache2507 |
||
---|---|---|---|
Line 76: | Line 76: | ||
Detaliile privind mișcările și acțiunile robotului, precum și schimbările automate ale mediului, sunt descrise în secțiunea [[https://ocw.cs.pub.ro/courses/poo-ca-cd/teme/2025/8e211bfe-f6eb-467c-9e54-f8e6df4c1535/tema-1#comenzi| Comenzi]] | Detaliile privind mișcările și acțiunile robotului, precum și schimbările automate ale mediului, sunt descrise în secțiunea [[https://ocw.cs.pub.ro/courses/poo-ca-cd/teme/2025/8e211bfe-f6eb-467c-9e54-f8e6df4c1535/tema-1#comenzi| Comenzi]] | ||
- | ==== Pașii unei simulări ==== | + | ==== Pașii unei simulări ==== |
+ | |||
+ | - Se înregistrează toate modificările mediului și poziția robotului | ||
+ | - Robotul scanează obiectul de pe celula curentă | ||
+ | * Dacă este o plantă, aceasta se adaugă în inventar | ||
+ | - Se descoperă un fact despre obiectul scanat | ||
+ | * Fact-ul descoperit prin scanare este stocat în baza de date a robotului | ||
+ | - Se primește comandă de tip `improve` pentru mediu | ||
+ | * Se efectuează doar dacă | ||
+ | * S-a învățat metoda respectivă de improvement | ||
+ | * Robotul are elementele necesare în inventar (acestea sunt enumerate tot în fact-ul învățat) | ||
+ | * //Hint: Practic e ca un fel de rețetă, trebuie să o cunoști și să ai ingredientele necesare ca să poți face improve.// | ||
+ | * Se actulizeaza noii parametrii pentru mediul de pe pătrățica/celula curentă | ||
+ | - Se primește comandă de tip `explore` | ||
+ | * Se calculează scorul de calitate pentru celulele adiacente (vezi mai jos cum se calculează) | ||
+ | * Robotul se deplasează pe celula cu cel mai bun scor | ||
+ | * Energia bateriei scade conform formule | ||
+ | - Se actualizează datele pentru hartă - se înregistrează toate modificările mediului și poziția robotului | ||
+ | * Intai se actualizeaza parametrii pt mediu - **air, soil, water (in aceasta ordine)** - si **apoi plantele si animalele (in aceasta ordine)** | ||
+ | |||
+ | |||
+ | Pentru interactiunile ce se fac automat la fiecare comanda, avem urmatoarele frecvente pentru cand au loc: | ||
+ | |||
+ | | **Interactiune** | **Frecventa** | | ||
+ | | Water → Soil | După 2 iterații | | ||
+ | | Water → Air | După 2 iterații | | ||
+ | | Water → Animal | După ce sursa de apă este scanată de robot (verificat la fiecare iterație) | | ||
+ | | Water → Plant | La fiecare iterație | | ||
+ | | Air → Animal | Când calitatea aerului devine toxică (verificat la fiecare iterație) | | ||
+ | | Soil → Plant | La fiecare iterație | | ||
+ | | Animal → Plant | După ce planta este scanată | | ||
+ | | Animal → Water | După ce sursa de apă este scanată de robot (verificat la fiecare iterație) | | ||
+ | | Animal → Soil | Când ajunge în starea well-fed (verificat la fiecare iterație) | | ||
+ | | Plant → Air | La fiecare iterație | | ||
<note important> **Observații și reguli importante** | <note important> **Observații și reguli importante** | ||
Line 92: | Line 126: | ||
===== Entități ===== | ===== Entități ===== | ||
+ | |||
+ | |||
+ | O entitate reprezinta ce alcatuieste si ce exista pe un patratel. Aceasta poate sa fie unul dintre cele 5 tipuri - Plant, Animal, Air, Water, Soil. Toate au un nume si o masa. Acestea interactioneaza intre ele si isi modifica statusul sau calitatea pe masura ce simularea avanseaza. | ||
+ | |||
+ | Pentru fiecare entitate, campul de mass reprezinta lucruri diferite: | ||
+ | * soil - greutatea totală a solului | ||
+ | * air - greutatea tuturor gazelor gasite in acel tip de aer | ||
+ | * water - greutatea apei lichide dintr-un rezervor (lac, rau, iaz) | ||
+ | * animal - greutatea animalului | ||
+ | * plant - biomasa plantei | ||
==== Plant ==== | ==== Plant ==== | ||
+ | Tipurile de plante sunt impartite in 5 categorii: | ||
+ | |||
+ | * FloweringPlants | ||
+ | * GymnospermsPlants | ||
+ | * Ferns | ||
+ | * Mosses | ||
+ | * Algae | ||
+ | |||
+ | |||
+ | In functie de tip si maturitate, fiecare planta va genera o anumita cantitatea de oxigen in aer: | ||
+ | * young - produce +0.2 O2 | ||
+ | * mature - produce +0.7 O2, ofera umbra plantelor vecine | ||
+ | * old - produce +0.4 O2 | ||
+ | |||
+ | | **Categorie** | **Oxigen** | | ||
+ | | FloweringPlants | 6.0 | | ||
+ | | GymnospermsPlants | 0 | | ||
+ | | Ferns | 0 | | ||
+ | | Mosses | 0.8 | | ||
+ | | Algae | 0.5 | | ||
+ | |||
+ | |||
+ | <note important> | ||
+ | O planta creste atunci cand rata de crestere ajunge la 1, adunate din stimularea generate de apa si sol | ||
+ | * young -> mature | ||
+ | * mature -> old | ||
+ | * old -> death **(se sterge planta de pe patratica)** | ||
+ | </note> | ||
+ | |||
+ | |||
+ | === Interactiuni cu mediul === | ||
+ | |||
+ | O planta are 2 posibile efecte: | ||
+ | * crește nivelul de oxigen din aer (interactioneaza cu aerul) | ||
+ | * oferă umbră plantelor vecine si scade temperatura aerului de pe acele celule cu 0.1 (interactioneaza cu planta) | ||
+ | \\ | ||
+ | === Calitate planta === | ||
+ | |||
+ | Calitatea unei plante este calculat in functie de cantitatea de oxigen generata. | ||
+ | |||
+ | * ''%%oxygenProduced = sum(oxigen_per_type + oxigen_per_status)%%'' | ||
+ | * ''%%plantQuality = (oxygenProduced / 2.5) * 100%%'' | ||
+ | |||
+ | \\ | ||
+ | === Posibilitatea de a bloca TerraBot === | ||
+ | |||
+ | |||
+ | Fiecare categorie de planta are un procentaj pentru cat de probabil este ca robotelul sa se agate in ele: | ||
+ | |||
+ | |||
+ | | **Tip** | **Posibilitate** | | ||
+ | | Flowering Plants (Angiosperms) | 90% | | ||
+ | | Gymnosperms | 60% | | ||
+ | | Ferns | 30% | | ||
+ | | Mosses | 40% | | ||
+ | | Algae | 20% | | ||
+ | |||
+ | \\ | ||
==== Animal ==== | ==== Animal ==== | ||
+ | |||
+ | Animalele se vor misca constant pe harta si vor manca plantele intalnite, ce le vor ajuta sa produca ingrasamant si sa imbunatateasca calitatea solului. | ||
+ | |||
+ | |||
+ | Un animal poate avea una din urmatoarele stari: | ||
+ | * hungry - daca nu mananca sau nu bea apa, nu va produce ingrasamant | ||
+ | * well-fed - va produce ingrasamant, se intampla dupa ce mananca o planta **sau** bea apa, daca exista | ||
+ | * sick - daca aerul devine toxic, nu produce ingrasamant | ||
+ | |||
+ | \\ | ||
+ | |||
+ | === Reguli pentru status well-fed === | ||
+ | |||
+ | Un animal devine well-fed daca se indeplineste una din cele 2 conditii: | ||
+ | * mananca o planta | ||
+ | * bea apa | ||
+ | |||
+ | Daca se indeplineste doar o conditie, atunci se va produce cantitatea default de **0.5 ingrasamant**. | ||
+ | Daca se indeplinesc amandoua, atunci va fi un **bonus de +0.3 ingrasamant** de la apa. | ||
+ | |||
+ | |||
+ | <note important>Se vor efectua aceste actiuni doar daca exista pe patratica curenta si au fost scanate de robot anterior. | ||
+ | Se va scadea din cantitatea de apa de la sursa si se va creste masa animalului. | ||
+ | |||
+ | * waterToDrink = Math.min(animal_mass * intake_rate, intake_rate = 0.08, water_mass) | ||
+ | * animal_mass += waterToDrink + plant_mass | ||
+ | * water_mass -= waterToDrink | ||
+ | </note> | ||
+ | |||
+ | <note important> | ||
+ | **Exceptie** -> **DOAR** pentru **Carnivores** si **Parasites** exista posibilitatea **sa manance / omoare un alt animal** atunci cand cauta sa se mute pe o alta casuta unde exista deja animal si va deveni **well-fed**. | ||
+ | |||
+ | * animal_mass += prey_mass | ||
+ | * **animalul mancat va disparea cu totul de pe harta** | ||
+ | </note> | ||
+ | |||
+ | \\ | ||
+ | === Miscarea pe harta === | ||
+ | |||
+ | * animalul se muta pe una din patratelele vecine | ||
+ | * alege patratica in functie de | ||
+ | * unde e planta | ||
+ | * unde e apa | ||
+ | * unde e apa mai buna | ||
+ | * **se va muta la fiecare 2 iteratii** (la 2 comenzi primite / 2 timestamp uri) | ||
+ | |||
+ | <note important> | ||
+ | Un animal **NU are voie sa se mute pe o patratica unde exista deja un animal**. Daca nu exista casuta vecina fara animal, atunci acesta va sta pe loc, **exceptie tipul de animale //Carnivores// si //Parasites//, care pot manca/ omori animalul existent.** | ||
+ | </note> | ||
+ | \\ | ||
+ | === Interactiuni cu mediul === | ||
+ | |||
+ | Un animal poate face urmatoarele actiuni: | ||
+ | * să mănânce o plantă | ||
+ | * să bea apă | ||
+ | * să crească //organicMatter// pentru sol cu cantitatea de ingrăsămant produsă | ||
+ | |||
+ | |||
+ | Un animal va **manca planta de pe patratica curenta** odata ce **este scanata de robot**. Asta va determina **planta sa moara** si sa **se schimbe calitatea aerului**. Statusul pentru animal se va schimba in **well-fed** si **va produce ingrasamant**. | ||
+ | |||
+ | <note important> | ||
+ | Orice animal **produce 0.5 ingrasamant + eventuale stimulari** pentru crestearea cantitatii (exemplu: bea apa) | ||
+ | </note> | ||
+ | |||
+ | \\ | ||
+ | === Posibilitatea de a ataca TerraBot === | ||
+ | |||
+ | | **Tip** | **Posibilitate** | | ||
+ | | Herbivores | 85% | | ||
+ | | Carnivores | 30% | | ||
+ | | Omnivores | 60% | | ||
+ | | Detritivores | 90% | | ||
+ | | Parasites | 10% | | ||
+ | |||
+ | \\ | ||
==== Water ==== | ==== Water ==== | ||
+ | == Interactiuni cu mediul == | ||
+ | |||
+ | Apa interactioneaza cu toate celelalte entitati: | ||
+ | * soil -> creste //moisture// pt sol cu 0.1 la 2 iteratii | ||
+ | * air -> creste humidity pt aerul cu 0.1 la 2 iteratii | ||
+ | * animal -> ajuta un animal sa produca mai mult ingrasamant cu 0.3 | ||
+ | * se va scadea cantitatea bauta din //mass// dupa ce sursa de apa a fost scanata | ||
+ | * plant -> ajuta sa creasca o plantă cu 0.2 | ||
+ | |||
+ | == Calitate apa == | ||
+ | |||
+ | * normalizare factori | ||
+ | * purity_score = purity / 100 | ||
+ | * pH_score = 1 - abs(pH - 7.5) / 7.5 | ||
+ | * temp_score = 1 - abs(temperature - 17.5) / 17.5 | ||
+ | * salinity_score = 1 - (salinity / 350) | ||
+ | * turbidity_score = 1 - (turbidity / 100) | ||
+ | * contaminant_score = 1 - (contaminantIndex / 100) | ||
+ | * frozen_score = isFrozen ? 0 : 1 | ||
+ | * WaterQuality = 0.3 * purity_score + 0.2 * pH_score + 0.1 * temp_score + 0.15 * salinity_score + 0.1 * turbidity_score + 0.15 * contaminant_score + 0.2 * frozen_score | ||
+ | * WaterQuality% = WaterQuality * 100 | ||
+ | * interpretare | ||
+ | * 70–100% -> good | ||
+ | * 40–70% -> moderate | ||
+ | * <40% -> poor | ||
==== Soil ==== | ==== Soil ==== | ||
- | ==== Air ==== | + | Solul are rol de a ajuta plantele sa creasca. Acesta isi pota imbunatati calitatea daca absoarbe apa sau primeste ingrasamant. |
+ | === Interactiuni cu mediul === | ||
+ | |||
+ | Apa interactioneaza doar cu plantele si sursa de apa: | ||
+ | * ajuta o planta sa creasca cu 0.3 la fiecare iteratie | ||
+ | * absoarbe 0.2 apa daca exista sursa de apa pe patratica la fiecare 3 iteratii | ||
+ | |||
+ | === Calitate sol === | ||
+ | |||
+ | Se ia in functie de tipul de sol: | ||
+ | * ForestSoil | ||
+ | * double leafLitter | ||
+ | * (nitrogen * 1.2) + (organicMatter * 2) + (waterRetention * 1.5) + (leafLitter * 0.3) | ||
+ | * SwampSoil | ||
+ | * double waterLogging | ||
+ | * (nitrogen * 1.1) + (organicMatter * 2.2) - (waterLogging * 5) | ||
+ | * DesertSoil | ||
+ | * double salinity | ||
+ | * (nitrogen * 0.5) + (waterRetention * 0.3) - (salinity * 2) | ||
+ | * GrasslandSoil | ||
+ | * double rootDensity | ||
+ | * (nitrogen * 1.3) + (organicMatter * 1.5) + (rootDensity * 0.8) | ||
+ | * TundraSoil | ||
+ | * double permafrostDepth | ||
+ | * (nitrogen * 0.7) + (organicMatter * 0.5) - (permafrostDepth * 1.5) | ||
+ | * double normalizeScore = Math.max(0, Math.min(100, score)) | ||
+ | * interpretare: | ||
+ | * 70–100% -> good | ||
+ | * 40–70% -> moderate | ||
+ | * <40% -> poor | ||
+ | |||
+ | === Posibilitatea de a bloca TerraBot === | ||
+ | |||
+ | //TODO tabel cu formule ca dispare restul de pagina cand il inserez | ||
+ | |||
+ | ==== Air ==== | ||
+ | //TODO | ||
===== Comenzi ===== | ===== Comenzi ===== | ||
Line 152: | Line 390: | ||
* ''%%"Simulation has ended."%%'' | * ''%%"Simulation has ended."%%'' | ||
- | * ''%%"ERROR: Simulation already started. Cannot perform action"%%'' | + | * ''%%"ERROR: Simulation not started. Cannot perform action"%%'' |
== Input == | == Input == | ||
Line 197: | Line 435: | ||
* ''%%"The weather has changed."%%'' | * ''%%"The weather has changed."%%'' | ||
* ''%%"ERROR: The weather change does not affect the environment. Cannot perform action"%%'' | * ''%%"ERROR: The weather change does not affect the environment. Cannot perform action"%%'' | ||
- | * ''%%"ERROR: Simulation already started. Cannot perform action"%%'' | + | * ''%%"ERROR: Simulation not started. Cannot perform action"%%'' |
== Input == | == Input == | ||
Line 248: | Line 486: | ||
\\ | \\ | ||
==== Comenzi pentru TerraBot ==== | ==== Comenzi pentru TerraBot ==== | ||
+ | |||
+ | === moveRobot=== | ||
+ | |||
+ | * **consuma energie** | ||
+ | * robotul se va muta pe patratelul cu scorul de calitate cel mai bun | ||
+ | * nu se poate explora mai departe de dimensiunea maxima a matricei | ||
+ | * se verifica daca robotul are suficienta baterie pt a se putea muta | ||
+ | * se poate trece in timpul simularii prin aceeasi patratica | ||
+ | * consumul de baterie pentru mutare este raportat la scorul de calitate | ||
+ | |||
+ | <note important>Robotelul nu poate sa ramana pe patratica curenta. Daca acesta mai are suficienta baterie pentru a efectua mutarea, atunci trebuie sa aleaga neaparat una dintre patratelele vecine</note> | ||
+ | |||
+ | == Deplasare robot == | ||
+ | |||
+ | Se va duce pe patratelul cu scorul de calitate cel mai bun //(normalizat, de la 0 la 100, 100 find 0 scor la toate)// | ||
+ | * ordinea in care se verifica celulele: **sus, dreapta, jos, stanga** | ||
+ | * pentru calcularea scorului, se vor lua in considerare urmatoarele lucruri | ||
+ | * **PossibilityToGetStuckInSoil** | ||
+ | * pt fiecare categorie de sol, se ia procentul de a ramane blocat in el (sectiune Soil) | ||
+ | * **PossibilityToGetDamagedByAir** | ||
+ | * pt fiecare tip de aer, se iau valorile specifice si se inlocuiesc in formulele date (sectiune Air) | ||
+ | * **PossibilityToBeAttackedByAnimal** | ||
+ | * pt fiecare categorie de animale, se ia procentul de a fi atacat de ele (sectiune Animal) | ||
+ | * **PossibiltyToGetStuckInPlants** | ||
+ | * pt fiecare categorie de plante, se ia procentul de a ramane blocat in ele (sectiune Plant) | ||
+ | * **scorul final se calculeaza ca si medie aritmetica din cele 4 scori pentru fiecare posibilitate** | ||
+ | * i se va scadea din baterie conform procentului overall calculat dupa formula de mai jos | ||
+ | |||
+ | <note important> | ||
+ | Daca se obtine acelasi scor de calitate pentru una sau mai multe celule sau celula obtinuta este in afara hartii, atunci se alege prima din ordine in care s-au verificat celulele. | ||
+ | |||
+ | Se va verifica ca robotul are suficienta baterie pentru a efectua mutarea. | ||
+ | </note> | ||
+ | |||
+ | == Baterie robot== | ||
+ | |||
+ | Robotul poate sa ramana fara baterie inainte sa se mute pe alta patratica | ||
+ | * daca robotul nu mai are baterie **el nu se va deplasa pana cand nu se primeste comada rechargeBatery** pentru a-si incarca bateria, dar **restul pasilor se vor executa**, inclusiv cei de analiza si **functionalitatile automate** din spate | ||
+ | * bateria se va consuma pentru fiecare miscare a robotului pe alta celula | ||
+ | |||
+ | <note tip> | ||
+ | **Exemplu** | ||
+ | |||
+ | Scor total de calitate pasul trecut = 48% -> 10 * 48% = 4.8 -> rount_to_ceil(4.8) -> 5, deci se vor scadea 5 unitati din baterie | ||
+ | |||
+ | </note> | ||
+ | |||
+ | Mesaje posibile pentru aceasta comanda: | ||
+ | |||
+ | * ''%%"The robot has successfully moved to position ${(coord_X, coord_Y)}."%%'' | ||
+ | * ''%%"ERROR: Robot still charging. Cannot perform action"%%'' | ||
+ | * ''%%"ERROR: Simulation not started. Cannot perform action"%%'' | ||
+ | |||
+ | |||
+ | |||
+ | == Input == | ||
+ | |||
+ | <spoiler Click pentru input moveRobot> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "moveRobot", | ||
+ | "timestamp": 2 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | <spoiler Click pentru output moveRobot> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "moveRobot", | ||
+ | "message": "The robot has successfully moved to position (0,2)." | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | \\ | ||
+ | |||
+ | |||
+ | === rechargeBatery=== | ||
+ | |||
+ | * se pune pauza simularii curente in derulare pentru ca robotelul sa se incarce unde se afla in mod curent (are panouri solare 😎) | ||
+ | * se incarca numarul de puncte de energie primite la input (**1 punct de energie = 1min de incarcare**) | ||
+ | * exemplu: daca se da aceasta **comanda la timestamp 5** pentru **20 de puncte de energie**, atunci urmatoarea comanda care poate fi **efectuata va fi la timestamp 25** | ||
+ | |||
+ | <note important> | ||
+ | ** Nu se poate pune pauza daca o simulare tocmai s-a incheiat.** | ||
+ | |||
+ | Daca nu s-a terminat incarcarea, se va returna eroare ca robotelul este inca la incarcat pentru orice comanda pentru robot data in aceasta perioada. | ||
+ | </note> | ||
+ | |||
+ | |||
+ | Mesaje posibile pentru aceasta comanda: | ||
+ | |||
+ | * ''%%"The simulation was paused until charging is finished."%%'' | ||
+ | * ''%%"ERROR: Robot still charging. Cannot perform action"%%'' | ||
+ | * ''%%"ERROR: Simulation not started. Cannot perform action"%%'' | ||
+ | |||
+ | |||
+ | == Input == | ||
+ | |||
+ | <spoiler Click pentru input rechargeBatery> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "rechargeBatery", | ||
+ | "timeToCharge": 20, | ||
+ | "timestamp": 10 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | <spoiler Click pentru output rechargeBatery> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "rechargeBatery", | ||
+ | "message": "The simulation was paused until charging is finished.", | ||
+ | "timestamp": 10 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | \\ | ||
+ | |||
+ | === scanObject=== | ||
+ | |||
+ | * **consuma energie** | ||
+ | * scanează un obiect (plantă, animal, apa) și salvează rezultatul (se salveaza in baza de date si in inventar) | ||
+ | * se cauta in harta salvata pentru sectiunea curenta de teritoriu daca exista un obiect de tipul respectiv pt scanat (**nu este garantat ca se gaseste pe harta**) | ||
+ | * consuma **7 puncte energie** | ||
+ | |||
+ | Robotelul scaneaza obiectele de pe patratica curenta si determina tipul acestuia in functie de 3 parametrii: | ||
+ | * color | ||
+ | * smell | ||
+ | * sound | ||
+ | |||
+ | Combinatiile de parametrii pentru obiecte: | ||
+ | * none + none + none = water | ||
+ | * pink + sweet + none = plant | ||
+ | * brown + earthy + muuu = animal | ||
+ | |||
+ | |||
+ | <note important> | ||
+ | Se va verifica in baza de date ca exista pe patratica acel tip de obiect. Daca da, se returneaza restul de detalii pentru el si robotul va salva in baza de date si in inventarul sau noul obiect gasit. Daca nu, se va returna eroare. | ||
+ | </note> | ||
+ | |||
+ | |||
+ | <note important> | ||
+ | **Un obiect incepe sa existe abia dupa ce a fost scanat**. Asadar, o planta/ animal vor incepe sa isi schimbe statusul doar dupa ce au fost scanate | ||
+ | |||
+ | Exemplu: un animal nu poate sa manance planta de pe patratica curenta pana aceasta nu a fost scanata. | ||
+ | </note> | ||
+ | |||
+ | |||
+ | Mesaje posibile pentru aceasta comanda: | ||
+ | |||
+ | * ''%%"The scanned object is ${type_of_entity}"%%'' | ||
+ | * ''%%"ERROR: Object not found. Cannot perform action"%%'' | ||
+ | * ''%%"ERROR: Simulation not started. Cannot perform action"%%'' | ||
+ | |||
+ | |||
+ | == Input == | ||
+ | |||
+ | <spoiler Click pentru input scanObject> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "scanObject", | ||
+ | "color": "none", | ||
+ | "smell": "none", | ||
+ | "sound": "none", | ||
+ | "timestamp": 4 | ||
+ | }, | ||
+ | { | ||
+ | "command": "scanObject", | ||
+ | "color": "pink", | ||
+ | "smell": "sweet", | ||
+ | "sound": "none", | ||
+ | "timestamp": 5 | ||
+ | }, | ||
+ | { | ||
+ | "command": "scanObject", | ||
+ | "color": "brown", | ||
+ | "smell": "earthy", | ||
+ | "sound": "muu", | ||
+ | "timestamp": 6 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | <spoiler Click pentru output scanObject> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "scanObject", | ||
+ | "message": "The scanned object is water.", | ||
+ | "timestamp": 4 | ||
+ | }, | ||
+ | { | ||
+ | "command": "scanObject", | ||
+ | "message": "The scanned object is a plant.", | ||
+ | "timestamp": 5 | ||
+ | }, | ||
+ | { | ||
+ | "command": "scanObject", | ||
+ | "message": "The scanned object is an animal.", | ||
+ | "timestamp": 6 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | \\ | ||
+ | |||
+ | === learnFact=== | ||
+ | |||
+ | * **consuma energie** | ||
+ | * adauga un nou fapt stiintific sub un anumit subiect | ||
+ | * se primeste un subiect si componentele pentru acel subiect, mai multe detalii la comanda de //improveEnvironment// | ||
+ | * consuma **2 puncte energie** | ||
+ | |||
+ | <note tip> | ||
+ | Exemplu | ||
+ | |||
+ | Daca TerraBot a descoperit (scanat) o planta noua **RedAlgae** si se primeste comanda de //learnFact// ce include in **subiect** RedAlgae, va cauta in obiectele salvate daca exita aceasta planta. Daca da, va salva informatia data sub numele / subiectul acestei plante. | ||
+ | </note> | ||
+ | |||
+ | <note important> | ||
+ | **Nu se pot invata facts pana cand nu TerraBot nu a scanat acel obiect** | ||
+ | </note> | ||
+ | |||
+ | Mesaje posibile pentru aceasta comanda: | ||
+ | |||
+ | * ''%%"The fact has been successfully saved in the database."%%'' | ||
+ | * ''%%"ERROR: Subject not yet saved. Cannot perform action"%%'' | ||
+ | * ''%%"ERROR: Simulation not started. Cannot perform action"%%'' | ||
+ | |||
+ | == Input == | ||
+ | |||
+ | <spoiler Click pentru input learnFact> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "learnFact", | ||
+ | "subject": "Method to plant RedAlgae", | ||
+ | "components": "RedAlgae", | ||
+ | "timestamp": 4 | ||
+ | }, | ||
+ | { | ||
+ | "command": "learnFact", | ||
+ | "subject": "Characteristic of RedAlgae", | ||
+ | "components": "RedAlgae", | ||
+ | "timestamp": 5 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | <spoiler Click pentru output learnFact> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "learnFact", | ||
+ | "message": "The fact has been successfully saved in the database.", | ||
+ | "timestamp": 4 | ||
+ | }, | ||
+ | { | ||
+ | "command": "learnFact", | ||
+ | "message": "The fact has been successfully saved in the database.", | ||
+ | "timestamp": 5 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | \\ | ||
+ | |||
+ | === improveEnvironment=== | ||
+ | * **consuma energie** | ||
+ | * robotul incearca sa imbunateasca **mediul de pe patratica curenta** pentru a putea face planeta locuibila | ||
+ | * consuma **10 puncte energie** | ||
+ | |||
+ | \\ | ||
+ | Putem avea 4 tipuri de improvement: | ||
+ | * **plantVegetation** | ||
+ | * ''%%+0.3 oxigen%%'' pentru aer fata de cantitatea curenta | ||
+ | * **fertilizeSoil** | ||
+ | * ''%%+0.3 organicMatter%%'' pentru soil | ||
+ | * **increaseHumidity** | ||
+ | * ''%%+0.2 humidity%%'' la aer | ||
+ | * **increaseMoisture** | ||
+ | * ''%%+0.2 waterRetention%%'' pentru apa | ||
+ | |||
+ | <note important> | ||
+ | Ca sa se efectueze comanda cu succes, trebuie sa fie indeplinite **2 conditii**: | ||
+ | * sa se stie metoda prin care se realizeaza improvement-ul | ||
+ | * trebuie sa existe salvat **un fact de "Method for X"** ca se poata face **improvementul X** | ||
+ | * robotul **sa aiba in inventar toate componentele** necesare pentru improvement | ||
+ | </note> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Mesaje posibile pentru aceasta comanda: | ||
+ | |||
+ | * ''%%"The ${plant_name} was planted successfully."%%'' | ||
+ | * ''%%"The ${improved_entity} was successfully ${fertilized /increased } using ${component_name}"%%'' | ||
+ | * ''%%"ERROR: Subject not yet saved. Cannot perform action"%%'' | ||
+ | * ''%%"ERROR: Fact not yet saved. Cannot perform action"%%'' | ||
+ | * ''%%"ERROR: Simulation not started. Cannot perform action"%%'' | ||
+ | |||
+ | == Input == | ||
+ | |||
+ | <spoiler Click pentru input improveEnvironment> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "improveEnvironment", | ||
+ | "improvementType": "plantVegetation", | ||
+ | "type": "Algae", | ||
+ | "name": "RedAlgae", | ||
+ | "timestamp": 6 | ||
+ | }, | ||
+ | { | ||
+ | "command": "improveEnvironment", | ||
+ | "improvementType": "fertilizeSoil", | ||
+ | "type": "Herbivores", | ||
+ | "name": "Cow", | ||
+ | "timestamp": 7 | ||
+ | }, | ||
+ | { | ||
+ | "command": "improveEnvironment", | ||
+ | "improvementType": "increaseHumidity", | ||
+ | "type": "river", | ||
+ | "name": "Blue River", | ||
+ | "timestamp": 8 | ||
+ | }, | ||
+ | { | ||
+ | "command": "improveEnvironment", | ||
+ | "improvementType": "increaseMoisture", | ||
+ | "type": "river", | ||
+ | "name": "Blue River", | ||
+ | "timestamp": 9 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | <spoiler Click pentru output improveEnvironment> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "improveEnvironment", | ||
+ | "message": "The RedAlgae was planted successfully.", | ||
+ | "timestamp": 6 | ||
+ | }, | ||
+ | { | ||
+ | "command": "improveEnvironment", | ||
+ | "message": "The soil was successfully fertilized using Cow.", | ||
+ | "timestamp": 7 | ||
+ | }, | ||
+ | { | ||
+ | "command": "improveEnvironment", | ||
+ | "message": "The humidity was successfully increased using Blue River.", | ||
+ | "timestamp": 8 | ||
+ | }, | ||
+ | { | ||
+ | "command": "improveEnvironment", | ||
+ | "message": "The moisture was successfully increased using Blue River.", | ||
+ | "timestamp": 9 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | \\ | ||
==== Comenzi de debug ==== | ==== Comenzi de debug ==== | ||
Line 295: | Line 906: | ||
* componenta aerului | * componenta aerului | ||
+ | |||
+ | == Input == | ||
+ | |||
+ | <spoiler Click pentru input printEnvConditions> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "printEnvConditions", | ||
+ | "timestamp": 5 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | <spoiler Click pentru output printEnvConditions> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "printEnvConditions", | ||
+ | "output" : { | ||
+ | "soil": { | ||
+ | "type": "ForestSoil", | ||
+ | "nitrogen": 3.2, | ||
+ | "waterRetention": 0.55, | ||
+ | "soilpH": 6.8, | ||
+ | "organicMatter": 0.4, | ||
+ | "leafLitter": 0.3 | ||
+ | }, | ||
+ | "plant": { | ||
+ | "type": "Algae", | ||
+ | "name": "RedAlgae", | ||
+ | }, | ||
+ | "animal": { | ||
+ | "type": "Herbivores", | ||
+ | "name": "Cow" | ||
+ | }, | ||
+ | "water": { | ||
+ | "type": "lake", | ||
+ | "purity": 92.0, | ||
+ | "salinity": 0.5, | ||
+ | "turbidity": 4, | ||
+ | "contaminantIndex": 1.5, | ||
+ | "pH": 6.8, | ||
+ | "isFrozen": false, | ||
+ | }, | ||
+ | "air": { | ||
+ | "type": "Tropical Air", | ||
+ | "mass": 1500000.0, | ||
+ | "humidity": 85.0, | ||
+ | "temperature": 30.5, | ||
+ | "oxygenLevel": 21, | ||
+ | "co2Level": 400.0 | ||
+ | } | ||
+ | }, | ||
+ | "timestamp": 5 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | \\ | ||
==== printMap==== | ==== printMap==== | ||
Line 302: | Line 972: | ||
* calitatea solului | * calitatea solului | ||
+ | Mesaje posibile pentru aceasta comanda: | ||
+ | * ''%%"Simulation has ended."%%'' | ||
+ | * ''%%"ERROR: Simulation not started. Cannot perform action"%%'' | ||
+ | |||
+ | == Input == | ||
+ | |||
+ | <spoiler Click pentru input printMap> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "printMap", | ||
+ | "timestamp": 23 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | <spoiler Click pentru output printMap> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "printMap", | ||
+ | "output": [ | ||
+ | { | ||
+ | "section": [0,0], | ||
+ | "totalNrOfObjects": 1, | ||
+ | "airQuality": "good", | ||
+ | "soilQuality": "good" | ||
+ | }, | ||
+ | { | ||
+ | "section": [0,1], | ||
+ | "totalNrOfObjects": 0, | ||
+ | "airQuality": "good", | ||
+ | "soilQuality": "good" | ||
+ | }, | ||
+ | { | ||
+ | "section": [0,2], | ||
+ | "totalNrOfObjects": 2, | ||
+ | "airQuality": "moderate", | ||
+ | "soilQuality": "good" | ||
+ | }, | ||
+ | { | ||
+ | "section": [1,0], | ||
+ | "totalNrOfObjects": 0, | ||
+ | "airQuality": "poor", | ||
+ | "soilQuality": "poor" | ||
+ | }, | ||
+ | { | ||
+ | "section": [1,1], | ||
+ | "totalNrOfObjects": 3, | ||
+ | "airQuality": "good", | ||
+ | "soilQuality": "good" | ||
+ | }, | ||
+ | { | ||
+ | "section": [1,2], | ||
+ | "totalNrOfObjects": 1, | ||
+ | "airQuality": "moderate", | ||
+ | "soilQuality": "poor" | ||
+ | }, | ||
+ | { | ||
+ | "section": [2,0], | ||
+ | "totalNrOfObjects": 2, | ||
+ | "airQuality": "good", | ||
+ | "soilQuality": "moderate" | ||
+ | }, | ||
+ | { | ||
+ | "section": [2,1], | ||
+ | "totalNrOfObjects": 3, | ||
+ | "airQuality": "moderate", | ||
+ | "soilQuality": "good" | ||
+ | }, | ||
+ | { | ||
+ | "section": [2,2], | ||
+ | "totalNrOfObjects": 0, | ||
+ | "airQuality": "poor", | ||
+ | "soilQuality": "poor" | ||
+ | } | ||
+ | ], | ||
+ | "timestamp": 23 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | \\ | ||
==== printKnowledgeBase==== | ==== printKnowledgeBase==== | ||
- | * afiseaza pentru fiecare tip de obiect fact-urile invata | + | * afiseaza pentru fiecare tip de entitate fact-urile invatate |
- | * exemplu: s-a scanat si invatat despre red algae, se printeaza toate facts despre red algae | + | * exemplu: s-a scanat si invatat despre RedAlgae, se printeaza toate facts despre RedAlgae |
+ | |||
+ | == Input == | ||
+ | |||
+ | <spoiler Click pentru input printKnowledgeBase> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "printKnowledgeBase", | ||
+ | "timestamp": 17 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | <spoiler Click pentru output printKnowledgeBase> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "printKnowledgeBase", | ||
+ | "output" : [ | ||
+ | { | ||
+ | "topic": "red algae", | ||
+ | "facts": [ | ||
+ | { | ||
+ | "subject": "Method to plant red algae", | ||
+ | "components": "RedAlgae" | ||
+ | }, | ||
+ | { | ||
+ | "subject": "Characteristic of red algae", | ||
+ | "components": "RedAlgae" | ||
+ | } | ||
+ | ] | ||
+ | } | ||
+ | ], | ||
+ | "timestamp": 17 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | \\ | ||
===== Exemplu simulare ===== | ===== Exemplu simulare ===== | ||