Olá a todos do Fórum.
Estou com algumas dúvidas em um projeto que estou fazendo em parceria de alguns colegas, o tema é um jogo online chamado Stop_Online, 90% do código foi de autoria de outras pessoas,odeio ter que pegar projetos como referência mas como estou sem tempo vai ter que ser assim mesmo… tanto porque mal conheço o Java básico.
São 2 projetos java um para o servidor e outro para os jogadores, estou com dúvidas quanto a conexão do projeto dos jogadores para o projeto do servidor que já esta implementado.
Vou postar abaixo as classes principais de cada projeto Cliente e Servidor.
Projeto Cliente - Classe Jogador<<<<<<<<<<
“A parte que precisa ser fixada é a do método Conecta, preciso colocar o método main em algum local deste código também para que esta classe fique como principal.”
package stop_online;
/**
- Applet que e utilizado como iterface para o jogo.
- toda a parte grafica foi feita utilizando o pacote awt para poder ser o mais
- compativel possivel com qqer plataforma
/
import java.awt.;
import java.awt.event.;
import java.applet.Applet;
import java.util.;
import java.net.URL;
import java.rmi.;
import java.rmi.server.;
public class Jogador extends Applet implements JogadorInterface,
ActionListener {
public static final int LOGIN = 0; // Sala 1
public static final int ESPERANDO = 1; // Sala 2
public static final int JOGANDO = 2; // Sala 3
public static final int CONTABILIZANDO = 3; // Sala 4
public static final int VENDOPONTOS = 4; // Sala 5
private int estado = LOGIN;
private String nome_str;
private Vector turnos; // Vetor com objetos do tipo Turno
private StopServerInterface sserver; //Atribuindo um alias a interface Stopserver
// APPLET
private String letra = “”; //essa variavel tem que ser mandada pelo servidor
private Button login; //botão que manda o login pro servidor
private Button stop; //botão que manda o STOP pro servidor
private Button jogar;
// esse botao só é necessario pra pasear pelas telas, ele deve ser trocado
//por um comando do servidor
private Button recomecar;
// esse botao só é necessario pra pasear pelas telas, ele deve ser trocado
//por um comando do servidor
private TextField nome;
private Panel pSalaLogin; //Panel que representa a tela de Login
private Panel pSalaJogo; //Panel que representa a tela do Jogo
private Panel pSalaEspera; //Panel que representa a tela de Espera
private Panel pSalaPontos; //Panel que representa a tela dos Pontos
private Panel pSalaIntermediaria;//Panel que representa a tela Intermediaria
private Vector campos; //vetor com os TextFields do Stop
private Vector camposResposta;//vetor com os textos escritos durante o Stop
/**
-
Constroi um Jogador com o nome dado.
-
Seta o seu estado para DESCONECTADO.
-
@param nome o nome do jogador.
*/
//Método de conexão com o Servidor Stop que retorna um
//vector com a lista de jogadores
public Vector conecta() {Exception ee;
try {
// exporta o applet como um objeto remoto
System.out.println(“Jogador.init: Exportando objeto”);
try {
UnicastRemoteObject.exportObject(this);
ee = null;
} catch (java.rmi.server.ExportException e) {
// use already exported object; remember exception
ee = e;
}// lookup StockWatch server
URL base = getDocumentBase();
String serverName = “//” + getParameter(“server”) + “:”
+ getParameter(“1066”) + “/stop.StopServerImpl”;
System.out.println("Jogador.init: Procurando servidor: "+serverName);
sserver = (StopServerInterface)Naming.lookup(serverName);
/*
try {
String name = “//” + args[0] + “/Compute”;
Compute comp = (Compute) Naming.lookup(name);
Pi task = new Pi(Integer.parseInt(args[1]));
BigDecimal pi = (BigDecimal) (comp.execute.Task(task));
System.out.println(pi);
} catch (Exception e) { }
*/// ?(StopServer)Naming // Recebe o nome do servidor
//atribuida ao alias da interface StopServer
// interface.classe.método(atributo);
} catch (Exception e) {
System.out.println("exception occurred during initialization; "
+ “check the log”);
System.out.println(e.getClass().getName() + ": " + e.getMessage());// fatal error
System.out.println("got exception: " + e.getMessage());
e.printStackTrace();
return null;
}// Após conectar recebe lista de jogadores conectados
Vector lista_jogadores = null;
try{
System.out.println("Conectando ao servidor de Stop " );
lista_jogadores = sserver.novoJogador(this);
}
catch (RemoteException e){ //Tratamento de erros ao receber novos jogadores
System.out.println("exception occurred during server novoJogador " );
System.exit(0);
}return lista_jogadores;
}
/**
*
- REMOTE
- Inicia um novo turno em um jogo em andamento.
-
@param turno o novo Turno do jogo.
*/
public void novoTurno(Turno turno) {
this.turnos.add( turno );
System.out.println(“Jogador.novoTurno: Iniciando nova rodada ! " +
“(letra=”+turno.getLetra()+”)");
letra = turno.getLetra();
salaJogo();
update(false); //Atualiza status atual do turno aberto true ou fechado false
}
/**
- REMOTE
- Executa um stop no turno atual e devolve o turno com as respostas prenchidas
*/
public Turno stopJogo() throws RemoteException{
if(this.estado != Jogador.JOGANDO )
return null;
update(false);
pegaValores();
turnoAtual().setRespostas( camposResposta );
zeraRespostas();
return turnoAtual();
}
/**
- REMOTE
- Monta sala de pontuacao
*/
public void mostraPontos( Hashtable respostasDosJogadores )
throws RemoteException {
// System.out.println("Jogador.pontos = "+ respostasDosJogadores);
if ((respostasDosJogadores != null) && (respostasDosJogadores.size() > 0)){
//System.out.println(“UPDATE: Dados do turno :
//” + turnoAtual().getColunas().toString());
Iterator nomeJogadores = (Iterator) respostasDosJogadores.keys();
Vector jogadores = new Vector();
Vector pontos = new Vector();
while( nomeJogadores.hasNext() ) {
String nome = (String)nomeJogadores.next();
Turno turno = (Turno)respostasDosJogadores.get( nome );
String p = Integer.toString( turno.getTotalPontos() );
System.out.println(" Nome = "+nome+" Pontos = " + p );
jogadores.add( nome );
pontos.add( p );
}
salaPontos( pontos, jogadores, false );
update(false);
}
}
/**
- REMOTE
*/
public String getNome(){
return this.nome_str;
}
public Turno turnoAtual(){
return (Turno)turnos.lastElement();
}
/**
- Inicializa o applet, montando algumas salas que nao dependem do servidor
*/
public void init()
{
campos = new Vector();
camposResposta = new Vector();
turnos = new Vector();
salaLogin();
salaIntermediaria();
// nao precisa montar as outras telas aqui
this.setLayout(new BorderLayout());
this.add("Center", pSalaLogin);
}
public void pegaValores()
{
Iterator iter = (Iterator) campos.elements();
while (iter.hasNext()){
TextField textTemp = (TextField)iter.next();
String s = textTemp.getText();
System.out.println("Jogador: Resposta = ("+s+")");
if(s.startsWith(letra.toUpperCase()) || s.startsWith(letra.toLowerCase())){
camposResposta.add(s.trim());
}
else {
camposResposta.add("");
}
}
System.out.println("Jogador: Respostas="+camposResposta.toString());
}
/**
- este metodo monta a tela de login, � sempre a
- primeira sala que o jogador ver�
- a verifica��o se o jogador colocou um nome esta
- no metodo que cuida do evento do bot�o
*/
public void salaLogin()
{
pSalaLogin = new Panel(new FlowLayout(FlowLayout.CENTER));
pSalaLogin.add(new Label("Nome"));
nome = new TextField("", 30);
pSalaLogin.add(nome);
login = new Button("Jogar!!");
login.addActionListener(this);
pSalaLogin.add(login);
}
/**
- Monta o layout da sala de Espera que � onde o novo jogador fica
- at� come�ar um novo turno do Jogo
- recebe a letra que esta sendo usado na partida sendo jogada
- e um vetor com os jogadores que est�o jogando
*/
public void salaEspera(Vector jogadores)
{
pSalaEspera = new Panel(new GridLayout(0, 1));
Iterator iter = (Iterator) jogadores.elements();
this.letra = ((String)iter.next());
pSalaEspera.add(new Label("a letra sendo jogada �:" + letra));
pSalaEspera.add(new Label("Pessoas Jogando:", Label.CENTER));
String jogAux;
while (iter.hasNext()){
jogAux = ((String)iter.next());
pSalaEspera.add(new Label(jogAux, Label.CENTER));
}
pSalaEspera.add(new Label("aguarde a rodada acabar para poder começ" +
"ar a jogar", Label.CENTER));
// essa parte do bot�o n�o � necess�ria no applet final, isso sera
//feito pelo servidor
}
/**
- Este metodo monta a tela do jogo mesmo, recebe do
- servidor um vetor de categorias
- e a letra da rodada atravez de uma Estrutura Turno
- ainda nao coloquei recebendo um turno… fa�o isso
- depois, mas depois que colocar o turno
- basta pegar as categorias e a letr dele e pronto
*/
public void salaJogo() //estudar
{
pSalaJogo = new Panel( new BorderLayout());
pSalaJogo.add(“North”, new Label("Letra Valendo: " +
turnoAtual().getLetra()));
Panel pJogo = new Panel( new GridLayout(0, 2));
Vector categorias = turnoAtual().getCategorias();
//Enumeração das categorias
Iterator iterC = (Iterator) categorias.elements();
pJogo.add(new Label("Categorias"));
pJogo.add(new Label("Respostas"));
campos = new Vector();
while (iterC.hasNext()){
pJogo.add(new Label((String)iterC.next() + ":"));
TextField text = new TextField("", 30);
campos.addElement(text);
pJogo.add(text);
}
stop = new Button("Stop");
stop.addActionListener(this);
pSalaJogo.add("Center", pJogo);
pSalaJogo.add("South", stop);
}
/**
- Esta � uma tela intermediaria enquanto o servidor nao
- manda quantos pontos * cada jogador fez
*/
public void salaIntermediaria() {
pSalaIntermediaria = new Panel(new BorderLayout());
pSalaIntermediaria.add(“Center”, new Label("Contabilizando os " +
“Pontos…”, Label.CENTER));
}
/**
- Este metodo mostra os pontos obtidos na ultima rodada, esses pontos tem que
- ser mandados pelo servidor atrav�s de dois vetores, um de jogadores e um de
- pontos, os pontos do jogador i estao na posicao i do vetor de pontos
*/
public void salaPontos(Vector pontos, Vector jogadores, boolean terminou)
{
pSalaPontos = new Panel(new BorderLayout());
Panel pAux = new Panel(new GridLayout(0, 2));
Iterator iterP = (Iterator) pontos.elements();
Iterator iterJ = (Iterator) jogadores.elements();
pAux.add(new Label("Jogador"));
pAux.add(new Label("Pontos"));
int maiorPontuacao = -1;
String vencedor = "";
System.out.println("Montando layout!!!");
while (iterJ.hasNext()){
String jogadorAux = (String)iterJ.next();
String pontosAux = (String)iterP.next();
if(maiorPontuacao < Integer.parseInt(pontosAux)){
vencedor = jogadorAux;
maiorPontuacao = Integer.parseInt(pontosAux);
}
pAux.add(new Label(jogadorAux + ":"));
pAux.add(new Label(pontosAux));
}
if(terminou){ // monta um Panel dando os parabens a quem ganhou
pSalaPontos.add("South", new Label("Parabens " + vencedor +
", voc� foi o grande vencedor"));
}
pSalaPontos.add(“North”, new Label(“Letra da Rodada:” + letra, Label.CENTER));
pSalaPontos.add(“Center”, pAux);
//esta parte � feita pelo servidor, nao precisa desse bot�o pra mudar de tela
}
/**
- este metodo verifica quando o jogador apertou algum dos bot�es do applet
- e toma as devidas provid�ncias
*/
public void actionPerformed(ActionEvent evt)
{
if (evt.getSource() == login){
TextField t = (TextField) pSalaLogin.getComponent(1);
if(t.getText().equals("")){
// o jogador nao preencheu o nome
this.add(“North”, new Label("Coloco um nome antes de come�ar " +
“a jogar”,Label.CENTER));
this.validate();
}
else {
// avisa o servidor que quer jogar, pega os dados e vai pra sala de espera
nome_str = t.getText();
// Conecta ao servidor e preenche o Vector com lista de jogares
Vector lista_jogadores = conecta();
System.out.println("Lista de Jogadores: "+lista_jogadores.toString());
salaEspera( lista_jogadores );
update(false);
}
}
//essa parte do if vai sair daqui ja que o servidor que altera pra tela de jogo
else if(evt.getSource() == stop){
// avisa o servidor que ele deu um Stop, e espera o servidor
//muda-lo pra tela Intermediaria
try{
System.out.println("Jogador: Enviando STOP para o servidor" );
sserver.stop(this);
}catch (RemoteException e) {
System.out.println("Jogador: REMOTE EXCEPTION no stop() " );
System.exit(0);
}
// pegaValores();
// manda respostas pro servidor
}
}
/**
- pega os campos da tela do jogo e os limpa
- senao na proxima rodada valores antigos aparecer�o
*/
public void zeraRespostas()
{
Iterator iter = (Iterator) campos.elements();
while (iter.hasNext()){
TextField t = (TextField)iter.next();
t.setText("");
camposResposta.removeAllElements();
}
}
/**
- esse metodo � chamado pelo servidor e atualiza ent�o a tela do applet
- antes de chamar esse metodo o servidor tem que montar o panel que
- sera usado chamando o metodo correnpondente
-
@param acabouPartida diz se deve encerrar essa partida ou nao
*/
public void update(boolean acabouPartida)
//A cada estado em cada condição é processado o placar do turno atual
{
if(estado == LOGIN){
this.removeAll();
this.add(“Center”, pSalaEspera);
estado = ESPERANDO;
}
else if(estado == ESPERANDO){
this.removeAll();
this.add("Center", pSalaJogo);
estado = JOGANDO;
}
else if(estado == JOGANDO){
this.removeAll();
this.add("Center", pSalaIntermediaria);
estado = CONTABILIZANDO;
}
else if(estado == CONTABILIZANDO){
this.removeAll();
this.add("Center", pSalaPontos);
estado = VENDOPONTOS;
} //true
else if((estado == VENDOPONTOS) && (!acabouPartida)){
this.removeAll();
this.add("Center", pSalaJogo);
estado = JOGANDO;
} //false
else if((estado == VENDOPONTOS) && (acabouPartida)){
this.removeAll();
this.add("Center", pSalaEspera);
estado = ESPERANDO;
}
this.validate();
}
}
Projeto Servidor>>Classe StopServer<<<
package stop_online_server;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Vector;
public class StopServerImpl extends UnicastRemoteObject
implements StopServerInterface, Runnable{
private static final long serialVersionUID = 1L;
public static final int STAND_BY = 0;
public static final int RUNNING = 1;
public static final int STOPED = 2;
private int id; /* ID do servidor */
private Vector jogadores;
private Turno turnoAtual;
private int estado;
private int tempo_espera;
private int TIMEOUT_START = 50000;
private int TIMEOUT_STOP = 500000;
/* thread temporizador para notificar o start e
stop ( caso ninguem tenha apertado o botao )*/
private Thread timer = null;
public StopServerImpl( int id ) throws RemoteException {
this.id = id;
this.turnoAtual = new Turno( Turno.sorteiaLetra(), id,
Turno.getCategDefault());
this.jogadores = new Vector();
this.estado = STAND_BY;
// start thread para iniciar Jogo (se houver jogadores )
this.timer = new Thread(this, “timerSTART”);
timer.start();
}
// *Retorna um Vector com a primeira posicao sendo a letra sorteada
//e as seguintes os jogadores conectados */
public Vector lista_jogadores(){
Vector v = new Vector(); //
v.add( turnoAtual.getLetra() );
Iterator it = (Iterator) jogadores.elements();
while(it.hasNext()){
JogadorInterface jogador = ((JogadorInterface)it.next());
try{
v.add( jogador.getNome());
} catch (RemoteException ex) {
System.out.println("StopServer.getNome(): REMOTE EXCEPTION : " +
“Removendo jogador da lista”);
removeJogador( jogador );
}
}
return v;
}
/**
- REMOTE
- Acrescenta um jogador na lista de jogadores.
*/
public Vector novoJogador(JogadorInterface jogador)
{
try {
System.out.println("StopServer: novoJogador ("+jogador.getNome()+")\n");
} catch (RemoteException ex) {
System.out.println("StopServer.getNome(): REMOTE EXCEPTION : " +
"Removendo jogador da lista");
removeJogador( jogador );
}
// adiciona jogador na lista
if (!jogadores.contains( jogador )) {
jogadores.addElement( jogador );
}
// Retorna um vector padrao (letra + usuarios)
return lista_jogadores();
}
/**
*
- REMOTE
*/
public int stop(JogadorInterface jogador) {
System.out.println(“StopServer: Executado stop \n”);
estado = STOPED;
stopTodosJogadores(jogador);
return 1;
}
/**
- Executa stopJogo em todos os jogadores,
- contabiliza os pontos e guarda nos objetos Coluna dos jogadores
*/
public void stopTodosJogadores(JogadorInterface jogador_stop)
{
System.out.println(“StopServer: Executando stopTodosJogadores\n”);
// So contera pontos dos jogadores ativos.
// KEY = jogador
// VALUE = Vector de objs do tipo Coluna
Hashtable respostasDosJogadores = new Hashtable();
Iterator it = (Iterator) jogadores.elements();
//Le respostas dos jogadores
while( it.hasNext() ) {
JogadorInterface jogador = (JogadorInterface)it.next();
try {
System.out.println("StopServer.stopTodosJogadores: sending " +
"stopJogo para: " + jogador.getNome());
Turno turno = jogador.stopJogo();
if (turno != null){
String n = jogador.getNome();
if (jogador_stop != null) {
String nome_stop = jogador_stop.getNome();
if (n.equals(nome_stop)){
System.out.println(" Nome : "+n+" apertou STOP\n");
n = n + " (apertou STOP!)";
}
}
respostasDosJogadores.put( n, turno);
}
} catch (RemoteException ex) {
System.out.println("StopServer.getNome(): REMOTE EXCEPTION : " +
"Removendo jogador da lista");
removeJogador( jogador );
}
}
int colNum;
for (colNum = 0; colNum < turnoAtual.numColunas() ; colNum++ ){
// Ocorrencia de palavras por coluna da categoria
// KEY = palavra
// VALUE = num de ocorrencias
Hashtable ocorrenciasColuna = new Hashtable();
Iterator resps = (Iterator) respostasDosJogadores.elements();
// Calcular ocorrencias
while( resps.hasNext() ) {
Turno turno = (Turno)resps.next();
Vector colsResposta = turno.getColunas();
Coluna coluna = (Coluna)colsResposta.get(colNum);
if( coluna.getResposta() != null){
if ( !ocorrenciasColuna.containsKey( coluna.getResposta() )) {
ocorrenciasColuna.put( coluna.getResposta(), new Integer(1));
}else{
ocorrenciasColuna.put( coluna.getResposta(), new Integer(2));
}
}
}
resps = (Iterator) respostasDosJogadores.elements();
// Calcular os pontos por jogador
while( resps.hasNext() ) {
Turno turno = (Turno)resps.next();
Vector colsResposta = turno.getColunas();
Coluna coluna = (Coluna)colsResposta.get(colNum);
int pontos;
if (coluna.getResposta() != null && (coluna.getResposta().length() > 3)){
if ( ((Integer)ocorrenciasColuna.get( coluna.getResposta() )).intValue() == 2){
pontos = 5;
}else{
pontos = 10;
}
}else{
pontos = 0;
}
coluna.setPontos( pontos);
turno.incrPontos( pontos );
}
}
//System.out.println("StopServer.Pontos = "+respostasDosJogadores.toString());
it = (Iterator) jogadores.elements();
// UPDATE em todos os jogadores
while( it.hasNext() ) {
JogadorInterface jogador = (JogadorInterface)it.next();
try{
System.out.println("Enviando pontos para : "+jogador.getNome()+ “\n”);
jogador.mostraPontos( respostasDosJogadores );
} catch(RemoteException ex) {
System.out.println("StopServer.mostraPontos(): " +
"REMOTE EXCEPTION : Removendo jogador da lista");
removeJogador( jogador );
}
}
this.estado = STAND_BY;
this.timer = new Thread(this, “timerSTART”);
timer.start();
}
public void removeJogador( JogadorInterface jogador){
jogadores.removeElement( jogador );
}
/**
- Executa novoJogo em todos jogadores
*/
public void novoTurno() {
turnoAtual = new Turno( Turno.sorteiaLetra(), 1, Turno.getCategDefault() );
Iterator it = (Iterator) jogadores.elements();
while(it.hasNext()){
JogadorInterface jogador = (JogadorInterface)it.next();
try{
jogador.novoTurno( turnoAtual.clone2() );
} catch (RemoteException ex) {
System.out.println("StopServer.novoTurno(): remote exception");
//ex.printStackTrace();
removeJogador(jogador);
}
}
estado = RUNNING;
this.timer = new Thread(this, “timerSTOP”);
timer.start();
}
/**
*
- Temporizador para executar o stop (se necessario)
*/
public void run()
{
int estado_atual = estado;
if (estado_atual == STAND_BY){
System.out.println("StopServer.timer: Esperando para iniciar jogo");
tempo_espera = TIMEOUT_START;
}else{
System.out.println("StopServer.timer: timer para stop ativado");
tempo_espera = TIMEOUT_STOP;
}
try {
Thread.currentThread().sleep(tempo_espera);
} catch (InterruptedException e) {
}
// START
if (estado_atual == STAND_BY && (jogadores.size() >= 2)){
System.out.println(“StopServer.timer: Iniciando jogo (ja tem 2 jogadores)”);
novoTurno();
//STOP
}else{ // estado_atual == RUNNING
System.out.println("StopServer.timer: Enviando STOP");
if (estado != STOPED){ // e ainda nao recebeu stop
stop(null);
}else{
System.out.println("StopServer.timer: Alguem ja enviou stop ");
}
}
timer = null;
}
/**
- Inicializa um servidor (tambem cria um server registry )
*/
public static void main(String args[])
{
// Security manager
System.setSecurityManager(new RMISecurityManager());
try {
System.out.println("StopServer.main: creating registry");
LocateRegistry.createRegistry(1066);
System.out.println("StopServer.main: creating server");
StopServerImpl server = new StopServerImpl(1);
System.out.println("StopServer.main: binding server ");
Naming.rebind("//:1066/stop.StopServerImpl", server);
System.out.println("StopServer.main: done");
} catch (Exception e) {
System.out.println("StopServer.main: an exception occurred: " +
e.getMessage());
e.printStackTrace();
}
}
}
Nas Férias pretendo fazer um projeto do 0 igual a esse mas de outra forma.
Bem pessoal é isso, se alguém puder ajudar eu agradeço.