Jump to content

Problema com if's


tigas_20
 Share

Recommended Posts

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

Link to comment
Share on other sites

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."

 

Link to comment
Share on other sites

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%.

Link to comment
Share on other sites

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%.

Link to comment
Share on other sites

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.

http://img94.imageshack.us/img94/3794/semttulokbg.png

Obrigado

Link to comment
Share on other sites

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%.

Link to comment
Share on other sites

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++);*/
				}

			}
Link to comment
Share on other sites

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%.

Link to comment
Share on other sites

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%.

Link to comment
Share on other sites

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 😄

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.

Link to comment
Share on other sites

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%.

Link to comment
Share on other sites

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 🙂

Link to comment
Share on other sites

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%.

Link to comment
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
 Share

×
×
  • 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.