Table of Contents

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:

Cerințe:

1. Descriere

Jocul este un battle royale simplu pe hartă 2D. Ești un jucător într-o arenă rectangulară și te poți deplasa sau planta bombe. 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 …`).

🎯 Obiectiv: Maximizează TOTAL_SCORE = damage dat adversarilor + supraviețuire - penalizări.

Mecanica Jocului

Ticks și Acțiuni:

Hartă:

Mișcare:

Bombe:

Pereți:

Vizibilitate:

Scor:

Fluxul unei simulari

1. Citești configurarea arenei (dimensiuni, parametri bombe, număr runde).
2. Primești comenzi de la arbitru una câte una (spawn adversar, mișcări, explozii etc.).
3. După fiecare linie citită **trebuie** să răspunzi cu exact 1 linie care descrie acțiunea ta pentru acel tick.
4. La final raportezi tabela scorurilor și cine câștigă.

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
BOMB_TIMER BOMB_RADIUS BOMB_DAMAGE MAX_BOMBS MAX_WALLS
PLAYER_HP INITIAL_X INITIAL_Y
STREAM
TICK <t>
SPAWN <team> <x> <y>
MOVE <team> <x> <y>
BOMB <team> <x> <y> <timer>
EXPLODE <x> <y>
WALL <team> <x> <y>
WALL_HIT <x> <y>
WALL_BROKEN <x> <y>
HIT <x> <y> <dmg>
...
END

Explicații:

Notă: `BOMB_RADIUS` este întotdeauna 2 în această temă (bomba afectează celulele la distanță 1 și 2 în direcțiile N, S, E, W).

Direcții disponibile: `N` (sus), `S` (jos), `E` (dreapta), `W` (stânga). NU sunt permise diagonalele.

Exemplu:

ARENA 10 8 50
3 1 20 3
100 0 0
STREAM
REF TICK 1
REF SPAWN Beta 9 7
REF MOVE Beta 9 6
REF TICK 2
REF MOVE Beta 9 5
...
END

2.2 Format comenzi de intrare

Comandă Semnificație
TICK t Semnalează începerea tick-ului `t`.
SPAWN team x y Arbitru introduce un jucător pentru `team` (Alpha/Beta) la coordonatele (x, y).
MOVE team x y Jucătorul rival (`team`) s-a deplasat la coordonatele (x, y).
BOMB team x y timer Jucătorul `team` a plantat o bombă la (x, y) care explodează în `timer` ticks.
EXPLODE x y O bombă a explodat la coordonatele (x, y).
WALL team x y Jucătorul `team` a plantat un perete la coordonatele (x, y).
WALL_HIT x y Un perete la (x, y) a fost lovit de o bombă (prima lovitură, peretele rămâne activ).
WALL_BROKEN x y Un perete a fost distrus complet (a doua bombă) la coordonatele (x, y).
HIT x y dmg Ai primit `dmg` damage la coordonatele (x, y) (de la explozie).

Observații:

Elemente noi (extensibilitate):

2.3 Output obligatoriu (arena.out)

arena.out
MOVE E
BOMB
WALL
WAIT
...
SCOREBOARD
DAMAGE_DEALT: value
SURVIVAL_BONUS: value
PENALTIES: value
TOTAL_SCORE: value
WINNER: Alpha/Beta/Draw

Reguli:

Notă: Nu mai trebuie să incluzi tick-ul în output (se știe din context).

Exemplu output:

MOVE E
BOMB
MOVE N
WAIT
SCOREBOARD
DAMAGE_DEALT: 60
SURVIVAL_BONUS: 50
PENALTIES: 0
TOTAL_SCORE: 110
WINNER: Alpha

2.4 Refolosirea output-ului ca input

Pentru dueluri:

2.5 Elemente noi (extensibilitate)

Formatul permite adăugarea de elemente noi în viitor:

Regulă: Pentru comenzi necunoscute, răspunde cu `WAIT`. Programul tău trebuie să fie robust la comenzi noi.

3. Reguli de Validare

🗺️ Mișcare

💣 Bombe

🧱 Pereți

❤️ Viață și Damage

⏱️ Sincronizare

🪙 Scoring logic

4. Implementare

5. Punctaj

5.1 Teste automate (9p)

5.2 README (1p)

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

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:

7. Comunicare în Timp Real între Programe

Pentru dueluri live sau testare interactivă, ai mai multe opțiuni:

7.1 Named Pipes (FIFO) - Timp Real

Creezi un pipe și conectezi programele:

# Creează pipe-ul
mkfifo /tmp/arena_pipe
 
# Rulează Student A (scrie în pipe)
./arena_studentA < input.txt > /tmp/arena_pipe &
 
# Rulează Student B (citește din pipe)
./arena_studentB < /tmp/arena_pipe > output.txt
 
# Curăță după
rm /tmp/arena_pipe

Avantaje: Comunicare instantanee, fără fișiere intermediare. Dezavantaje: Trebuie să gestionezi procesele manual.

7.2 Pipe Normal + tee (Salvare + Redirecționare)

Scrie în fișier ȘI trimite mai departe simultan:

# Student A scrie la stdout, tee salvează în fișier ȘI trimite la Student B
./arena_studentA < input.txt | tee arena_studentA.out | ./arena_studentB > arena_studentB.out

Avantaje: Simplu, salvează ambele output-uri. Dezavantaje: Nu e “timp real” strict (bufferizare posibilă).

7.3 Process Substitution (Bash)

Bash creează automat pipe-uri temporare:

# Student A scrie într-un "fișier virtual" care e de fapt input pentru Student B
./arena_studentB < <(./arena_studentA < input.txt) > output.txt
 
# SAU invers: Student B primește output-ul lui A ca input
./arena_studentB <(./arena_studentA < input.txt) > output.txt

Avantaje: Sintaxă curată, bash gestionează pipe-urile. Dezavantaje: Funcționează doar în bash, nu în sh.

7.4 Exemplu Makefile pentru Dueluri

# Duel între două executabile
duel: arena_studentA arena_studentB
	@echo "🚀 Pornesc duelul..."
	@mkfifo /tmp/duel_pipe 2>/dev/null || true
	@timeout 30 ./arena_studentA < teste/input/test01.in | \
		tee out/studentA.log | \
		./arena_studentB > out/studentB.log || true
	@rm -f /tmp/duel_pipe
	@echo "✅ Duel terminat. Verifică out/studentA.log și out/studentB.log"
 
# Duel cu named pipe explicit
duel-fifo: arena_studentA arena_studentB
	@mkfifo /tmp/arena_fifo
	@./arena_studentA < teste/input/test01.in > /tmp/arena_fifo & \
	./arena_studentB < /tmp/arena_fifo > out/duel_result.out; \
	rm -f /tmp/arena_fifo

Format pentru dueluri: Output-ul lui Student A trebuie transformat în comenzi de intrare înainte de a fi dat lui Student B. Vezi secțiunea 6 pentru scriptul de transcriere.

8. Î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.

9. Exemplu Simplificat

Scenariu: Arenă 6×6, bombe cu timer 3, raza 2, damage 20, max 2 bombe, max 3 pereți. Tu (Alpha) ești la (0,0), adversarul (Beta) la (5,5).

Input
ARENA 6 6 10
3 2 20 2 3
100 0 0
STREAM
TICK 1
SPAWN Beta 5 5
MOVE Beta 5 4
TICK 2
MOVE Beta 5 3
BOMB Beta 5 3 3
TICK 3
MOVE Beta 5 2
WALL Beta 4 2
TICK 4
MOVE Beta 4 1
TICK 5
EXPLODE 5 3
HIT 5 3 20
HIT 5 2 20
HIT 5 4 20
HIT 5 1 20
HIT 4 3 20
HIT 3 3 20
WALL_HIT 4 2
TICK 6
EXPLODE 2 0
HIT 2 0 20
HIT 1 0 20
HIT 0 0 20
HIT 3 0 20
WALL_BROKEN 4 2
END
Output
MOVE E
MOVE E
BOMB
WALL
MOVE N
WAIT
SCOREBOARD
DAMAGE_DEALT: 20
SURVIVAL_BONUS: 50
PENALTIES: 0
TOTAL_SCORE: 70
WINNER: Alpha

Explicație:

10. Tips & Checklist

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! 🥊