segunda-feira, 17 de janeiro de 2011

SOA TomCat-Axis


 Guia para implementação de WebServices em Container TomCat:

Introdução:

O objetivo deste guia é mostrar – passo a passo – como implementar um webService, com servidor e cliente, funcional, em ambiente TOMCAT.
Um WebService é qualquer aplicação que é dividia em cliente e servidor.
            O Servidor: É a parte do sistema responsável pelo processamento dos dados, CRUD e encaminhamento dentro da rede.
            O Cliente pode coletar (do usuário ou de outros aplicativos ou bancos), enviar e/ou receber dados do servidor e/ou apresentar os dados enviados pelo servidor (a usuários ou encaminhar a outras aplicações).
Através dos estudos de caso, notou-se que o Container Tomcat serve para publicar páginas e aplicações web, mas não possui muito suporte sobre o processamento dos serviços. Isso porque, pelo menos para JAVA, o TomCat não disponibiliza API’s necessárias para referência nas aplicações. Assim, o princípio do servidor, de processar dados, não pode ser alcançado pela falta de capacidade de interpretação de componentes necessários.
Foi aferido que existem outros Container’s que mostram mais suporte às aplicações, como o GlassFish e o JBossESB. Destes dois, em específico, o GlassFish mostrou-se o mais simples, apresentando pouco mais que as API’s básicas para uma aplicação CRUD convencionais. O Container JBossESB, por sua vez, além de suportar aplicações JAVA, estende-as com API’s específicas para implementação de barramentos web, auxiliando desde o processo de codificação (ampliando a gama de extensões suportadas pelo Eclipse com JbossTools, por exemplo), passando por automações na comunicação entre clientes e servidores chegando a oferecer até um ambiente gráfico mais eficiente para manipulação dos arquivos que participam do webService. Claro que cada facilidade apresentada por estes outros Container’s implica em tamanho maior do Container e demora significativa no tempo de execução das aplicações.

Ambiente de Trabalho:

O TomCat, sozinho, não possui capacidade de implementar webServices.
Por isso, a Apache disponibiliza um complemento chamado Axis.

Executável TomCat:

Zip com a pasta Axis:

Complemento xerces:
 
1 – Instale o TomCat normalmente;
2 – Descompacte o zip do Axis;
3 – Mova a pasta "Axis", que encontra-se dentro do diretório webapps do arquivo, para a pasta webapps do TomCat;
4 – Descompactar o zip do xerces;
5 – Mover os arquivos “xercesImpl.jar” e “xml-apis.jar” da pasta xerces para a pasta axis\lib\ (do próprio diretório Axis, descompactado anteriormente).
6 – Criar as seguintes variáveis de ambiente:
(Criar as JAVA, caso ainda não estejam criadas, também.)

AXIS_HOME=C:\axis

AXIS_LIB=%AXIS_HOME%\lib

AXISCLASSPATH=%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging- 1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar;%AXIS_LIB%\jaxrpc.jar

7 – Mover o arquivo tools.jar da pasta lib do JAVA para a pasta lib do Axis, dentro do TomCat.

8 - Pode-se testar se o ambiente está ok abrindo o navegador e digitando a seguinte URL:


Se aparecer a tela do servidor Axis, estará tudo ok.

Desenvolvimento do Servidor:

1 - Abra a IDE e crie a seguinte classe JAVA:

/*
 * Esta classe foi desenvolvida para ser referencia de teste para implementação de SOA.
 * Este é um arquivo de servidor webService.
 * Recebe duas variáveis Inteiras do cliente e devolve a soma delas para o cliente
 */

public class Calculadora {
      public int somar( int a, int b ) {
            return a + b;
      }
}

2 – Salve o arquivo do servidor;
3 – Copie o arquivo do seu contexto para a pasta:
C:\Arquivos de programas\Apache Software Foundation\Tomcat 7.0\webapps\axis\

4 – No Browser, digite a seguinte URL:

Aparecerá a seguinte tela:



Clicando no Link, você verá o arquivo WSDL:


 Agora, o servidor TomCat/Axis já possui o arquivo de comunicação pronto, aguardando o envio de dados pelo cliente.


Desenvolvimento do Cliente:

1 – Certifique-se que a IDE possui as Lib’s do Axis.
No Eclipse, para incluir as Lib’s, Basta clicar o botão direito sobre a pasta do projeto -> Propriedades.
JavaBuildPaths -> Libraries -> Add External JAR’s
Selecione todas as JAR’s da pasta LIB do Axis -> OK.

2 – Abra a IDE e crie o seguinte arquivo:

import javax.swing.*;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.xml.rpc.ParameterMode;

public class Cliente {
     
      public Cliente(){
           
      }
     
         private void invocaServico(String endpointURL, int mensagem1, int mensagem2){

                  int resposta = 0;
                  Service  service  = new Service();
                  Call call;

                  try {

                     call = (Call) service.createCall();
                    
                     // Atribuindo a URL do Servico
                     call.setTargetEndpointAddress(new java.net.URL(endpointURL));

                     // Definindo o metodo a ser invocado
                     call.setOperationName("somar");

                     // Definindo os parametros de entrada
                     call.addParameter("a", XMLType.XSD_INT, ParameterMode.IN);
                     call.addParameter("b", XMLType.XSD_INT, ParameterMode.IN);

                     // Definindo o tipo do parametro de retorno
                     call.setReturnType(org.apache.axis.encoding.XMLType.XSD_INT);

                     // Invocando o servico
                     resposta = (Integer) call.invoke(new Object[] {mensagem1, mensagem2});

                     // Imprimindo a resposta
                     JOptionPane.showMessageDialog(null, "Servico invocado...\n" + resposta);

                  } catch (Exception ex) {
                     ex.printStackTrace();
                  }
               }
        
         public static void main(String args[]){
             args= new String[3];
             // Aqui é colocado o caminho que está indicado no arquivo WSDL.
             args[0]="http://localhost:8080/axis/Calculadora.jws?wsdl";
             args[1]="4";
             args[2]="4";
            
            
            String endpointURL = null;
            int mensagem1   = 0;
            int mensagem2   = 0;

            if (args.length < 3){
               System.out.println("Sintaxe errada. \nInforme a URL e a Mensagem");
               System.out.println("Ex: java ClientHelloWorld http://localhost:8080/axis/HelloWorld.jws \"Ola mundo\"");
               System.exit(0);
            }

            try {
               //Obtendo a URL do Servico Web
               endpointURL = args[0];

               //Obtendo a mensagem 1
               args[1] = JOptionPane.showInputDialog("Digite o primeiro fator da Soma:");
               mensagem1 = Integer.parseInt(args[1]);
              
               //Obtendo a mensagem 2
               args[2] = JOptionPane.showInputDialog("Digite o segundo fator da Soma:");
               mensagem2 = Integer.parseInt(args[2]);
              
            } catch (Exception ex) {
               ex.printStackTrace();
            }

            //Criando uma instancia da classe ClientHelloWorld
            Cliente client = new Cliente();

            //Invocando o metodo 'invocaServico'
            client.invocaServico(endpointURL, mensagem1, mensagem2);
         }
}
 
3 – Compile e Rode.


Conclusão

1 – O cliente vai solicitar dois números para o usuário;
2 – O usuário irá fornecer e clicar “OK” para cada número;
3 – O cliente irá estabelecer uma conexão através do caminho do arquivo WSDL;
3 – O cliente irá enviar dois parâmetros para o servidor: número 1 e número 2;
4 – O servidor irá receber os parâmetros, efetuar a soma e devolver o resultado;
5 – O cliente irá receber a resposta e mostrar na tela a resposta para sua solicitação.

Esta é uma aplicação básica, podendo apenas trabalhar com:
1 – Sempre precisamos ter o fonte Java disponível;
2 – A classe não pode fazer parte de nenhum pacote;
3 – Não pode utilizar outros tipos, senão os básicos do Java (primitivos, wrappers e String).

Mesmo assim, este modo de aplicação pode muito bem ser utilizada como base para vários clientes enviando e recebendo informações para um servidor com vários métodos de controle, que reenvia para os clientes corretos as informações necessárias.




terça-feira, 30 de novembro de 2010

Delphi

Deixe-me explanar um pouco a respeito de Delphi.

Deixo claro que não gosto desde o início.
Talvez por ter aprendido JAVA desde início, acho Delphi e suas procedures sem lógica.
Não consigo ver amarração nas variáveis e, só de imaginar a possibilidade de utilizar alguns componentes como variáveis, já sinto calafrios.

Outra desvantagem que vejo no Delphi é a dependência de componentes; nada está claramente catalogado, há muitos atributos e eventos, o que não garanta que você encontre um específico no componente que você está usando - mesmo se fisse lógica a existência.

Aliás, os eventos são dignos de um parágrafo próprio: Programação orientada a eventos? Realmente quebrei a cabeça para unir dois eventos que queria que resultassem em uma mesma coisa.

No JAVA, se você não sabe algo, sempre há a API. Toneladas de livros, sites de referencia, fóruns com pessoas dispostas a ajudar e toda uma cultura de auxílio mútuo, completam esse mundo.
No Delphi, se você não sabe algo, fica parado em frente à tela, sem saber o que fazer... Onde procurar? Como é uma "tecnologia" paga, raramente encontramos e-books grátis, fóruns com gente querendo ajudar os outros, tão pouco cordialidade entre os "programadores".
Exemplo disso é que fiquei 4 semanas pedindo ajuda para fazer o trabalho final que tenho que entregar dentro de instantes e NINGUÉM ajudou. Sequer a "professora". Isso que trabalho em uma empresa que trabalha com Delphi (mas que, graças a Deus, está migrando o sistema para JAVA, programação de verdade).

Os Forms Delphi dão a ilusão de serem classes JAVA, podendo ser objetos a serem utilizados conforme a necessidade, o que é uma gigantesca falácia.
Talvez o que atraia as pessoas para essa armadilha seja a ilusão de criar a tela arrastando componentes. Isso várias IDE's de outras linguagens também fazem, de forma gratuíta e sem necessidade de cracks.

Aliás, essa prática de arrastar componentes é o que cria "programas" com telas-monstro, com mais de 40 campos de inclusão... Atitude típica de interfaces Delphi. Não preciso nem dizer que essas telas costumam dar muita manutenção e suporte, porque são dificílimas até de saber por onde começar.

Por fim, o lixo de código e a programação duplicada inundam o Delphi. A programação é totalmente estruturada, repetindo enormes quantidades de linhas que, se fosse em JAVA, não precisaríamos fazê-lo.

Ficaria muito feliz em nunca mais tocar nessa porcaria na minha vida, a fim de não me contaminar com as práticas obsoletas dessa "Linguagem".

PS - Programadores Delphi: Sequer pensem em me perguntar algo... vão direto para a biblioteca, ok? ;)

quarta-feira, 24 de novembro de 2010

Trabalho do Labirinto Java

Segue o caso-de-uso passado pelo professor Rafael Jefman:

------------------------------------------------------------------------------------------

Trabalho: Jogo de Labirinto


Objetivo:


Implementar um jogo de labirinto, com interface em modo texto,

utilizando a linguagem Java, obedecendo as regras e requisitos abaixo.


Regras e requisitos:


- A interface com o usuário será feita via console, com o usuário

digitando comandos.

- Os comandos serão compostos por verbos e substantivos, por exemplo

"Andar Sul", ou "Olhar armadilha".

- O objetivo do jogo é que o Jogador consiga "fugir" de um labirinto .

- O labirinto é formado por salas, onde cada sala pode ter até 6

saídas (Norte, Sul, Leste, Oeste, Acima, Abaixo).

- Cada sala pode estar vazia, conter um tesouro, um inimigo, uma

armadilha, ou não ter nada.

- O Labirinto será descrito por um arquivo texto, entregue pelo

professor, em aula.


Inimigos e Regras de Combate:


- O Jogador terá, no início do jogo, 10 unidades de vida

- Cada golpe do Jogador, em combate causará 2 unidades de dano, mais

as unidades somadas da arma que o Jogador está utilizando.

- As armas disponíveis para o Jogador são:

      - Faca: 1 dano (o jogador inicia com a faca)

      - Espada: 2 danos

      - Cimitarra: 3 danos

- As armas são obtidas como os tesouros.

- O jogador só pode carregar uma arma de cada vez.

- Os inimigos causam danos variados e possuem pontos variados de vida,

de acordo com o tipo de inimigo:

      Goblins: 1-2 ponto de dano, 2 a 3 pontos de vida

      Orcs: 2-4 pontos de dano, 3 a 5 pontos de vida

      Trolls: 4-6 pontos de dano, 4 a 7 pontos de vida

- O combate é resolvido em "turnos", sendo que o Jogador pode escolher

combater o inimigo ou não. Sempre que o Jogador atacar o inimigo, ele

irá revidar com um golpe. Golpes serão efetivos 80% das vezes para os

jogares e 50% das vezes para os inimigos.

- Se um inimigo está em uma sala, ele bloqueará a passagem do jogador

para uma das saídas, aleatoriamente.

- Os inimigos serão distribuídos aleatoriamente pelo labirinto.


Tesouros:


Além das armas, outros tesouros podem ser encontrados no labirinto:

      - Poção da Vida: faz com que a quantidade de pontos de vida do

jogador retorne a 10

      - Armadura: Aumenta a resistencia aos golpes dos inimigos

              - Armadura de Couro: 1 ponto

              - Armadura de Metal: 2 pontos

              - Armadura de Mithrill: 3 pontos

      - Fogo de Dragão: Quando utilizado, mata o inimigo instantaneamente.

      - Chaves: Algumas portas estarão trancadas, e é preciso que o jogador

possua uma chave para abri-las. As chaves podem ser das cores Azul,

Verde, Vermelha e Amarela, cada uma abre uma porta da mesma cor.

Portas "marrom" não são trancadas. Uma porta tem 10% de chance de ser

Azul, 10% de chance de ser Verde, 10% de chance de ser Vermelha e 10%

de chance de ser Amarela. Se uma porta não tiver "cor", ela será

"marrom" e estará destrancada.


Os Tesouros estarão em salas aleatórias. O Jogador pode carregar

apenas uma arma, um tesouro e uma armadura ao mesmo tempo. Para

carregar outro equipamento, é necessário largar o que já está

utilizando.


As armadilhas são inimigos que:


- Não bloqueiam a porta onde estão localizadas.

- Causam dano aleatório de 1 até a morte instantânea (ao contrário dos

inimigos, cujo dano é fixo)

- Tem dois estados: armadas e desarmadas

- Se um jogador passar pela armadilha sem a desarmar, recebe o dano,

mas consegue passar.

- Uma porta pode ter uma armadilha e um inimigo.

- O jogador tem 90% de chance de desarmar a armadilha.

------------------------------------------------------------------------------------------


Daqui em diante, seguem as classes que implementei:


------------------------------------------------------------------------------------------


Classe Labirinto, método main, que chama as demais classes.


------------------------------------------------------------------------------------------

package Labirinto;
 
import java.io.*;

public class Labirinto {
    
    public static void main(String[] args) {
        
        String a="";
        String aux="";
        
        BufferedReader entra = new BufferedReader(new InputStreamReader(System.in));  
        mapa m = new mapa();
        
        m.abrir();
        m.LugarInicial();
        
        while (!aux.equals("O")||!aux.equals("o")){
            try{
                System.out.println("Digite a ação desejada: \n");
                aux = entra.readLine();
                
                System.out.println(aux);
                
                if(aux.equals("Ver Ajuda")){
                    a+="Andar Norte        - Escolhe passar pela porta norte \n";
                    a+="Andar Sul          - Escolhe passar pela porta sul \n";
                    a+="Andar Leste        - Escolhe passar pela porta leste \n";
                    a+="Andar Oeste        - Escolhe passar pela porta oeste \n";
                    a+="Subir Escada       - Escolhe subir o andar \n";
                    a+="Descer Escada      - Escolhe descer o andar \n";
                    a+="Ver Mochila        - Escolhe ver os itens carregados \n";
                    a+="Ver Ajuda          - Escolhe ver os comandos de ajuda \n";
                    a+="Descrever Sala     - Descreve a sala onde você está \n";
                    a+="Desarmar Armadilha - Desarma a armadilha encontrada \n";
                    a+="Pegar Arma         - Pega Arma do tesouro \n";
                    a+="Pegar Armadura     - Pega Armadura do tesouro \n";
                    a+="Pegar Fogo         - Pega Fogo do Dragão do tesouro \n";
                    a+="Pegar Cura         - Pega Poção de Cura do tesouro \n";
                    a+="Pegar Chave        - Pega Chave do tesouro \n";
                    a+="Fechar Jogo        - Escolhe fechar o jogo \n";
                }
                
                if(aux.equals("Andar Norte")||aux.equals("Andar Sul")||aux.equals("Andar Leste")||aux.equals("Andar Oeste")||aux.equals("Subir Escada")||aux.equals("Descer escada")){
                    m.andar(aux);                
                }
                
                if(aux.equals("Ver Mochila")){
                    m.listaMochila();
                }                
                if(aux.equals("Descrever Sala")){
                    m.descrever();
                }
                if(aux.equals("Desarmar Armadilha")){
                    m.desarmarArmadilha();
                }
                if((aux.equals("Pegar Arma"))||(aux.equals("Pegar Armadura"))||(aux.equals("Pegar Chave"))||(aux.equals("Pegar Cura"))||(aux.equals("Pegar Fogo"))){
                    m.pegarTesouro(aux);
                }
                if(aux.equals("Fechar Jogo")){
                    aux="O";
                }                                                
                
                System.out.println(a);
                a="";
            }catch (IOException exception) {  
                exception.printStackTrace();  
            }  
        }
    }
}


------------------------------------------------------------------------------------------


Classe Mapa, principal classe, responsável pela leitura do arquivo, montagem do mapa, movimentação do personagem e descrição.


------------------------------------------------------------------------------------------

package Labirinto;

import java.io.*;
import java.util.Scanner;

class mapa {

/*Cria uma matriz que guardará as salas e conexões de qualquer labirinto com até 1000 salas:
Estrutura:
Linha 1: Conexão Norte;  N - não tem | 0 a 1000 - número da sala que faz conexão;
Linha 2: Conexão Sul;    N - não tem | 0 a 1000 - número da sala que faz conexão;
Linha 3: Conexão Leste;  N - não tem | 0 a 1000 - número da sala que faz conexão;
Linha 4: Conexão Oeste;  N - não tem | 0 a 1000 - número da sala que faz conexão;
Linha 5: Conexão Acima;  N - não tem | 0 a 1000 - número da sala que faz conexão;
Linha 6: Conexão Abaixo; N - não tem | 0 a 1000 - número da sala que faz conexão;

Exemplo:

room 18 north 24 south 25 TRAP east 19 west 22 up 28 TRAP

sala[18][1] = 24;
sala[18][2] = 25;
sala[18][3] = 19;
sala[18][4] = 22;
sala[18][5] = 28;
sala[18][6] = N;
*/
private String [][] sala = new String[1000][7];

/*Cria uma matriz que guardará a cor das conexões de qualquer labirinto com até 1000 salas:
Estrutura:
Linha 1: Conexão Norte;  N - não tem | Cor da Porta | D - destrancada
Linha 2: Conexão Sul;    N - não tem | Cor da Porta | D - destrancada
Linha 3: Conexão Leste;  N - não tem | Cor da Porta | D - destrancada
Linha 4: Conexão Oeste;  N - não tem | Cor da Porta | D - destrancada
Linha 5: Conexão Acima;  N - não tem | Cor da Porta | D - destrancada
Linha 6: Conexão Abaixo; N - não tem | Cor da Porta | D - destrancada

Exemplo:

room 18 north 24 (Marrom) south 25 TRAP (Azul) east 19 (Marrom) west 22 (Vermelha) up 28 TRAP (Verde)

cor[18][1] = Marrom;
cor[18][2] = Azul;
cor[18][3] = Marrom;
cor[18][4] = Vermelha;
cor[18][5] = Verde;
cor[18][6] = N;
*/
private String [][] cor = new String[1000][7];

/*Cria uma matriz que guardará as armadilhas de qualquer labirinto com até 1000 salas:
Estrutura:
Linha 1: Conexão Norte;  N - não possui | TRAP - possui armada | D - possui desarmada ;
Linha 2: Conexão Sul;    N - não possui | TRAP - possui armada | D - possui desarmada ;
Linha 3: Conexão Leste;  N - não possui | TRAP - possui armada | D - possui desarmada ;
Linha 4: Conexão Oeste;  N - não possui | TRAP - possui armada | D - possui desarmada ;
Linha 5: Conexão Acima;  N - não possui | TRAP - possui armada | D - possui desarmada ;
Linha 6: Conexão Abaixo; N - não possui | TRAP - possui armada | D - possui desarmada ;

Exemplo:

room 18 north 24 south 25 TRAP east 19 west 22 up 28 TRAP

trap[18][1] = N;
trap[18][2] = TRAP;
trap[18][3] = N;
trap[18][4] = N;
trap[18][5] = TRAP;
trap[18][6] = N;
*/
private String [][] trap = new String[1000][7];

/*Cria uma matriz que guardará os inimigos de qualquer labirinto com até 1000 salas:
Estrutura:
Linha 1: Conexão Norte;  N - não possui | G - Goblin | O - Orc | T - Troll;
Linha 2: Conexão Sul;    N - não possui | G - Goblin | O - Orc | T - Troll;
Linha 3: Conexão Leste;  N - não possui | G - Goblin | O - Orc | T - Troll;
Linha 4: Conexão Oeste;  N - não possui | G - Goblin | O - Orc | T - Troll;
Linha 5: Conexão Acima;  N - não possui | G - Goblin | O - Orc | T - Troll;
Linha 6: Conexão Abaixo; N - não possui | G - Goblin | O - Orc | T - Troll;

Exemplo:

room 18 north 24 south 25 TRAP(+ goblin) east 19 west 22(troll) up 28 TRAP

inimigo[18][1] = N;
inimigo[18][2] = G;
inimigo[18][3] = N;
inimigo[18][4] = T;
inimigo[18][5] = N;
inimigo[18][6] = N;
*/
private String [][] inimigo = new String[1000][7];


/*Cria uma matriz que guardará os tesouros de qualquer labirinto com até 1000 salas:
Estrutura:
Linha 1: Arma;           N - não possui | Faca - Faca   | Espada - Espada | Cimitarra - Cimitarra;
Linha 2: Armadura;       N - não possui | Couro - Couro | Metal - Metal   | Mitrhrill - Mitrhrill;
Linha 3: Chave;          N - não possui | Cor da Chave
Linha 4: Poção de Cura;  N - não possui | Cura - Possui
Linha 5: Fogo do Dragão; N - não possui | Fogo - Possui

Exemplo:

room 18 north 24 south 25 TRAP(+ goblin) east 19 west 22(troll) up 28 TRAP

tesouro[18][1] = N;
tesouro[18][2] = G;
tesouro[18][3] = N;
tesouro[18][4] = T;
tesouro[18][5] = N;
tesouro[18][6] = N;
*/
private String [][] tesouro = new String[1000][7];

private String [][] dadosInimigo = new String[1000][7];

// guarda a posição do personagem.
private int posicao = 0;
private int nDirecao= 0;

inventario i = new inventario();
tesouro tes = new tesouro();
inimigo ini = new inimigo();
personagem p = new personagem();

    // Abre o arquivo e monta a matriz do labirinto
    public void abrir(){
       
        //zera o mapa (salas, armadilhas e inimigos)
        for (int i=0; i<1000; i++){
            for (int j=0; j<7; j++){
                sala[i][j]="N";
                trap[i][j]="N";
                inimigo[i][j]="N";
                cor[i][j]="N";
                tesouro[i][j]="N";
                dadosInimigo[i][j]="N";
            }
        }       

        // garanto a linha zero da matriz das salas para as saídas.       
        for (int j=0; j<7; j++){
            sala[0][j]="SAIDA";
        }
       
        String caminhonome=""; // serve para pegar o 'caminhonome' do arquivo
        int n=0;                  // serve para guardar o número da sala em String
        String aux="";           // serve para auxiliar as conversões de int para String
        String direcao="";       // serve para guardar a direção da conexão
       
        Scanner entra = new Scanner(System.in);
        while(caminhonome==""){
            System.out.println("Digite o caminho, nome e extensão do arquivo do labirinto:");
            caminhonome = entra.next();           
        }

        try {
            FileInputStream fis = new FileInputStream(caminhonome); 
            Scanner     scanner = new Scanner(fis); 
  
            while (scanner.hasNext("room")) { 
                scanner.next();
                // guarda o número da sala
                n = scanner.nextInt();
                tesouro[n][1]=tes.arma();
                tesouro[n][2]=tes.armadura();
                tesouro[n][3]=tes.Chave();
                tesouro[n][4]=tes.cura();
                tesouro[n][5]=tes.fogodragao();
                while (scanner.hasNext("south")||scanner.hasNext("north")||scanner.hasNext("east")||scanner.hasNext("west")||scanner.hasNext("up")||scanner.hasNext("down")){
                    // pula e guarda a próxima direção
                    direcao = scanner.next();
                    if(direcao.equals("north")){
                        nDirecao=1;
                    }
                    if(direcao.equals("south")){
                        nDirecao=2;
                    }
                    if(direcao.equals("east")){
                        nDirecao=3;
                    }
                    if(direcao.equals("west")){
                        nDirecao=4;
                    }
                    if(direcao.equals("up")){
                        nDirecao=5;
                    }
                    if(direcao.equals("down")){
                        nDirecao=6;
                    }
                    // busco o número da sala de conexão e guardo na sala:
                    aux = scanner.next();
                     sala[n][nDirecao] = aux;
                     cor[n][nDirecao] = cor();
                    if(scanner.hasNext("TRAP")){
                        // se tiver TRAP, somo ao número da sala de conexão a String 'TRAP' e guardo na matriz trap:
                        aux = " "+scanner.next();
                        trap[n][nDirecao] = aux;
                    }
                    // crio inimigo para a conexão
                    inimigo[n][nDirecao]=ini.Tipo();
                    if(!inimigo[n][nDirecao].equals("N")){
                        geraInimigo(inimigo[n][nDirecao], n, nDirecao);
                    }
                    // limpo a aux para próximo uso
                    aux="";                   
                }
                // limpo a n para próximo uso
                n=0;
            } 
        }
        catch (Exception e) { 
            e.printStackTrace(); 
        }
        for (int i=0; i<40; i++) { 
            System.out.println("Sala " + i + " Norte " +sala[i][1] + trap[i][1] + inimigo[i][1] + " Sul " +sala[i][2] + trap[i][2] + inimigo[i][2] + " Leste " +sala[i][3] + trap[i][3] + inimigo[i][3] + " Oeste " +sala[i][4] + trap[i][4] + inimigo[i][4] + " Acima " +sala[i][5] + trap[i][5] + inimigo[i][5] + " Abaixo " +sala[i][6] + trap[i][6] + inimigo[i][6]); 
        }
    }
   
    // cria a localização incial
    public void LugarInicial(){
        int w=0;
        int k=1;
        while(w==0){
            k = (int) (1+(Math.random() * 1000));
            if(!sala[k][1].equals("N") || !sala[k][2].equals("N") || !sala[k][3].equals("N") || !sala[k][4].equals("N") || !sala[k][5].equals("N") || !sala[k][6].equals("N")){
                w=1;
            }
        }
       
        posicao = k;
        i.criaInventario();
        salaPresa();
       
        descrever();
    }
   
    public void salaPresa(){
        int r=0, n=0;
        String aux="";
        // testo se todas as portas estão fechadas
        aux = tesouro[posicao][3];
        for(int j=0;j<7;j++){
            // testo se há chave no chão para abrir uma das portas da sala
            if(!cor[posicao][j].equals("N")){
                if(!cor[posicao][j].equals(aux)){
                    r++;
                }
                n++;
            }
        }
        for(int j=0;j<7;j++){
            if(cor[posicao][j].equals("Marrom")){
                r=0;
            }
        }
        if(r==n){
            descrever();
            System.out.println("\n Você está preso nesta sala.");
            System.exit(0);
        }
    }
   
    // Descreve o lugar onde o personagem está
    public void descrever(){
        String a="";
        if(posicao==0){
            System.out.println("Parabéns! Você conseguiu escapar do Labirinto!");
            System.exit(0);
        }
       
        a += "Você está na Sala " + posicao +"\n";
       
        if(!sala[posicao][1].equals("N")){
            a += "Porta "+cor[posicao][1]+" ao norte. ";
            if(!inimigo[posicao][1].equals("N")){
                a+="Há um "+inimigo[posicao][1]+" bloquando esta porta. ";
            }
            if(!trap[posicao][1].equals("N")){
                a+="Há uma armadilha nesta porta. ";
            }
            a+="\n";
        }
        if(!sala[posicao][2].equals("N")){
            a += "Porta "+cor[posicao][2]+" ao sul. ";
            if(!inimigo[posicao][2].equals("N")){
                a+="Há um "+inimigo[posicao][2]+" bloquando esta porta.";
            }
            if(!trap[posicao][2].equals("N")){
                a+="Há uma armadilha nesta porta. ";
            }
            a+="\n";
        }
        if(!sala[posicao][3].equals("N")){
            a += "Porta "+cor[posicao][3]+" ao leste; ";
            if(!inimigo[posicao][3].equals("N")){
                a+="Há um "+inimigo[posicao][3]+" bloquando esta porta.";
            }
            if(!trap[posicao][3].equals("N")){
                a+="Há uma armadilha nesta porta. ";
            }
            a+="\n";
        }
        if(!sala[posicao][4].equals("N")){
            a += "Porta "+cor[posicao][4]+" a oeste; ";
            if(!inimigo[posicao][4].equals("N")){
                a+="Há um "+inimigo[posicao][4]+" bloquando esta porta.";
            }
            if(!trap[posicao][4].equals("N")){
                a+="Há uma armadilha nesta porta. ";
            }
            a+="\n";
        }
        if(!sala[posicao][5].equals("N")){
            a += "Escada "+cor[posicao][5]+" para Subir; ";
            if(!inimigo[posicao][5].equals("N")){
                a+="Há um "+inimigo[posicao][5]+" bloquando esta Escada.";
            }
            if(!trap[posicao][5].equals("N")){
                a+="Há uma armadilha nesta Escada. ";
            }
            a+="\n";
        }
        if(!sala[posicao][6].equals("N")){
            a += "Escada "+cor[posicao][6]+" para descer; ";
            if(!inimigo[posicao][6].equals("N")){
                a+="Há um "+inimigo[posicao][6]+" bloquando esta Escada.";
            }
            if(!trap[posicao][6].equals("N")){
                a+="Há uma armadilha nesta Escada. ";
            }
            a+="\n";
        }
       
        for(int i=0; i<7; i++){
            if(!tesouro[posicao][i].equals("N")){
                a +="Tesouro: "+tesouro[posicao][i]+"\n";
            }
           
        }
         System.out.println(a);
    }
   
    //move o personagem pelo labirinto
    public void andar(String comando){
       
        String aux="";
               
        if(comando.equals("Andar Norte")){
            nDirecao=1;
        }
        if(comando.equals("Andar Sul")){
            nDirecao=2;
        }
        if(comando.equals("Andar Leste")){
            nDirecao=3;
        }
        if(comando.equals("Andar Oeste")){
            nDirecao=4;
        }
        if(comando.equals("Subir Escada")){
            nDirecao=5;
        }
        if(comando.equals("Descer Escada")){
            nDirecao=6;
        }           
           
        // Testa se há sala para onde o jogador quer se mover
        if(sala[posicao][nDirecao].equals("N")){
            System.out.println("Não há porta para esta direção. \n");
        }
        else{
            // testa se há inimigo na porta e leva para o método de combate
            if (!inimigo[posicao][nDirecao].equals("N")){
                aux=combate(posicao, nDirecao);
           
                if(!aux.equals(inimigo[posicao][nDirecao])){
                    inimigo[posicao][nDirecao]=aux;
                }
            }
            else{
                // testa se há armadilha na porta e leva para o método de dano da armadilha
                if(trap[posicao][nDirecao].equals("TRAP")){
                    danoArmadilha();
                }               
            }
           
            if((!cor[posicao][nDirecao].equals("D"))||(!cor[posicao][nDirecao].equals("Marrom"))){
                abrirPorta(nDirecao);
            }
           
            if(inimigo[posicao][nDirecao].equals("N")){
                if(cor[posicao][nDirecao].equals("Marrom")){
                    // comando que move o personagem para a próxima sala
                    posicao = Integer.parseInt(sala[posicao][nDirecao]);                   
                }
            }
        }
        salaPresa();
        descrever();           
    }
    // Este método teste se há chave para abrir a porta correspondente.
    public void abrirPorta(int nDirecao){
        // recupera a chave que o personagem carrega
        String aux = i.listatesouro();
        // testa se a chave que o personagem carrega é igual à cor da porta
        if(cor[posicao][nDirecao].equals(aux)){
            cor[posicao][nDirecao]="Marrom";
            System.out.println("Você abriu esta porta.");
        }
        else{
            if(!cor[posicao][nDirecao].equals("Marrom")){
                System.out.println("Você não possui a chave para abrir esta porta.");
            }
        }
    }
   
    public String cor(){
        String cor="";
        while (cor.equals("")){
            int a = (int) (1+(Math.random() * 10));
            switch(a){
                case 1:  cor = "Verde"; break;
                case 3:  cor = "Vermelha"; break;
                case 5:  cor = "Amarela"; break;
                case 7:  cor = "Azul"; break;
                default: cor = "Marrom"; break;
            }
        }
        return cor;       
    }
    public void pegarTesouro(String opcao){
       
        String aux = "";
       
        if(opcao.equals("Pegar Arma")){
            if(!tesouro[posicao][1].equals("N")){
                aux=i.listaarma();
                i.getarma(tesouro[posicao][1]);
                tesouro[posicao][1]=aux;
            }
            else{
                System.out.println("Não há arma no tesouro");
            }
        }
        if(opcao.equals("Pegar Armadura")){
            if(!tesouro[posicao][2].equals("N")){
                aux=i.listaarmadura();
                i.getarmadura(tesouro[posicao][2]);
                tesouro[posicao][2]=aux;
            }
            else{
                System.out.println("Não há armadura no tesouro");
            }
        }
        if(opcao.equals("Pegar Chave")){
            if(!tesouro[posicao][3].equals("N")){
                aux=i.listatesouro();
                i.gettesouro(tesouro[posicao][3]);
                tesouro[posicao][3]=aux;
            }
            else{
                System.out.println("Não há Chave no tesouro");
            }
        }       
        if(opcao.equals("Pegar Cura")){
            if(!tesouro[posicao][4].equals("N")){
                aux=i.listatesouro();
                i.gettesouro(tesouro[posicao][4]);
                tesouro[posicao][4]=aux;
            }
            else{
                System.out.println("Não há Poção de Cura no tesouro");
            }
        }
        if(opcao.equals("Pegar Fogo")){
            if(!tesouro[posicao][5].equals("N")){
                aux=i.listatesouro();
                i.gettesouro(tesouro[posicao][5]);
                tesouro[posicao][5]=aux;
            }
            else{
                System.out.println("Não há Fogo do Dragão no tesouro");
            }
        }       
    }
    // Desarma a armadilha.
    public void desarmarArmadilha(){
       
        int a = (int) (1+(Math.random() * 10));
        switch(a){
            case 5:
                System.out.println("Você não conseguiu desarmar a armadilha. \n");break;
            default:
                System.out.println("Você conseguiu desarmar a armadilha. \n");
                trap[posicao][nDirecao]="N";break;
        }
    }
   
    //gera o combate entre o personagem e os inimigos
    public String combate(int posicao, int nDirecao){
        Scanner entra = new Scanner(System.in);
       
        String sa=""+posicao;
        String di=""+nDirecao;
        for(int i=0;i<1000;i++){
            if(dadosInimigo[i][2].equals(sa)){
                if(dadosInimigo[i][3].equals(di)){
                    posicao=i;
                    break;
                }
            }
        }
      
        String aux="";
        aux=i.listatesouro();
        int a=0, vida=0;
       
        if(!aux.equals(null)){       
            if(aux.equals("Fogo")){
                System.out.println("Atacar com Arma ou com Fogo do Dragão?");
                aux = entra.nextLine();
                if(aux.equals("Usar Fogo")){
                    return "N";
                }
            }
        }
       
        a = p.dano(i.listaarma());
        aux=dadosInimigo[posicao][4];
        int b = Integer.parseInt(aux);
        vida =  b - a;
        System.out.println("Você acertou o "+dadosInimigo[posicao][1]+" com "+a+" pontos de dano. \n");
        dadosInimigo[posicao][4]=""+vida;
       
        if(vida>0){
            a = ini.ataque(dadosInimigo[posicao][1]);
            System.out.println("O "+dadosInimigo[posicao][1]+" acertou você com "+a+" pontos de dano. \n");
            a = p.vida(a, i.listaarmadura());
            return dadosInimigo[posicao][1];
        }
        else{
            System.out.println("Você matou o "+dadosInimigo[posicao][1]+"\n");
            return "N";
        }
       
    }
   
    public void geraInimigo(String Tipo, int posicao, int nDirecao){
       
        int a=0;
       
        for(int i=0; i<1000; i++){
            if(dadosInimigo[i][1].equals("N")){
                dadosInimigo[i][1] = Tipo;
                dadosInimigo[i][2] = ""+posicao;
                dadosInimigo[i][3] = ""+nDirecao;
                a = ini.vida(Tipo);
                dadosInimigo[i][4] = ""+a;
                break;
            }
        }
    }
   
    public void listaMochila(){
       
        String aux="";
        String a="";
        aux=i.listaarma();
        a+="Arma: "+aux+"\n";
        aux=i.listaarmadura();
        a+="Armadura: "+aux+"\n";
        aux=i.listatesouro();
        a+="Tesouro: "+aux+"\n";
        System.out.println(a);
    }
   
    // GERA O DANO POR PASSAR EM UM ARMADILHA NÃO DESARMADA
    public void danoArmadilha(){
       
        System.out.println("Você não desarmou a armadilha e foi vítima dela. \n");
       
        // calcula o dano
        int dano = (int) (1+(Math.random() * 10));
       
        // cria o objeto da classe personagem para enviar o dano inflingido pela armadilha
        personagem p = new personagem();
        dano = p.vida(dano, i.listaarmadura());
    }
   
}
------------------------------------------------------------------------------------------


Classe Inimigo. Gera e controla os inimigos no jogo.


------------------------------------------------------------------------------------------

package Labirinto;

public class inimigo {
   
    public String Tipo(){
        String inimigo="";
        int a = (int) (1+(Math.random() * 8));
        switch(a){
            case 1: inimigo = "Goblin"; break;
            case 2: inimigo = "Orc"; break;
            case 3: inimigo = "Trol"; break;
            case 4: inimigo = "N"; break;
            case 5: inimigo = "N"; break;
            case 6: inimigo = "N"; break;
            case 7: inimigo = "N"; break;
            case 8: inimigo = "N"; break;
        }
        return inimigo;
    }

    // gera atque do inimigo
    public int vida(String inimigo){
        int a=0;
        if(inimigo.equals("Goblin")){
            a = (int) (2 + (Math.random() * 2));
        }
        if(inimigo.equals("Orc")){
            a = (int) (3 + (Math.random() * 3));
        }
        if(inimigo.equals("Trol")){
            a = (int) (4 + (Math.random() * 4));
        }
        return a;
    }
   
    // Gera ataque do inimigo
    public int ataque(String inimigo){
        int a=0;
        if(inimigo.equals("Goblin")){
            a = (int) (1 + (Math.random() * 2));
        }
        if(inimigo.equals("Orc")){
            a = (int) (2 + (Math.random() * 3));
        }
        if(inimigo.equals("Trol")){
            a = (int) (4 + (Math.random() * 3));
        }
        return a;
    }
}
------------------------------------------------------------------------------------------


Classe Inventário. Gera, controla e mostra o inventário do jogador.


------------------------------------------------------------------------------------------

package Labirinto;

import java.util.Scanner;

public class inventario {
    
    public String inventario[][]=new String[2][4];
    // 1 - arma;
    // 2 - tesouro;
    // 3 - armadura;

    public void criaInventario(){
        inventario[1][1]="Faca";
        inventario[1][2]="Cura";
        inventario[1][3]="";
    }

    public String listaarma(){
        String aux =inventario[1][1];
        return aux;
    }
    public String listatesouro(){
        String aux =inventario[1][2];
        return aux;
    }
    public String listaarmadura(){
        String aux =inventario[1][3];
        return aux;
    }

    public String getarma(String a){
        Scanner entra = new Scanner(System.in);
        String aux ="";
        if (inventario[1][1].equals("")){
            inventario[1][1] = a;
        }
        else{
            aux +="Voce esta carregando "+inventario[1][1]+"\n";
            aux +="Deseja trocar por "+a+"? \n";
            aux +="Digite: S -> Sim; N-> Nao \n";
            System.out.println(aux);
            aux = entra.next();
            if(aux.equals("S")){
                inventario[1][1] = a;
            }
        }
        return inventario[1][1];
    }
    public String gettesouro(String a){
        Scanner entra = new Scanner(System.in);
        String aux ="";
        if (inventario[1][2].equals("")){
            inventario[1][2] = a;
        }
        else{
            aux +="Voce esta carregando "+inventario[1][2]+"\n";
            aux +="Deseja trocar por "+a+"? \n";
            aux +="Digite: S -> Sim; N-> Nao \n";
            System.out.println(aux);
            aux = entra.next();
            if(aux.equals("S")){
                inventario[1][2] = a;
            }
        }
        return inventario[1][2];
    }
    public String getarmadura(String a){
        Scanner entra = new Scanner(System.in);
        String aux ="";
        if (inventario[1][3].equals("")){
            inventario[1][3] = a;
        }
        else{
            aux +="Voce esta carregando "+inventario[1][3]+"\n";
            aux +="Deseja trocar por "+a+"? \n";
            aux +="Digite: S -> Sim; N-> Nao \n";
            System.out.println(aux);
            aux = entra.next();
            if(aux.equals("S")){
                inventario[1][3] = a;
            }
        }
        return inventario[1][3];
    }
}



------------------------------------------------------------------------------------------


Classe personagem: Cria e Controla os atributos do Personagem


------------------------------------------------------------------------------------------

package Labirinto;

class personagem {
    
    public String inventario="";
    public int vida=10, dano=3;
    
    public int vida(int dano, String Armadura){
        String a="";
        
        if(dano>0){
            
            a = Armadura;
            
            if(a.equals("Couro")){
                dano = dano - 1;
                System.out.println("Sua armadura de Couro absorveu 1 de dano \n");
            }
            if(a.equals("Metal")){
                dano = dano - 2;
                System.out.println("Sua armadura de Metal absorveu 2 de dano \n");
            }
            if(a.equals("Mithrill")){
                dano = dano - 3;
                System.out.println("Sua armadura de Mithrill absorveu 3 de dano \n");
            }                        
            vida = vida - dano;
        }
        else{
            vida = 10;
            System.out.println("Voce tomou uma pocao de cura.");
        }
        
        System.out.println("Vida: "+vida);
        
        if(vida <= 0){
            System.out.println("Voce morreu");
            System.exit(0);
        }
        
        return vida;
    }

    public int dano(String arma){
        
        int dano=2;
        if(arma.equals("Faca")){
            dano=4;
        }
        if(arma.equals("Espada")){
            dano=5;
        }
        if(arma.equals("Cimitarra")){
            dano=6;
        }

        dano = (int) (Math.random() * dano );

        return dano;
    }
}

------------------------------------------------------------------------------------------


Classe Tesouro: Cria e controla os tesouros do labirinto.


------------------------------------------------------------------------------------------

package Labirinto;

class tesouro {
    
    public String Chave(){
        String chave="";
        while (chave.equals("")){
            int a = (int) (1+(Math.random() * 8));
            switch(a){
                case 1:  chave = "Azul";     break;
                case 3:  chave = "Amarela";  break;
                case 5:  chave = "Verde";    break;
                case 7:  chave = "Vermelha"; break;
                default: chave = "N";
            }
        }
        return chave;
    }
    public String arma(){
        String arma="";
        while (arma.equals("")){
            int a = (int) (1+(Math.random() * 14));
            switch(a){
                case 1:  arma = "Faca";      break;
                case 3:  arma = "Cimitarra"; break;
                case 5:  arma = "Espada";    break;
                case 7:  arma = "Faca";      break;
                case 9:  arma = "Espada";    break;
                case 11: arma = "Faca";      break;
                default: arma = "N";
            }
        }        
        return arma;
    }    
    
    public String armadura(){
        String armadura="";
        while (armadura.equals("")){
            int a = (int) (1+(Math.random() * 14));
            switch(a){
                case 1:  armadura = "Couro";     break;
                case 3:  armadura = "Mitrhrill"; break;
                case 5:  armadura = "Metal";     break;
                case 7:  armadura = "Couro";     break;
                case 9:  armadura = "Metal";     break;
                case 11: armadura = "Couro";     break;
                default: armadura = "N";
            }
        }
        return armadura;
    }
    
    public String cura(){
        String pocao="";
        int a = (int) (1+(Math.random() * 10));
        switch(a){
            case 2:  pocao="Cura"; break;
            case 4:  pocao="Cura"; break;
            case 5:  pocao="Cura"; break;
            case 6:  pocao="Cura"; break;
            case 8:  pocao="cura"; break;
            default: pocao="N";
        }        
        return pocao;
    }
    public String fogodragao(){
        String pocao="";
        int a = (int) (1+(Math.random() * 10));
        switch(a){
            case 3:  pocao="Fogo"; break;
            case 5:  pocao="Fogo"; break;
            case 7:  pocao="Fogo"; break;
            default: pocao="N";
        }
        return pocao;
    }
}


------------------------------------------------------------------------------------------