This is an old revision of the document!


Tema 3 – Liga Boților (C++)

🤖 Liga Boților - Arena Studenților ⚔️

Construiește un motor de simulare pentru o arenă tactică în care echipele de boți concurează pentru energie, teritoriu și puncte de stil. Formatul este 100% comandă-per-linie, astfel încât output-ul tău poate fi redat ca input pentru un alt student – perfect pentru dueluri!

📅 Publicare: 7.12.2025 \ ⏰ Deadline: 21.12.2025, ora 23:59 \ 🎯 Punctaj Total: 10p (9p teste + 1p README + până la 5p bonus clasament) \ 🧪 Teste: 20 scenarii automate (folder `teste/`) \ 🏆 Clasament Live: rezultate.eu \ 📝 Accept Assignment: Classroom Link

Autor: Trifu Marius-Constantin

Informații Generale

Tehnologii:

  • ✅ Limbaj: C++ (este voie cu STL)
  • ✅ Testare: 20 teste dinamice
  • ✅ Deploy: GitHub Actions
  • ✅ Clasament: rezultate.eu

Cerințe:

  • ✅ Structuri/Clase proprii pentru boți, hartă, comenzi
  • ✅ Separate `.h` / `.cpp`
  • ✅ Compilare prin `make`

1. Descriere

Administrezi o echipă de boți tactici într-o arenă rectangulară. Simularea rulează pe runde (ticks), iar intrarea este o succesiune de comenzi trimise de arbitru (`REF`). După fiecare comandă procesată trebuie să emiți propria ta decizie (`PLAYER …`) și să actualizezi scorul.

🎯 Obiectiv: Maximizează TOTAL_SCORE = energie colectată + damage util + stil - penalizări.

Fluxul unei simulari

1. Citești configurarea arenei și profilurile boților.
2. Primești comenzi `REF ...` una câte una (spawn, evenimente, atacuri rivale etc.).
3. După fiecare linie citită **trebuie** să răspunzi cu exact 1 linie `PLAYER ...` care descrie acțiunea echipei tale pentru acel tick.
4. La final raportezi tabela scorurilor și cine câștigă arena.

2. Formate Fișiere

📝 Respectă exact formatele! Fișierele de test vor fi în `teste/input/test01.in … test20.in`. Output-urile așteptate sunt în `teste/output/`.

2.1 Fișier de intrare (arena.txt)

arena.txt
ARENA LATIME INALTIME ROUNDS MAX_ENERGY
RESUPPLY ENERGY_REGEN SHIELD_REGEN
BOTS N
nume_bot hp attack shield speed ability_cost ability_cd
...
UPGRADES U
upgrade_name energy_cost attack_bonus shield_bonus speed_bonus
...
STREAM
REF TICK <t>
REF SPAWN <team> <bot_name> <id> <x> <y>
REF MOVE <team> <id> <direction> <steps>
REF ATTACK <team> <id> <target_id> <dmg>
REF EVENT <type> <value>
...
END

Explicații:

  • `ARENA` – dimensiunile grilei (0-index), număr maxim de runde și energie totală.
  • `RESUPPLY` – valori globale pentru refill-uri automate.
  • `BOTS` – descrie șabloanele disponibile (max 12). `ability_cd` = număr de ticks până poate fi refolosită abilitatea.
  • `UPGRADES` – boost-uri pe care le poți cumpăra când ai energie suficientă.
  • `STREAM` – începe secvența de comenzi live. Liniile vin în timp real / sequential; nu există număr declarat, trebuie să citești până la `END`.

Direcții disponibile: `N`, `S`, `E`, `W`, `NE`, `NW`, `SE`, `SW`. Coordonatele ies din arenă → comandă invalidă (penalizare).

2.2 Format comenzi REF

Sintaxă Semnificație
REF TICK t Semnalează începerea tick-ului `t`.
REF SPAWN team bot id x y Arbitru introduce un bot pentru `team` (Alpha/Beta).
REF MOVE team id dir steps Botul rival se deplasează.
REF ATTACK team id target dmg Primești damage de la altă echipă / event.
REF EVENT type value Eveniment global (`EMP`, `STORM`, `ENERGY_DROP`, `RECHARGE`).
REF CAPTURE team node_id energy Altă echipă capturează un nod de energie.

Restul de linii vor urma aceeași structură `REF <ACTIUNE> …`. Poți ignora tipuri necunoscute, dar trebuie să raportezi `PLAYER WAIT reason=UNKNOWN_COMMAND`.

2.3 Output obligatoriu (arena.out)

arena.out
PLAYER <tick> <action> <payload>
PLAYER <tick> <action> <payload>
...
SCOREBOARD
ENERGY_COLLECTED: value
DAMAGE_DEALT: value
STYLE_POINTS: value
PENALTIES: value
TOTAL_SCORE: value
WINNER: Alpha/Beta/Draw

Reguli:

  • Exact 1 linie `PLAYER …` după fiecare linie `REF …` procesată.
  • `action` ∈ {`SPAWN`, `MOVE`, `ATTACK`, `ABILITY`, `CHARGE`, `DEFEND`, `WAIT`, `UPGRADE`}.
  • `payload` = argumentele tale (`bot_id`, coordonate țintă, energie cheltuită etc.).
  • Output-ul trebuie să fie determinist (aceeași intrare → exact același output). Astfel putem lua fișierul rezultat și îl putem folosi ca input pentru un nou run (ex: `cat studentA.out | ./arena_bots`).
  • Ultima parte `SCOREBOARD …` apare doar după `END`.

2.4 Refolosirea output-ului ca input

Pentru dueluri:

  • Rulezi Student A → obții `arena.out`.
  • Prefixezi liniile cu `REF` (script disponibil în `teste/scripturi/oficializeaza_transcriere.py`).
  • Rulezi Student B cu acea transcriere suplimentară: `cat arena.out.refeed | ./arena`.
  • Programul tău trebuie să ignore liniile `PLAYER` întâlnite în input (sunt tratate ca mișcări deja consumate) și să genereze răspunsuri noi.

3. Reguli de Validare

🔋 Energie

  • Nu poți cheltui mai multă energie decât `MAX_ENERGY`.
  • `CHARGE` crește energia curentă până la limită.
  • `UPGRADE` consumă energia specificată și aplică bonusurile asupra unui bot activ.

🗺️ Arena

  • Fiecare celulă poate conține max. 1 bot pe echipă.
  • Mișcările trebuie să rămână în `[0, LATIME) × [0, INALTIME)`.
  • Nodurile de energie (id numeric) se capturează cu acțiunea `CAPTURE node_id`.

⚔️ Luptă

  • Damage efectiv = `attack + bonusuri - shield_target`.
  • Dacă damage ≤ 0 → este considerat blocaj și primești `STYLE_POINTS +1` pentru combinații defensive valide.
  • Abilitățile respectă cooldown-ul declarat și costul de energie.

⏱️ Sincronizare

  • Pentru fiecare `REF TICK t` trebuie să setezi contextul curent.
  • Comenzile `REF` cu alt tick decât cel curent sunt erori → tratează-le ca `WAIT`.
  • Două comenzi `REF` pot apărea cu același tick; le procesezi în ordine.

🪙 Scoring logic

  • `ENERGY_COLLECTED` – sumă totală de energie netă acumulată.
  • `DAMAGE_DEALT` – damage valid aplicat adversarilor (`ATTACK`, `ABILITY`).
  • `STYLE_POINTS` – bonusuri pentru combo-uri (abilitate după MOVE, contra atac etc.) conform fișierului de limite.
  • `PENALTIES` – se adună pentru comenzi invalide, ieșire din arenă, lipsă răspuns.

4. Implementare

  • `main.cpp` doar creează obiectul principal (`ArenaController controller; controller.run(argc, argv);`).
  • Folosește clase pentru: `Arena`, `Bot`, `Command`, `Scoreboard`.
  • Tratează intrarea ca flux: citești linie → parsezi → execuți → produci output imediat.
  • Este permisă bufferizarea, dar output-ul trebuie să păstreze ordinea exactă a liniilor `REF`.
  • Comenzile necunoscute → `PLAYER <tick> WAIT reason=UNKNOWN_COMMAND`.
  • Folosește `std::getline` și `std::istringstream` proprii (nu STL – scrie un parser minimal).

5. Punctaj

5.1 Teste automate (9p)

  • 20 teste × 0.45p.
  • Fiecare test are limită minimă în `teste/limite_minime.txt`.
  • Unele teste includ dueluri simulate (output → input). Programul trebuie să rămână consistent.

5.2 README (1p)

  • Nume + grupă.
  • Cum e structurată arena (clase/fișiere).
  • Cum asiguri determinismul output-ului.

5.3 Bonus Clasament (până la 5p)

  • Clasament calculat după `TOTAL_SCORE` cumulat pe toate testele.
  • Top 1 → +5p, 2-3 → +4p, 4-5 → +3p, 6-10 → +2p, 11-20 → +1p.

6. Dueluri între studenți

1. Rulați `make record TEST=test07` pentru a salva transcriptul oficial (`out/test07.log`). 2. Trimiteți fișierul altui student. 3. Acesta îl poate reda cu `cat out/test07.log | ./arena`. 4. Pentru turnee, există scriptul `scripts/run_duel.sh studentA studentB testID` care combină output-urile și declară câștigătorul după reguli.

Programul vostru trebuie să fie robust la:

  • Comenzi duplicat (ex: același `REF SPAWN` repetat).
  • Ticks lipsă (trebuie să faceți `PLAYER WAIT` până revine).
  • Output folosit ca input (linii `PLAYER` în stream).

7. Încărcare și Testare

Comenzi Make:

make              # compilează și rulează toate testele din teste/input
make build        # doar compilare
make run          # rulează arena.txt -> arena.out
make test05       # rulează doar testul 5
make record TEST=test12  # rulează testul și păstrează transcriptul pentru duel

GitHub Actions rulează `make` + trimite rezultatele la `rezultate.eu`. Output-ul scriptului `trimite_rezultate.py` va include `TOTAL_SCORE`, nickname etc.

8. Exemplu Simplificat

Input
ARENA 4 3 5 200
RESUPPLY 5 2
BOTS 2
Scout 40 8 2 3 20 2
Guardian 80 5 6 1 35 3
UPGRADES 1
Overclock 50 4 0 2
STREAM
REF TICK 1
REF SPAWN Beta Scout 10 1 1
REF MOVE Beta 10 E 1
REF TICK 2
REF ATTACK Beta 10 0 6
REF EVENT EMP 2
END
Output
PLAYER 1 SPAWN Alpha Scout id=1 x=0 y=0
PLAYER 1 MOVE 1 N 1
PLAYER 1 DEFEND id=1 shield=+2
PLAYER 2 ATTACK id=1 target=10 dmg=9
PLAYER 2 ABILITY id=1 type=SCAN radius=2
SCOREBOARD
ENERGY_COLLECTED: 28
DAMAGE_DEALT: 9
STYLE_POINTS: 3
PENALTIES: 0
TOTAL_SCORE: 40
WINNER: Alpha

9. Tips & Checklist

  • ✅ Stochează istoric comenzi pentru a putea reface dueluri.
  • ✅ Normalizează toate coordonatele/ids.
  • ✅ Scrie teste proprii folosind `scripts/generate_random_stream.py`.
  • ✅ Asigură-te că output-ul tău nu are spații în plus.
  • ⛔ Nu amesteca logică de I/O cu logica de simulare – folosește un controller clar.

Checklist:

  1. [ ] `make build` fără warnings
  2. [ ] Toate testele oficiale trecute local
  3. [ ] README complet
  4. [ ] Transcript deterministic
  5. [ ] Trimite la timp pe GitHub

Succes și abia așteptăm duelurile! 🥊

poo-is-ab/tema/2025/03_test.1764163959.txt.gz · Last modified: 2025/11/26 15:32 by marius.trifu
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