O projeto "Pong Game Multiplayer via Browser" é uma implementação moderna do clássico jogo Pong, adaptado para um ambiente multiplayer na web. Utilizando Python com Django para o backend e JavaScript para o frontend, o jogo permite que os jogadores joguem em tempo real através de seus navegadores em PCs. Além de permitir partidas multiplayer, o jogo também oferece a possibilidade de desafiar uma inteligência artificial (IA) e organizar torneios entre múltiplos jogadores. O sistema é construído com uma arquitetura de microserviços para melhorar a escalabilidade e a manutenção.
O Pong é um dos primeiros jogos icônicos e uma referência importante na história dos jogos. Atualizá-lo para um formato multiplayer via navegador é uma forma de homenagear este clássico enquanto explora as capacidades modernas da web. A implementação com Python e Django para o backend e JavaScript para o frontend oferece uma solução robusta para comunicação em tempo real e interatividade. A inclusão de uma IA e a possibilidade de torneios tornam o jogo mais envolvente e diversificado, proporcionando uma experiência de jogo rica e desafiadora que pode ser compartilhada e jogada com amigos em PCs. A adoção de uma arquitetura de microserviços permitirá uma maior flexibilidade e eficiência na gestão dos diferentes componentes do sistema.
A principal dificuldade neste projeto é garantir uma experiência de jogo fluida e sincronizada para todos os jogadores, considerando que a comunicação entre clientes e o backend deve ser realizada em tempo real. Isso envolve resolver desafios como:
title Contexto Geral Do Transcendence Poke
Enterprise_Boundary(PongGame, "Jogo Pong") {
System(PongApp, "Aplicação Web do Pong", "Permite com que os jogadores tenham acesso e disputam partidas.")
}
Person(RegularPlayer, "Jogador Padrão", "Um Jogador com permissão para jogar.")
Person(GMPlayer, "Jogador GM", "Um Jogador com permissão para jogar e organizar torneios.")
Person(Spectator, "Espectador", "Usuário com acesso para assistir partidas.")
Rel(RegularPlayer, PongApp, "Joga, visualiza status de partidas jogadas, gerencia perfil e assiste partidas.")
Rel(GMPlayer, PongApp, "Joga, organiza torneios, visualiza status de partidas jogadas, gerencia perfil e assiste partidas.")
Rel(Spectator, PongApp, "Assiste partidas.")
Backend for Frontend
Autenticação e Autorização:
Registro de Usuários: Os usuários devem ser capazes de se registrar no sistema fornecendo informações básicas, como nome, e-mail e senha.
Login e Logout: O sistema deve permitir que os usuários façam login com suas credenciais e saiam quando desejarem.
Recuperação de Senha: O sistema deve oferecer uma funcionalidade para recuperação de senha, permitindo que os usuários redefinam suas senhas caso as esqueçam.
Gerenciamento de Credenciais: Os usuários devem ter a capacidade de atualizar e gerenciar suas credenciais, incluindo a mudança de senha e a atualização de informações de perfil.
Autorização de Acesso: O sistema deve garantir que apenas usuários autorizados possam acessar e gerenciar partidas e torneios, implementando controles de acesso baseados em permissões.
Controle de Sessões: O sistema deve gerenciar sessões de usuário, incluindo a expiração de sessões inativas e a funcionalidade de encerramento de sessões para proteger a segurança do usuário.
Segurança e Proteção de Dados: O sistema deve implementar medidas de segurança para proteger as informações de credenciais e dados pessoais dos usuários contra acessos não autorizados e ataques cibernéticos.
Gerenciamento de Partidas:
Criação de Novas Partidas Multiplayer: Os jogadores devem ser capazes de criar novas partidas multiplayer com facilidade.
Participação em Partidas Existentes: Os jogadores devem poder se juntar a partidas já existentes através de um sistema de convites ou por meio de uma lista de partidas disponíveis.
Jogos Locais: O sistema deve permitir que dois jogadores joguem no mesmo dispositivo, compartilhando um controle.
Jogos contra Inteligência Artificial (IA): O sistema deve possibilitar que os jogadores joguem contra uma IA.
Conexão Web para Jogos Contra Outros Jogadores: Os jogadores devem poder participar de partidas contra outros jogadores via conexão web.
Registro de Resultados das Partidas: O sistema deve registrar e armazenar os resultados das partidas.
Comunicação em Tempo Real: O sistema deve permitir comunicação em tempo real entre o cliente e o servidor durante as partidas.
Sincronização em Tempo Real: Todas as atualizações do jogo, como movimentos da bola e das raquetes, devem ser sincronizadas em tempo real para todos os jogadores.
Marcação de Pontuação: O sistema deve marcar e atualizar a pontuação dos jogadores durante a partida.
Exibição da Pontuação Atual e Estatísticas: O sistema deve exibir a pontuação atual do jogo e as estatísticas do jogador em tempo real.
Controle do Paddle: Cada jogador deve ser capaz de controlar seu próprio paddle durante o jogo.
Criação de Torneios por Jogadores GM: Jogadores com privilégios de GM (Game Master) devem ter a capacidade de criar e gerenciar torneios.
Inclusão e Convite de Jogadores em Torneios: Jogadores GM devem poder incluir ou convidar outros jogadores para participar de torneios.
Visualização de Partidas por Espectadores: Espectadores devem ter a capacidade de assistir a partidas ao vivo.
Lista de Partidas Disponíveis para Espectadores: Espectadores devem poder visualizar uma lista de partidas disponíveis para assistir.
Gerenciamento de Participantes em Torneios: Jogadores GM devem ser capazes de gerenciar os participantes e as configurações dos torneios.
Relatórios de Desempenho: O sistema deve gerar relatórios detalhados sobre o desempenho dos jogadores após as partidas e torneios.
Notificações de Eventos: O sistema deve enviar notificações para jogadores e espectadores sobre eventos importantes, como convites para partidas e atualizações de torneios.
Estatisticas de Partidas:
Visualização do Histórico de Partidas: Os jogadores devem ter a capacidade de visualizar um histórico completo de suas partidas anteriores, incluindo detalhes como data, adversário e resultados.
Consulta de Estatísticas de Partidas: Os jogadores devem poder acessar e consultar estatísticas detalhadas de cada partida, como número de pontos marcados, erros e outras métricas relevantes.
Comparação de Desempenho: O sistema deve permitir que os jogadores comparem suas estatísticas de desempenho ao longo do tempo, destacando melhorias ou áreas que necessitam de aprimoramento.
Filtros e Pesquisa de Partidas: Os jogadores devem poder aplicar filtros e realizar pesquisas no histórico de partidas para encontrar jogos específicos com base em critérios como data, adversário ou tipo de partida.
Geração de Relatórios de Estatísticas: O sistema deve fornecer a funcionalidade para gerar relatórios detalhados das estatísticas de partidas, que os jogadores podem visualizar na plataforma ou exportar para análise externa.
Jogabilidade:
Detecção de Desconexões: O sistema deve ser capaz de detectar automaticamente quando um jogador se desconecta durante uma partida, identificando a perda de conexão e registrando o evento.
Mecanismos de Reconexão: O sistema deve fornecer mecanismos para que um jogador desconectado possa reconectar-se à partida em andamento, retomando o jogo a partir do ponto em que foi interrompido, sempre que possível.
Gerenciamento de Estado de Partida: O sistema deve gerenciar o estado da partida de forma a manter a integridade do jogo durante as desconexões, assegurando que o progresso não seja perdido e que o jogo possa continuar normalmente após a reconexão.
Tratamento de Reconexões Prolongadas: Se a reconexão demorar mais do que um tempo predeterminado, o sistema deve ter um plano de ação, como permitir que um jogador substituto entre no jogo ou registrar a partida como cancelada, dependendo das regras estabelecidas.
Menu Principal e Chat:
Acesso ao Menu Principal: Os jogadores devem ter a capacidade de acessar o menu principal do sistema a partir de qualquer ponto do jogo, permitindo que retornem facilmente à tela inicial.
Exibição de Opções no Menu Principal: O menu principal deve exibir opções claras e acessíveis, como iniciar uma nova partida, acessar o histórico de partidas, configurar o perfil, e entrar em outros menus relevantes.
Navegação entre Menus: O sistema deve permitir a navegação fluida entre diferentes menus, como o menu de partidas, configurações e estatísticas, sem a necessidade de reiniciar o jogo ou perder o progresso.
Modos de Chat: O sistema deve oferecer diferentes modos de chat, como chat global (para todos os jogadores), chat de equipe (para jogadores em uma mesma equipe) e chat privado (para conversas individuais).
Notificações de Mensagens: O sistema deve notificar os jogadores sobre novas mensagens recebidas no chat, garantindo que não percam comunicações importantes durante o jogo.
Gerenciamento de Mensagens: O sistema deve permitir que os jogadores visualizem, respondam e, se necessário, bloqueiem ou silenciem outros jogadores no menu de chat.
Histórico de Chat: O sistema deve manter um histórico das mensagens trocadas no chat, permitindo que os jogadores revisitem conversas anteriores, se desejado.
Acesso ao Menu de Chat: O sistema deve incluir um menu de chat acessível a partir do menu principal ou de outros menus, permitindo que os jogadores iniciem ou participem de conversas
Acessibilidade:
Manutenibilidade:
Compatibilidade:
Escalabilidade:
Desempenho:
Criar partida contra IA:
Ator:
Jogador Padrão ou GM Autenticado
Objetivo:
Criar partida contra IA.
Descrição:
Criar Multiplayer Local:
Ator:
Jogador Padrão ou GM Autenticado
Objetivo:
Criar partida multiplayer local.
Descrição:
Criar Multiplayer Online:
Ator:
Jogador Padrão ou GM Autenticado
Objetivo:
Criar partida multiplayer Online.
Descrição:
Convidar Oponente:
Ator:
Jogador Padrão ou GM Autenticado em sala de partida já criada.
Objetivo:
Permitir enviar um convite para quando está em uma partida criada.
Descrição:
Iniciar Partida Multiplayer:
Ator:
Jogador Padrão ou GM Autenticado em sala de partida já criada.
Objetivo:
Iniciar partida após jogadores entrarem no saguão.
Descrição:
Entra em Partida por Convite:
Ator:
Jogador Padrão ou GM Autenticado fora de partida.
Objetivo:
Aceitar convite para participar de partida.
Descrição:
Negar Convite para Partida:
Ator:
Jogador Padrão ou GM Autenticado fora de partida.
Objetivo:
Negar convite para partida.
Descrição:
Negar Convite para Partida Por Tempo:
Ator:
Sistema.
Objetivo:
Sistema revoga convite após x minutos.
Descrição:
Notificação de Partida Cheia:
Ator:
Sistema.
Objetivo:
Sistema recusa a entrada de um jogador quando a partida está cheia.
Descrição:
Movimentação do Paddle:
Ator:
Jogador Padrão ou GM Autenticado em partida.
Objetivo:
Mover o paddle (raquete) para cima e para baixo.
Descrição:
Pausa de Partida contra IA:
Ator:
Jogador Padrão ou GM Autenticado em partida contra IA.
Objetivo:
Pausar a sessão do jogo atual.
Descrição:
Sair de Partida:
Ator:
Jogador Padrão ou GM Autenticado em partida.
Objetivo:
Sair da sessão de jogo atual.
Descrição:
Exibir Pontuação em Partida:
Ator:
Sistema.
Objetivo:
Exibir pontuação da partida.
Descrição:
Marcar Pontuação para Jogador:
Ator:
Jogador
Precondição:
Jogador Marca um ponto
Objetivo:
Marca 1 ponto para um jogador.
Descrição:
Inicio do Target:
Ator:
Sistema.
Objetivo:
Posicionamento e direção do target no inicio de cada round.
Descrição:
@startuml
:Microserviço Game Core: as msGame << Aplicação >>
rectangle Partida {
(Inicia ao no meio da arena) as (start-position)
(Move em direção ao jogador da esquerda) as (move-left)
(Move em direção ao jogador da direita) as (move-right)
left to right direction
msGame --> (start-position)
(start-position) .> (move-right) : extends
(start-position) .> (move-left) : extends
}
@enduml
Movimento do Alvo:
Ator:
Sistema.
Precondição:
Jogador acerta o alvo.
Objetivo:
Regra de direção do alvo.
Descrição:
@startuml
:Microserviço Game Core: as msGame << Aplicação >>
rectangle Partida {
(Determina direção do alvo) as (target-direction)
(Move para o lado esquerdo) as (move-left)
(Move para o lado direita) as (move-right)
left to right direction
msGame --> (target-direction)
(target-direction) .> (move-right) : extends
(target-direction) .> (move-left) : extends
}
@enduml
Finalização de Partida.
Ator:
Sistema.
Precondição:
Jogador atinge pontuação para vencer.
Objetivo:
Declara a partida como finalizada.
Descrição:
@startuml
:Microserviço Game Core: as msGame << Aplicação >>
rectangle Partida {
(Finaliza Partida) as (end-game)
(Declara Vencedor da Partida) as (winner)
left to right direction
msGame --> (end-game)
(end-game) .> (winner) : include
}
@enduml
Estatísticas de Final de Partida.
Ator:
Sistema.
Precondição:
Partida encerrada.
Objetivo:
Exibe informações da partida.
Descrição:
@startuml
rectangle Estátisticas {
(Exibir Estátisticas) as (stat)
}
:Microserviço Game Core: as msGame << Sistema >>
msGame --> (stat)
@enduml
Sair de Partida Encerrada.
Ator:
Jogador ou Jogador GM.
Precondição:
Autentificação, Autorização, partida encerrada.
Objetivo:
Sair de partida encerrada e retornar para menu inicial.
Descrição:
@startuml
:Jogador Padrão: as player
:Jogador GM: as admin
rectangle Partida {
(Sair da Partida) as (exit)
left to right direction
player --> (exit)
admin --> (exit)
}
rectangle Sessão {
(Retorna para Menu Principal) as (start)
(exit) .> (start) : include
}
player <|- admin
@enduml
Exibir histórico de Partidas.
Ator:
Jogador Padrão ou jogador GM.
Precondição:
Autentificação e Autorização.
Objetivo:
Exibir o histórico de partidas jogadas.
Descrição:
@startuml
actor JogadorPadrão as "Jogador Padrão"
actor JogadorGM as "Jogador GM"
rectangle Sistema {
usecase "Exibir Histórico de Partidas" as UC1
}
JogadorPadrão --> UC1 : Acessa Menu Principal
JogadorGM --> UC1 : Acessa Menu Principal
note right of UC1
Precondição: Autenticação e Autorização
Objetivo: Exibir o histórico das partidas jogadas
end note
@enduml