Skip to content

TiagoFernandes404/Programacao-Concorrente

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Mini-Jogo 2D — Programação Concorrente 2025/26

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.


Arquitetura

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)

Servidor — Erlang

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

Cliente — Java + Processing

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 de Comunicação

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

⚙️ Como Executar

Pré-requisitos

Servidor

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 start

Cliente

cd projeto/client

# Compilar
javac -cp lib/core.jar GameClient.java

# Executar
java -cp .:lib/core.jar GameClient
# Windows:
java -cp ".;lib/core.jar" GameClient

Abre 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.º).


🎯 Funcionalidades Implementadas

  • 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

📁 Estrutura do Repositório

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

🧠 Decisões Técnicas

  • 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/nc e é consistente com os padrões das aulas.
  • ReentrantLock no cliente — substituição de volatile para garantir atomicidade nas operações de leitura/escrita do estado partilhado entre a NetworkThread e 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.

🎓 Contexto Académico

Unidade Curricular Programação Concorrente
Curso Licenciatura em Ciências da Computação (LCC)
Instituição Universidade do Minho
Ano letivo 2025/26

About

Mini-jogo 2D multijogador em tempo real — servidor concorrente em Erlang, cliente em Java/Processing

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors