Jump to content
tigas_20

Problema com if's

Recommended Posts

tigas_20

Boa Tarde!!!

Estou a fazer um jogo em Java e no método que recebe os comandos tenho o seguinte código:

caractereComado=teclado.next();
         if(caractereComado.equals(">")){
            comando=teclado.next();
            if(comando.equals("R")||comando.equals("B")){
               linha=teclado.nextInt();
               if(linha>=0 && linha <matriz.length-1){
                  coluna=teclado.nextInt();
                  if(coluna>=0 && coluna<matriz.length-1){
                     linha++;
                     coluna++;
                     if(comando.equals("R"))
                        RevelarPosicao(linha,coluna);
            
                     else 
                        Bandeira(linha,coluna);
                  }
                  else
                     System.out.println("O numero "+coluna+" nao e' um valor de coluna valido");
               }      
               else 
                  System.out.println("O numero "+linha+" nao e' um valor de linha valido");
            }
            
            else 
               System.out.println("Este comando: "+comando +" nao 'e valido");
         }
         
         else 
            
            System.out.println("Este Caractere de comando: "+caractereComado+" nao 'e valido");

O problema que me acontece é quando eu coloco por exemplo < B 0 2 devia dizer apenas "Este Caractere de comando: <  nao 'e valido", mas diz todos os outros também.

Onde estou a falhar?

Desde já Obrigado

Tiago Lourenço

       

Share this post


Link to post
Share on other sites
M6

Mete um breakpoint e faz step-by-step no editor para ver o que tens corresponde ao que estás à espera.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
brunoais

O teu problema é mto simples. Qd ele dá esse erro não fazes "flush" do input. Por isso, ele vai ler o prox caracter do comando (que já se sabe estar errado)


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
tigas_20

Obrigado pelas rápidas respostas mas podiam dar um exemplo num else? já andei a tentar mas faz-me sempre a mesma coisa.

Obrigado

Share this post


Link to post
Share on other sites
RubenFelix

Sinceramente não estou a ver onde está o erro. Ou realmente o input está a ser mal feito, ou o equals da class está mal penso eu...

De qualquer forma, penso que seria bastante mais simples meteres um breakpoint no código e fazeres debug ao teu programa.

Share this post


Link to post
Share on other sites
brunoais

Mostra aí alguns (digamos uns 5) exemplos de input que o utilizador poderá fazer, em que, pelo menos 3, sejam ilegais segundo as regras do programa (daria a mensagem de erro).

Eu posso mostrar-te, por absurdo, aonde o código falha.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
tigas_20

Boa Noite

O problema é: o comando deveria ser > comando (R ou :) linha coluna

Se eu me enganar no símbolo > e por outro qualquer devia dizer apenas que o tal símbolo está errado mas diz tudo diz que o símbolo está errado, o comando, a linha  e a coluna.

Está qualquer coisa mal mas ainda não consegui perceber o quê, já tentei varias formas mas nada.

semttulokbg.png

Obrigado

Share this post


Link to post
Share on other sites
brunoais

Vamos então analizar isso paço a paço.

No input existe: "< R 0 2"

1º tu vais buscar a próxima string (neste caso o 1º caracter): <

retira a string "<" do que já temos

agora vamos verificar se é o caracter '>'. Não me parece. Devolve false.

Se é false escreve a mensagem de erro.

Próximo.

No input existe: "R 0 2"

2º Vou buscar a próxima string (neste caso não é o ' ' pq o next divide tudo por tokens e um deles é o ' '): R

agora vamos verificar se é o caracter '>'. Hum...Não me parece. Devolve false.

Se é false escreve a mensagem de erro.

Próximo.

No input existe: "0 2"

...

É assim que queres que o programa funcione?


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
tigas_20

Acho que já tenho a ideia que preciso vou colocar tudo numa String em vez de estar tudo separado e depois a partir da String vou separando os caracteres e fazeres os testes necessários.

Depois coloco a nova versão.

Obrigado

Share this post


Link to post
Share on other sites
tigas_20

Já fiz alteração mas agora estou com outro problema o programa não deixa inserir nada, é como se esta linha comando=teclado.nextLine();    não estivesse cá, o que poderá ser?

private static void InserirComandos(){
	String comando;
	int linha,coluna;
	System.out.println("Insira > R linha coluna para revelar uma posicao\nou insira > B linha coluna para colocar uma bandeira");
		comando=teclado.nextLine();

		if(comando.charAt(0)=='>'&& comando.charAt(1)==' ' )
			if((comando.charAt(2)=='R'||comando.charAt(2)=='B')&&comando.charAt(3)==' '){

				String i="",j="";
				int line,column;
				boolean espaco=true;

				for(int n=4;n<comando.length();n++)

					if((comando.charAt(n))==' ')
						espaco=false;

					else if(espaco)

						i+=comando.charAt(n);

					else if(!espaco)
						j+=comando.charAt(n);

				if(!espaco){			
					line=Integer.parseInt(i);
					column=Integer.parseInt(j);
					System.out.println(line+" "+column);
					if(line>=0 && line <matriz.length-1&&column>=0 && column<matriz.length-1)
						if(comando.charAt(2)=='R')
							RevelarPosicao(line++,column++);
						else
							Bandeira(line++,column++);*/
				}

			}

Share this post


Link to post
Share on other sites
brunoais

mete isso dentro das tags code para java sff.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
brunoais

Não percebo pq é q mudaste esse código tão radicalmente.

Mesmo assim. Pq é que não tens else nos 1os 2 if's?

ADD:

Tanto charAt...

Para os números seria mais sensato usar o nextInt() dentro de um try catch (atenção aonde pões os comandos try e o catch) em que o catch apanhe, pelo menos, o InputMismatchException (Ou seja, o NaN (Not a Number)). Para poderes mostrar a mensagem correcta.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
tigas_20

Bom Dia,

já está a funcionar, simplifiquei o código e tudo correu bem. Eu não conhecia o comando try catch mas agora já sei :D

Obrigado brunoais  :)

System.out.println("Insira > R linha coluna para revelar uma posicao\nou insira > B linha coluna para colocar uma bandeira");

	try{	
		caractereComando=teclado.next();
		if(caractereComando.equals("S"))
			System.exit(0);
		comando=teclado.next();
		linha=teclado.nextInt();
		coluna=teclado.nextInt();



		if(caractereComando.equals(">"))
			if(comando.equals("R")||comando.equals("B"))
				if(linha>=0 && linha <matriz.length-1)
					if(coluna>=0 && coluna<matriz.length-1){
						linha++;
						coluna++;
						if(comando.equals("R"))
							RevelarPosicao(linha,coluna);

						else 
							Bandeira(linha,coluna);
					}
					else
						System.out.println("O numero "+coluna+" nao e' um valor de coluna valido");

				else
					System.out.println("O numero "+linha+" nao e' um valor de linha valido");

			else
				System.out.println("Este comando: "+comando +" nao 'e valido");

		else
			System.out.println("Este caracterecomando: "+caractereComando +" nao 'e valido");	
	}




	catch(java.util.InputMismatchException e){
		System.out.println("Erro, introduziu um caractere errado, deverá ser um numero");
	}

Agora estou com outro problema noutro sitio:

do{

		try{
			System.out.println("Escolha o tamanho do tabuleiro ");
			tamanho=teclado.nextInt();
			avancar=true;
		}
		catch(java.util.InputMismatchException e){
			System.out.println("Erro, o tamanho vem em digitos");
			avancar=false;
		}

	}
	while(!avancar);

O que eu quero fazer pedir o tamanho do tabuleiro enquanto não for introduzido um valor correcto, o que acontece é que fica num ciclo infinito, só deixa inserir uma vez o tamanho e se tiver errado já não para.

Share this post


Link to post
Share on other sites
brunoais

Acho que o problema em causa é este:

When a scanner throws an InputMismatchException, the scanner will not pass the token that caused the exception, so that it may be retrieved or skipped via some other method.[/b']

Depending upon the type of delimiting pattern, empty tokens may be returned. For example, the pattern "\\s+" will return no empty tokens since it matches multiple instances of the delimiter. The delimiting pattern "\\s" could return empty tokens since it only passes one space at a time.

Fonte: http://download.oracle.com/javase/6/docs/api/java/util/Scanner.html

Depois de ele lançar a excepção precisas de indicar que não queres isso. Para isso tens várias maneiras. VÊ a página aonde obtive isto e tenta descobrir :)


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
tigas_20

Consegui por tentativas mesmo agora

fiz isto:

catch(java.util.InputMismatchException e){
                                System.out.println("Erro, o tamanho vem em digitos");
                                avancar=false;
                                teclado = new Scanner(System.in);

                        }

Não sei se é o mais correcto mas funciona bem.

Obrigado :)

Share this post


Link to post
Share on other sites
brunoais

Eu acho ser horrível. Criar um novo objecto e apagar o anterior demora muito tempo.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
tigas_20

Achei na net essa dica e utilizei, ainda não encontrei mais nada para o loop try catch sem ser erra dica

Share this post


Link to post
Share on other sites
brunoais

nextLine()

Isso diz algo?


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.