Skip to content

Jogo da Velha no qual os dois jogadores podem disputar uma partida em melhor de 5, remotamente, em uma rede local.

Notifications You must be signed in to change notification settings

tiowillians/JogoVelhaSocket

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

JogoVelhaSocket

Esse programa é uma versão que eu implementei para o projeto final dos alunos do curso de Engenharia de Software da Universidade Federal de Goiás como projeto final da disciplina de Desenvolvimento de Software Concorrente. O objetivo é a construção de um jogo da velha que permita que dois jogadores remotos, em uma mesma rede local, possam jogar uma série de melhor de 5 partidas. Para que os programas remotos possam se comunicar, foi definido o protocolo de comunicação descrito abaixo.

Protocolo de Comunicação

As mensagens trocadas entre os programas serão sempre no formato texto (ASCII), onde cada mensagem possui um cabeçalho de tamanho fixo e uma parte variável, que irá depender do tipo da mensagem trocada entre os dispositivos. O cabeçalho de cada mensagem possui tamanho fixo (5 caracteres) e é formado pelos seguintes campos:
  • ID: 2 dígitos que identifica o tipo da mensagem
  • Tamanho: 3 dígitos que indica o número de caracteres (tamanho) total da mensagem, incluindo os 5 dígitos do cabeçalho.


Mensagens trocadas antes do Jogo

Mensagens UDP (datagramas, sem conexão prévia entre os computadores) trocadas entre o programa e demais computadores com o objetivo de saber quem está online e fazer o convite para participar de um jogo. O programa irá utilizar a porta 20181 (uma referência para 2018/1 - primeiro semestre de 2018, quando esse projeto foi proposto) para escutar estas mensagens. Essa porta deverá ficar disponível para troca de mensagens, mesmo quando o jogador estiver participando de um jogo. O tipo e formato das mensagens estão descritos a seguir:

Mensagem “01” (MSG01): saber quem está online.

Formato da Mensagem: 01999Apelido
  • 01: identificação da mensagem
  • 999: tamanho total da mensagem, incluindo o cabeçalho
  • Apelido: nome no qual você deseja ser identificado. É o nome do jogador que está enviando a mensagem.
  • Essa mensagem será enviada via broadcast para a porta 20181 em duas situações:
    1. quando você iniciar o programa, indicando que você fez o login;
    2. sempre que desejar saber quais são os jogadores que estão online no momento.
    É aconselhável que essa mensagem seja enviada periodicamente (em intervalos nunca inferiores a 3 minutos) para atualizar a lista de jogadores que estão online, pois pode ocorrer algum problema no computador de algum jogador e ele ficar off-line sem avisar aos demais jogadores. Ao receber essa mensagem, o programa deverá guardar o apelido e IP do jogador (conforme explicado na MSG02), e responderá com uma MSG02 se identificando, permitindo que seja montada uma lista de jogadores que estão online. Essa lista deverá ser usada para convidar jogadores para a disputa de um jogo.

    Mensagem “02” (MSG02): resposta à MSG01 informando que você está online.

    Formato da Mensagem: 02999Apelido
  • 02: identificação da mensagem
  • 999: tamanho total da mensagem, incluindo o cabeçalho
  • Apelido: identificação do jogador que está enviando a mensagem
  • Essa mensagem é uma resposta automática à mensagem MSG01. Essa mensagem deverá ser enviada somente para quem enviou a mensagem MSG01, onde o jogador corrente estará se identificando, mostrando que está online. Ao receber as mensagens MSG02 (bem como a MSG01) o programa deverá atualizar a lista de jogadores que estão online. Essa lista conterá o apelido e IP de cada jogador (o IP pode ser obtido através do campo RemoteAddress existente no socket que estiver escutando a porta 20181), para que o jogador corrente possa fazer um convite a algum desses jogadores para participar de um jogo. Jogadores que estiverem na lista e não responderem à sua mensagem MSG01 deverão ser retirados da lista.

    Mensagem “03” (MSG03): programa foi encerrado.

    Formato da Mensagem: 03999Apelido
  • 03: identificação da mensagem
  • 999: tamanho total da mensagem, incluindo o cabeçalho
  • Apelido: identificação do jogador que está enviando a mensagem
  • Essa mensagem será enviada via broadcasting indicando que você encerrou o programa e está off-line a partir desse instante. Ao receber as mensagens MSG03, o programa deverá atualizar a lista de jogadores que estão online.

    Mensagem “04” (MSG04): convite para participar de um jogo.

    Formato da Mensagem: 04999Apelido
  • 04: identificação da mensagem
  • 999: tamanho total da mensagem
  • Apelido: identificação do jogador que está enviando a mensagem
  • Essa mensagem será enviada para um jogador específico que estiver na sua lista de jogadores online. O recebimento dessa mensagem indica que o jogador (Apelido) está te convidando para um jogo. Lembrando que o jogo será uma melhor de 5 partidas.

    Mensagem “05” (MSG05): resposta à MSG04 indicando se convite foi aceito ou não.

    Formato da Mensagem: 05999Apelido|Porta
  • 05: identificação da mensagem
  • 999: tamanho total da mensagem
  • Apelido: identificação do jogador que está enviando a mensagem
  • |: separador de campo
  • Porta: caso o convite tenha sido aceito, número da porta TCP que será utilizada para fazer a conexão ponto-a-ponto (peer-to-peer). Caso não queira (ou não possa) aceitar o convite, o número da porta deverá ser 0 (zero) indicando que o você não quer jogar ou que já está jogando com outro jogador (nesse caso, a resposta deverá ser automática).
  • Essa mensagem será enviada somente para quem te enviou a MSG04. Ao aceitar um convite, o programa deverá abrir um socket TCP que ficará escutando a porta informada na mensagem, esperando que o jogador que fez o convite conecte com você para iniciar o jogo.

    Mensagem “06” (MSG06): resposta à MSG05 indicando que jogador recebeu a resposta ao convite.

    Formato da Mensagem: 06007Ok
  • 06: identificação da mensagem
  • 007: tamanho total da mensagem (tamanho fixo)
  • Ok: resposta fixa
  • Essa mensagem será enviada automaticamente pelo jogador que fez o convite para o jogo, informando ao jogador que foi convidado que ele recebeu a resposta do convite e, caso o convite tenha sido aceito, irá fazer a conexão TCP na porta indicada para iniciar o jogo. Como a resposta ao convite foi feita usando mensagens UDP, essa resposta pode não ser lida pelo jogador que fez o convite. Dessa forma, o jogador que recebeu o convite terá certeza que a conexão TCP será feita. Caso a MSG06 não chegue dentro de um certo intervalo de tempo (timeout), o jogador que recebeu o convite poderá, ou enviar uma nova resposta, ou não se preparar para iniciar o jogo (não abrir uma porta para conexão TCP).


    Mensagens trocadas durante o Jogo

    Mensagens TCP (com conexão prévia entre os computadores) trocadas entre os dois jogadores participantes do jogo. Essa conexão deverá ser feita pelo jogador que fez o convite, logo após o envio da mensagem MSG06.

    Mensagem “07” (MSG07): início do jogo.

    Formato da Mensagem: 07006N
  • 07: identificação da mensagem
  • 006: tamanho total da mensagem (tamanho fixo)
  • N: indica quem vai iniciar o jogo
  • Essa mensagem é enviada pelo jogador que recebeu o convite, logo após quem convidou fazer a conexão TCP. O campo N indica quem irá iniciar o jogo e pode ser os seguintes valores:
    1. quem recebeu o convite irá iniciar o jogo (no caso, o jogador que enviou essa mensagem)
    2. quem convidou irá iniciar o jogo (no caso, o jogador que recebeu essa mensagem)
    Uma vez recebido essa mensagem, o jogo se inicia.

    Mensagem “08” (MSG08): jogador fez uma jogada, escolhendo uma posição no tabuleiro.

    Formato da Mensagem: 08006N
  • 08: identificação da mensagem
  • 006: tamanho total da mensagem (tamanho fixo)
  • N: indica a posição que o jogador escolheu no tabuleiro
  • Essa mensagem é enviada pelo jogador que possui a vez, imediatamente após ele escolher uma posição no tabuleiro. No tabuleiro, cada posição é numerada de 1 a 9, conforme mostrado abaixo. Ao receber a mensagem, o programa deverá atualizar o tabuleiro e a vez passa ao jogador que recebeu a mensagem.
    Tabuleiro:
     1 2 3
     4 5 6
     7 8 9

    Mensagem “09” (MSG09): início de uma nova partida.

    Formato da Mensagem: 09005
  • 09: identificação da mensagem
  • 005: tamanho total da mensagem (tamanho fixo)
  • Como cada jogador sabe quando o jogo encerrou (com alguém vencendo ou, no caso de todas as posições do tabuleiro serem preenchidas, havendo empate), não é necessário indicar o fim do jogo. Entretanto, ao encerrar uma partida, uma nova partida deverá ser iniciada, caso ainda nenhum jogador tenha alcançado a vitória na melhor de 5. Essa mensagem deverá ser enviada por quem perdeu a última partida. Em caso de empate, mensagem deverá ser enviada por quem não começou a partida anterior (que acabou de ser encerrada). Quem envia essa mensagem irá começar a nova partida, podendo escolher uma posição para jogar, enviando, logo após, uma mensagem MSG08. Quando houver um ganhador definitivo na melhor de 5 partidas (3ª vitória de algum dos jogadores), ou então um empate entre os jogadores (encerrou-se a 5ª partida e nenhum jogador teve mais vitórias que o outro), a conexão será automaticamente encerrada e, para participar de um novo jogo, deverá ser feito um novo convite.

    Mensagem “10” (MSG10): desistência de continuar jogando.

    Formato da Mensagem: 10005
  • 10: identificação da mensagem
  • 005: tamanho total da mensagem (tamanho fixo)
  • Essa mensagem deverá ser enviada pelo jogador que, por algum motivo, desistiu de continuar jogando. Nesse caso, logo após o envio da mensagem, o jogador deverá encerrar a conexão.

    About

    Jogo da Velha no qual os dois jogadores podem disputar uma partida em melhor de 5, remotamente, em uma rede local.

    Topics

    Resources

    Stars

    Watchers

    Forks

    Releases

    No releases published

    Packages

    No packages published

    Languages