Jogo da velha
Por: zinho tdb • 4/12/2015 • Trabalho acadêmico • 3.464 Palavras (14 Páginas) • 934 Visualizações
UNIAN-CENTRO UNIVERSITÁRIO ANHNGUERA DE NITEROI
Allan dos S Oliveira RA: 5232122439
Dayana Gonçalves Barbosa. RA: 5669141778
Walan Gomes de Oliveira Santos. RA: 5212965069
SISTEMAS DISTRIBUÍDOS
CIÊNCIA DA COMPUTAÇÃO – 7º PERÍODO
PROFESSOR: MARCELO LUCAS
NITERÓI,
29 DE NOVEMBRO DE 2015
- Introdução.
Para o desenvolvimento de um Sistema Distribuído foi escolhida a implementação do jogo da velha possibilitando dois jogadores se conectar e jogar através de uma rede. O jogo, escrito em Java, utiliza RMI para a comunicação entre os jogadores clientes. O seu desenvolvimento deu-se no ambiente Forte Community Edition.
- Justificativa.
Durante o desenvolvimento desta aplicação distribuída procuramos focar na utilização do RMIRegistry como um servidor responsável por intermediar os clientes sem a necessidade de um programa servidor rodando. Desta forma, faz-se um jogo ponto-a-ponto, onde cada qual cuidaria por manter o estado conciso do jogo.
A comunicação é feita pela passagem de mensagens através de objetos, em detrimento da troca de comandos via sockets, onde são transferidas mensagens em Strings que devem ser tratadas pela outra ponta para a dedução da mensagem.
- O Jogo.
O jogo é composto por duas classes públicas e uma interface. A interface Opponent define os métodos que serão acessados remotamente. A classe OpponentImpl faz a implementação das interfaces. A classe TicTacToeRMI define os métodos que conduzirão o jogo, bem como a interface do jogo com o usuário.
- Opponent.java.
Este arquivo apenas define quais métodos serão acessados remotamente.
package tictactoe;
public interface Opponent extends java.rmi.Remote {
public void jogueiEm(int posicao, char mark)
throws java.rmi.RemoteException;
public void comece(int ID) throws java.rmi.RemoteException;
public void parceiroSaiu() throws java.rmi.RemoteException;
}
- OpponentImpl.java.
Implementa os métodos declarados na interface Opponent. No seu construtor, é feito o registro de um RemoteObject no RMIRegistry. Caso haja algum jogador a espera de um adversário, é feita a troca de referências de objetos remotos e o jogo poderá ser iniciado.
O método jogueiEm avisa o outro jogador da sua jogada permitindo que o jogo prossiga e que o estado do jogo seja reajustado; o método comece avisa o jogador que esperava um oponente que o jogo já pode iniciar; e oponenteSaiu é enviado caso o jogo seja interrompido por algum jogador para que este não fique esperando sem que haja jogo, segurando objetos prejudiciais ao funcionamento do ambiente.
No construtor desta classe, o programa busca por um objeto X1 no registry. Caso não exista, significa que não há pessoas esperando pra jogar, então este se registra como X1. Caso X1 exista, ele procura por O1 que seria o parceiro de X1. Caso O1 não exista, ele se registra como O1 e notifica X1 do início do jogo. Se O1 existir, ele passa a procurar por X2, O2, X3,... repetindo o algorítimo. Logo, caso um objeto seja desregistrado e o outro permanecer, poderá haver distúrbios no andamento dos programas, fazendo-se necessário que sempre deixem de existir juntos.
Segue o código da classe:
package tictactoe;
import java.rmi.*;
import java.rmi.server.*;
public class OpponentImpl extends UnicastRemoteObject implements Opponent {
private TicTacToeRMI jogoRMI;
public OpponentImpl(TicTacToeRMI jogo) throws Exception {
Opponent enemy;
int gameID = 1;
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
do {
try {
enemy = (Opponent)Naming.lookup("//"+ TicTacToeRMI.rmiHost + "/X" + gameID);
} catch (NotBoundException xnb) {
try {
Naming.rebind("//" + TicTacToeRMI.rmiHost + "/X" + gameID, this);
jogo.setMark('X');
jogo.setTitle("X");
jogoRMI = jogo;
return;
} catch (Exception re) {
System.out.println("Exception: " + re.getMessage());
System.exit(0);
return;
}
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
return;
}
try {
Naming.lookup("//" + TicTacToeRMI.rmiHost + "/O" + gameID);
} catch (NotBoundException onb) {
try {
Naming.rebind("//" + TicTacToeRMI.rmiHost + "/O" + gameID, this);
jogo.setMark('O');
enemy.comece(gameID);
jogo.setMyOpponent(enemy);
jogo.setTitle("O");
jogoRMI = jogo;
return;
} catch (Exception re) {
System.out.println("Exception: " + re.getMessage());
System.exit(0);
}
}
gameID ++;
} while (true);
}
public void jogueiEm(int posicao, char mark) throws RemoteException {
...