Trabalho semestral apresentado para a disciplina Redes de Computadores 1 para Sistemas de Informação.
Alunos: Giovane Lopes da Silva e José Paulo de Mello Gomes
Instituição: Universidade Federal Fluminense
Curso: Bacharelado em Sistemas de Informação
Disciplina/período: Redes de computadores para Sistemas de Informação/2018.2
Professor: Diego Gimenez Passos
Este projeto foi desenvolvido em Python 3.7.0. Portanto, faz-se necessário instalação desta ou superiores versões.
Utilizou-se o módulo pickle do Python para serialização e de-serialização binária de objetos, como arrays e números inteiros ao serem transmitidos pelo socket TCP desta aplicação.
git init
git clone https://github.com/josepmg/trabalhoRedes1.git
Primeiro, deve-se executar o arquivo servidor pelo comando:
$ py servidor.py [NUMERO_JOGADORES] [DIMENSÃO_TABULEIRO]
O programa servidor utiliza a porta 12000. Caso queira trocá-la, a linha 13 deve ser alterada. Além disso, o programa servidor mostra um "gabarito" com os valores de cada peça.
Após, os clientes são executados pelo comando:
$ py cliente.py [IP_SERVIDOR] [PORTA_SOCKET_SERVIDOR]
Agora é só aproveitar o jogo!
- main
- cliente.py: arquivo do programa cliente
- servidor.py: arquivo do programa servidor
- utils.py: arquivo com funções variadas
- model
- jogador.py: arquivo da classe Jogador e seus respectivos métodos e atributos, como identificador, pontuação, socket e endereço;
- partida.py: arquivo da classe Partida e seus respectivos métodos e atributos, como lista de jogadores, um tabuleiro e número de jogadores;
- tabuleiro.py: arquivo da classe Tabuleiro e seus respectivos métodos e atributos, como dimensão, número de peças, pares totais e pares descobertos, além um array contendo os valores das peças e outro com os as informações a serem mostradas;
Alguns métodos serão citados e explicados mais adiante.
Essa função faz a criação do Socket TCP no servidor, utilizando a variável “serverPort” que contém o número de porta especificada e comunica que está aguardando conexão dos jogadores para o programa servidor.
Através do socket de cada jogador, essa função é responsável por enviar a todos os jogadores o status da partida, como tabuleiro(de display, sem os valores do tabuleiro original) atualizado, placar de pontuação atualizado e o jogador da vez.
Esta função tem como objetivo enviar a todos os jogadores o atual jogador da vez(roundPlayer). Para isso, recebe a partida (contendo o vetor de jogadores), o número de jogadores e o jogador da vez como parâmetros.
Após receber as coordenadas do jogador da vez, essa função fica responsável por enviar apenas o valor e as coordenadas, revelando assim o valor da peça no tabuleiro display para todos os jogadores da partida.
Essa função é utilizada para criar um socket cliente TCP informando o IP do servidor (serverIp) e sua porta (serverPort). Após, comunica ao cliente que a conexão foi estabelecida e está aguardando demais jogadores.
Utilizada para ler as coordenadas (de 1 peça por vez) do cliente quando for sua vez de jogar. Faz verificações de valores inválidos, ou seja, que não equivalham a nenhuma peça do tabuleiro, neste caso, pede novamente as coordenadas. Caso as coordenadas sejam válidas, ela as retorna.
Possui dois métodos: um para limpar a tela e outro para apresentar o tabuleiro formatado. Optou-se por criar esta classe para evitar repetição de código, uma vez que esses métodos são utulizados tanto no cliente, quanto no servidor.
Como dito previamente, é a classe referente a uma partida. Possui, como atributos, o úmero de jogaores, uma instância de Tabuleiro e um vetor de jogadores.
Funções para recuperarem o valor dos atributos do objeto
Adiociona um novo jogador ao vetor de jogadores
Cria uma string formatada com as pontuações de cada jogador
Como dito previamente, é a classe referente a um jogador. Possui como atributos, um identificado, a pontuação (inicialmente 0), um socket e uma tupla de endereço (contendo IP do hosto do cliente e pota em que o processo está sendo executado).
Além disso, possui métodos para incrementar a pontuação, encerrar a conexão, dentre outras.
Como dito previamente, é a classe referente a um tabuleiro. Possui como atributos, a dimensão, o número total de peças e de pares. Além do número de pares descobertos , um vetor com os valores das peças e outro vetor de display.
Além dos métodos a seguir, possui outros para recuperar os atributos supracitados.
Caso seja um valor válido, retorna o valor indicado pelas coordenadas dadas. Caso contrário, retorna 0.
Caso seja um valor válido, "esconde" a peça (display nas coordenadas = '?'), posição no array de valores passa a ser negativa, indicando que está fechada, e retorna true, indicando que a operação foi realizada. Caso contrário, retorna false.
Remove uma peça do tabuleiro de display. Caso ela já tenhaa sido removida, retorna false. Se não, retira a peça e retornan true, indicando o sucesso da operação.
- Cria socket TCP para receber conexões de clientes
- Inicia-se um laço de repetição (Enquanto o servidor ainda quisere hospedar partidas)
- Instancia um objeto da classe Partida, informando o número de jogadores e a dimensão do tabuleiro
- Apresenta tabuleiro de valor no servidor
- Laço de repetição para aguardar a conexão de todos clientes
- Socket do servidor aceita conexão, criando um socket de conexão com o cliente e gaurda seu enderço (IP e porta)
- Um novo jogador é adicionado a partida, informando seu identificador, socket de conexão e endereço
- Envia identificador para cliente
- Inicia a partida (laço de repetição enquanto ainda houverem peças a serem descobertas)
- Enquanto for a vez do jogador atual (laço de repetição)
- Envia tabuleiro atualizado e pontuação dos jogadores
- Envia jogador da vez para todos clientes
- Laço para receber as coordenadas da primeira peça (caso o jogador envie coordenadas inválidas):
- Recebe a mensagem do cliente
- Consulta valor da peça
- Envia valor da peça
- Laço para receber as coordenadas da segunda peça (caso o jogador envie coordenadas inválidas):
- Recebe a mensagem do cliente
- Consulta valor da peça
- Envia valor da peça
- Verifica se jogador pontuou (caso valores da speças sejam iguais e válidas)
- Caso pontuou
- Incremente placar do jogador
- Remove peças
- Apresenta tabuleiro no servidor
- Caso não haja pares a serem descobertos, encerra laço do tópico 2.IV
- Caso não pontuou
- Esconde valor das peças
- Verifica pares descobertos
- Caso todos pares foram descobertos, envia "-1" como jogador da vez, indicando aos clientes que a partida acabou
- Caso contrário, muda o jogador da vez
- Encerra laço 2.IV
- Caso pontuou
- Enquanto for a vez do jogador atual (laço de repetição)
- Envia tabuleiro atualizado e pontuação dos jogadores
- Envia "-1" como jogador da vez para clientes, indicando que partida acabou
- Envia vencedor, caso haja, para clientes. Caso haja empate, não haverá vencedor (código "-1")
- laço de repetição para encerrar conexão com clientes
- Pergunta se deseja iniciar nova partida
- Caso queira, volta ao laço do tópico 2
- Caso não queira, encerra programa
- Cria um socket de conexão utilizando o IP e porta do servidor
- Recebe identificador do servidor
- Inicia-se a partida (Laço de repetição enquanto jogador da vez for diferente de "-1")
- Recebe tabuleiro de display do servidor e o converte em um array utilizando o pickle
- Recebe a dimensão do tabuleiro do servidor
- Recebe o placar do servidor
- Recebe o jogador da vez do servidor
- Verifica se o jogador da vez
- Caso seja diferente de "-1", continua no laço
- Caso seja igual a "-1", vai para tópico 4
- Apresenta tabuleiro e placar
- Pedindo primeira peça
- Caso o cliente seja o jogador da vez
- Solicita coordenadas
- Solicita coordenadas enqualto elaas forem inválidas (fora da dimensão do tabuleiro ou fora do padrão de input)
- Envia coordenadas para servidor
- Caso o cliente não seja o jogador da vez
- Informa quem é o jogador da vez
- Caso o cliente seja o jogador da vez
- Clientes recebem valor da peça e coordenadas dela
- Verifica validade da peça
- Se valor for inválido (igual a 0)
- Pede novas coordenadas para jogador da vez
- Informa que jogador da vez esoclheu uma peça inválida para demais clientes
- Caso contrário, atualiza tabuleiro de display com valor da peça e o apresenta
- Se valor for inválido (igual a 0)
- Pedindo segunda peça
- Caso o cliente seja o jogador da vez
- Solicita coordenadas
- Solicita coordenadas enqualto elaas forem inválidas (fora da dimensão do tabuleiro ou fora do padrão de input)
- Envia coordenadas para servidor
- Caso o cliente não seja o jogador da vez
- Informa quem é o jogador da vez
- Clientes recebem valor da peça e coordenadas dela
- Verifica validade da peça
- Se valor for inválido (igual a 0)
- Pede novas coordenadas para jogador da vez
- Informa que jogador da vez esoclheu uma peça inválida para demais clientes
- Caso contrário, atualiza tabuleiro de display com valor da peça e o apresenta
- Apresenta as peças escolhidas e informa se jogador pontuou ou não
- Apresenta placar
- Informa que o jogo acabou
- Recebe jogador vencedor
- Se valor recebido for "-1", houve um empate e, portanto, não houve vencedor
- Se for diferente, informa o jogador vencedor
- Encerra conexão