Un sistema multithreaded che simula l'assegnazione di punteggi in tempo reale nel pattinaggio di figura, implementando meccanismi avanzati di concorrenza in Java. Il progetto modella giudici, atleti e pannello tecnico operanti in parallelo secondo le regole ISU.
Questo progetto simula il sistema di punteggio usato nelle competizioni di pattinaggio di figura, dove diversi attori (atleta, giudici, pannello tecnico) operano simultaneamente. L'applicazione utilizza tecniche di programmazione concorrente in Java per modellare questo processo in modo realistico.
- Simulazione multi-attore: Modella atleti, giudici e pannello tecnico come entità concorrenti
- Comunicazione thread-safe: Utilizza
BlockingQueue
per la sincronizzazione tra componenti - Punteggio in tempo reale: Visualizza l'evoluzione del punteggio durante l'esecuzione
- Valutazione ISU-compatibile: Implementa una versione semplificata della Rule 353 ISU con valutazione di elementi tecnici e componenti artistici
- Java 17
- Programmazione concorrente (Thread, BlockingQueue, AtomicReference)
- Pattern Producer-Consumer e Publish-Subscribe
Il sistema è composto da diversi componenti che interagiscono in modo concorrente:
Athlete → Rink → VideoSystem → Screens → Judge/TechnicalPanel → Votes → ScoreBoard → Printer
- Athlete: Esegue un programma composto da elementi tecnici
- VideoSystem: Distribuisce gli elementi a giudici e pannello tecnico
- Judge: Valuta gli elementi con Grade of Execution (GOE)
- TechnicalPanel: Assegna i Base Value agli elementi
- ScoreBoard: Raccoglie e somma i voti
- Printer: Visualizza lo stato del punteggio in tempo reale
- Java JDK 17
- Gradle (integrato nel repository)
# Clona il repository
git clone https://github.com/username/FigureSkatingScorer.git
cd FigureSkatingScorer
# Esegui l'applicazione
./gradlew ex1
L'output del programma mostra l'evoluzione del punteggio nel tempo:
_ 13,50
__ 26,80
__ 26,80
___ 34,39
...
_____!!!!!___ 193,13
Esercizio completato. Punteggio finale: 212.63144
_
(underscore): Elemento valutato positivamente!
(esclamativo): Elemento in reviewX
: Elemento valutato negativamente
src/
├── main/
│ └── java/
│ └── it/
│ └── unipd/
│ └── pdp2024/
│ └── ex1/
│ ├── Athlete.java # Atleta che esegue il programma
│ ├── Element.java # Elemento del programma
│ ├── Judge.java # Giudice che valuta
│ ├── Main.java # Punto di ingresso
│ ├── Nation.java # Enumerazione nazioni
│ ├── Printer.java # Visualizzazione punteggi
│ ├── ScoreBoard.java # Calcolo punteggi
│ ├── TechnicalPanel.java # Pannello tecnico
│ ├── VideoSystem.java # Sistema distribuzione elementi
│ └── Vote.java # Sistema voti
Il sistema utilizza diversi meccanismi di concorrenza:
- Thread separati per ogni componente autonomo del sistema
- BlockingQueue per la comunicazione thread-safe tra componenti
- AtomicReference per condividere risultati aggiornati in modo thread-safe
Il sistema affronta e risolve diverse potenziali race condition:
- Controllo di nullità nelle strutture dati condivise
- Ordine di avvio appropriato dei thread per rispettare le dipendenze
- Meccanismo di terminazione che aspetta i componenti auto-terminanti e ferma esplicitamente quelli che richiedono interruzione manuale
Il punteggio finale combina:
- Technical Elements Score: Base Value + Grade of Execution
- Components Score: Valutazioni artistiche (Skating Skills, Transitions, Performance, Composition, Interpretation)
Questo progetto è rilasciato sotto Licenza MIT. Vedere il file LICENSE per i dettagli.
Questo progetto è stato sviluppato come parte del corso di Paradigmi di Programmazione dell'Università di Padova, ispirato alle regole di punteggio ISU per il pattinaggio di figura.