Trabalho prático da unidade curricular de Programação Concorrente da Universidade do Minho, implementado como um mini-jogo multijogador em tempo real.
O jogo segue uma mecânica de captura: os jogadores movem-se num espaço 2D, comem objetos para crescer e tentam capturar jogadores menores — perde quem for capturado, ganha quem tiver mais pontuação ao fim de 2 minutos.
O sistema usa uma arquitetura cliente-servidor com física autoritativa no servidor:
TCP (line-based protocol)
Java Client ◄────────────────────────► Erlang Server
Processing ├── login_manager (autenticação)
NetworkThread ├── game_manager (matchmaking)
Rendering └── game_loop (física + colisões)
O servidor é composto por múltiplos processos Erlang concorrentes:
| Módulo | Processo(s) | Responsabilidade |
|---|---|---|
server.erl |
1 acceptor + 1 worker/cliente | TCP listener, parsing de comandos |
login_manager.erl |
1 processo registado | Contas, autenticação, sessões |
game_manager.erl |
1 processo registado | Fila de espera, até 4 partidas simultâneas |
game_loop.erl |
1 processo por partida | Física, colisões, timer, ranking |
| Componente | Responsabilidade |
|---|---|
GameClient.java |
Classe principal (estende PApplet) |
NetworkThread |
Ligação TCP, envio/receção em background |
drawLogin/Lobby/Game/GameOver() |
Renderização dos diferentes ecrãs |
ReentrantLock |
Sincronização do estado partilhado entre threads |
Protocolo TCP baseado em linhas de texto ({packet, line}):
| Direção | Comando | Significado |
|---|---|---|
| C→S | REGISTER user pass |
Criar conta |
| C→S | LOGIN user pass |
Autenticar |
| C→S | PLAY |
Entrar na fila de espera |
| C→S | INPUT l,r,f |
Teclas premidas (0/1) |
| C→S | TOP |
Pedir ranking global |
| S→C | WAITING |
Na fila (aguardar 30s ou 4 jogadores) |
| S→C | GAME_START n |
Partida iniciada com n jogadores |
| S→C | STATE ... |
Estado do jogo (~60ms por tick) |
| S→C | GAME_OVER w score |
Fim de partida + vencedor |
| S→C | TOP_LIST ... |
Ranking global |
- Erlang/OTP ≥ 26
- Java JDK ≥ 11
- Processing library incluída em
client/lib/core.jar
cd projeto/server
# Compilar
erlc login_manager.erl game_manager.erl game_loop.erl server.erl
# Arrancar (porta 9000 por omissão)
erl -s server startcd projeto/client
# Compilar
javac -cp lib/core.jar GameClient.java
# Executar
java -cp .:lib/core.jar GameClient
# Windows:
java -cp ".;lib/core.jar" GameClientAbre 3 janelas do cliente, regista utilizadores e clica Jogar — a partida inicia assim que entrarem 3 jogadores (ou ao fim de 30 segundos se entrar um 4.º).
- Servidor TCP concorrente com acceptor loop
- Autenticação com registo, login, logout e eliminação de conta
- Matchmaking com fila de espera e timer de 30 segundos
- Até 4 partidas simultâneas
- Física no servidor: aceleração angular/linear, fricção, limites do espaço
- Colisões e capturas entre jogadores e objetos
- Objetos comestíveis (verde, crescer) e venenosos (vermelho, encolher)
- Timer de 2 minutos por partida
- Ranking global persistente por sessão
- Tratamento de desconexão abrupta
- Sincronização cliente com
ReentrantLock - HUD com tempo restante, pontuação e nomes dos jogadores
projeto/
├── server/
│ ├── server.erl ← TCP + workers
│ ├── login_manager.erl ← Autenticação
│ ├── game_manager.erl ← Matchmaking
│ └── game_loop.erl ← Simulação física
├── client/
│ ├── GameClient.java ← Cliente completo
│ └── lib/
│ └── core.jar ← Processing library
└── enunciado/
└── pc2526-enunciado-trabalho.pdf
- Física autoritativa no servidor — o cliente apenas renderiza o estado recebido, sem simulação local, garantindo consistência entre jogadores.
- Protocolo text-based — facilita debugging com
telnet/nce é consistente com os padrões das aulas. ReentrantLockno cliente — substituição devolatilepara garantir atomicidade nas operações de leitura/escrita do estado partilhado entre aNetworkThreade o thread de rendering do Processing.- Timer de 30 segundos no matchmaking — a partida começa com 3 jogadores mas aguarda até 30 segundos por um 4.º, melhorando a experiência sem bloquear indefinidamente.
| Unidade Curricular | Programação Concorrente |
| Curso | Licenciatura em Ciências da Computação (LCC) |
| Instituição | Universidade do Minho |
| Ano letivo | 2025/26 |