Jump to content

Letras Aleatórias


tawny_alexa
 Share

Recommended Posts

Boas, estou de volta de um projecto sobre um jogo e tenho uma dúvida. A minha intenção é criar um "segredo" de 4 letras aleatórias (que representam cores) entre 6 possíveis, que só é mostrado no final se o jogador perder (depois de 12 tentativas de adivinhar a combinação de letras). A primeira parte de conseguir que o computador me dê aleatoriamente uma destas 6 letras é relativamente fácil. A minha dúvida é como é que depois "agarro em 4 dessas letras" e as guardo para criar o dito segredo para durante o jogo este poder ser comparado com as combinações dadas pelo jogador. Deixo o código com que iniciei para facilitar a compreensão. Agradeço desde já qualquer explicação.

import java.util.Random;

public class Combinacao {

private char cor;

/**
* a cor vai ser atribuida pelo método "CorDaPeca" implementado mais abaixo
* nesta classe
*/
public Combinacao() {

this.cor = ' ';


}

public char getCor() {
return cor;
}

/**
* atribui a cor às peças, a classe Random (java.util.Random) tem um método
* chamado nextInt que vai atribuir aleatoriamente um número entre 0 e 5,
* caso o número obtido pela classe Random seja 0 a peça é vermelha(R), caso
* o número obtido pela classe Random seja 1 a peça é verde(G), caso o
* número obtido pela classe Random seja 3 a peça é roxa(P),caso o número
* obtido pela classe Random seja 4 a peça é amarela(Y), e caso o número
* obtido pela classe Random seja 5 a peça é laranja(O).
*/
public char CorDaPeca() {
Random rand = new Random();
int peca = rand.nextInt(6);
{
if (peca == 0) {
cor = 'R';
} else {
if (peca == 1) {
cor = 'G';
} else {
if (peca == 2) {
cor = 'B';
} else {
if (peca == 3) {
cor = 'P';
} else {
if (peca == 4) {
cor = 'Y';
} else {
if (peca == 5) {
cor = 'O';
}
}

}
}
}

}
}
return cor;

}
}
Edited by apocsantos
geshi
Link to comment
Share on other sites

Boa noite,

Declaras um array de chars e guardas as quatro letras no array.

//declaras um array de chars
public char[] ArrayLetras;

//armazenas no array nas posições 0 a 4 cada uma das letras correspondentes.
ArrayLetras[0] = CorDaPeca();
ArrayLetras[1] = CorDaPeca();
ArrayLetras[2] = CorDaPeca();
ArrayLetras[3] = CorDaPeca();

Para comparar as tentativas do jogador com a "chave" podes simplesmente ler do utilizador para um array de chars igualmente e comparar os arrays. Isso pode ser feito de diversas maneiras! A mim parece-me mais simples "preguiçoso" comparar strings uma vez que já existe código para isso.

import java.io.Console;
// whatever...

public String chave = new String(ArrayLetras);
public String tentativa = new String();

Console consola = System.console();
tentativa = console.readLine("A sua tentativa ?");
Boolean resultado = (tentativa.toUpperCase().equals(chave));

Cordiais cumprimentos,

Apocsantos

  • Vote 1

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Link to comment
Share on other sites

Peço desculpa não ter deixado o feedback do decorrer do projecto, mas com a faculdade e o trabalho tem sido impossível ter algum tempo livre. No entanto consegui avançar um pouco com o projecto (agradeço desde já o código que aqui me foi dado, pois serviu de base para a sua continuação).

Basicamente tenho um método random que me cria um Array aleatório com quatro Strings de entre seis possíveis, e peço ao utilizador que digite quatro Strings de entre essas seis, sendo essa informação guardada noutro Array. Criei depois dois métodos, o primeiro que vai comparar os dois arrays e devolve-me o número de Strings iguais no mesmo index, e o segundo que compara os dois arrays e me diz quantas Strings iguais existem, independentemente do seu index ser igual ou não (o número devolvido neste segundo método é igual ao seu valor de retorno menos o valor de retorno do primeiro método, para que se saiba quantas Strings se acertou na sua posição correcta, e quantas se acertou mas que estão fora do seu lugar).

A minha dúvida prende-se no seguinte, o scanner da tentativa do jogador aceita qualquer String neste momento, como posso obriga-lo a aceitar apenas as seis Strings pretendidas? De modo a fazer depois um ciclo while que continua a pedir ao jogador que insira uma String enquanto não houver na totalidade 4 correctas para guardar no Array.

EDIT: Fiz isto, mas o output é um loop infinito de:

Cores possíveis: AMARELO/AZUL/VERMELHO/VERDE/LARANJA/ROXO

Insira a sua tentativa (faça enter depois de cada cor):

Cores possíveis: AMARELO/AZUL/VERMELHO/VERDE/LARANJA/ROXO

Insira a sua tentativa (faça enter depois de cada cor):

public void tentativaDoJogador() {
 boolean Error = true;
 do {
	 try {
		 System.out.printf("\nCores possíveis: AMARELO/AZUL/VERMELHO/VERDE/LARANJA/ROXO");
		 System.out.printf("\nInsira a sua tentativa (faça enter depois de cada cor): ");
		 Scanner in = new Scanner(System.in);			
if (in.equals("AMARELO") || in.equals("AZUL") || in.equals("VERMELHO")
				 || in.equals("VERDE") || in.equals("LARANJA") || in.equals("ROXO")) {
			 Error = false;				

tentativa[0] = in.next();
			 tentativa[1] = in.next();
			 tentativa[2] = in.next();
			 tentativa[3] = in.next();
			 String stringUnica = Arrays.toString(tentativa);
			 System.out.println(stringUnica);
		 }
	 } catch (InputMismatchException e) {
		 System.out.printf("\nCor inválida. Tente de novo.");
	 }
 } while (Error);
}

Cumprimentos

Edited by apocsantos
geshi
Link to comment
Share on other sites

a variável in é do tipo Scanner, logo a sua comparação com uma string irá dar sempre falso, levanodo a que nunca a variável Error nunca tome o valor de falso.

primeiro tens de ler a string com o método .next() para uma string auxiliar e comparar esta com as string das cores.

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Obrigado pela ajuda @HappyHippyHippo, já corrigi o erro, realmente foi mesmo falha minha, não reparei nesse pormenor.

Já estão as alterações básicas feitas, ainda não está perfeito, mas funciona minimamente, depois quando tiver tempo aperfeiçoo o código. Aos poucos e poucos compõe-se. Mais uma vez agradeço a ajuda.

String corTentativa = in.nextLine();

if (corTentativa.equals("AMARELO") || corTentativa.equals("AZUL") || corTentativa.equals("VERMELHO")
|| corTentativa.equals("VERDE") || corTentativa.equals("LARANJA") || corTentativa.equals("ROXO"))

Cumprimentos

Edited by tawny_alexa
Link to comment
Share on other sites

Boas, com algumas alterações já consegui que o método tentativaDoJogador() funcione adequadamente, sem aceitar outras Strings, pedindo outra caso se coloque qualquer outra palavra para além das definidas. Já há algum tempo que ando de volta do código de comparação dos dois arrays, da chave e da tentativa, que têm ambos o mesmo tamanho. Como resultado queria saber o número de Strings iguais que se encontram na mesma posição em ambos os arrays, e quantas existem iguais embora em posições trocadas. Este é o código que fiz, mas os resultados que obtenho não são os esperados e não percebo o porquê 😕

EDIT: A chave não tem contem Strings repetidas.

public boolean verificarSeTentativaCorrecta(String[] tentativa, String[] chave) {
 int contaCorrecto=0;
 int contaTrocado=0;
 for (int i = 0; i < tentativa.length; i++) {
	 // String igual no mesmo index
	 if (tentativa[i].equalsIgnoreCase(chave[i])) {
		 contaCorrecto++;
	 }else
	 // Verificar se há alguma String igual mas com posições trocadas
	 for (int j = 0; j < tentativa.length; j++) {
		 if (tentativa[j].equalsIgnoreCase(chave[i])) {
			 contaTrocado++;
		 }
	 }
 }
 // Acertou o código
 if (chave.length == contaCorrecto) {
	 return true;
 } else {
	 System.out.println("\nA tua tentativa foi incorrecta!");
	 System.out.println("Existem " + contaCorrecto + " correctos e " + contaTrocado + " trocados\n\n");
 }
 return false;
}

Obrigado desde já pela atenção.

Cumprimentos.

Edited by apocsantos
geshi
Link to comment
Share on other sites

o processo que pretendes implementar é um pouco mais complicado do que pensas ser.

necessitas de criar um array auiliar que irá marcar as posições avaliadas/usadas

sempre que uma posição é avaliada como correcta ou fora do sítio, terás de marcar nesse vector auxiliar como usada para que não seja novamente avaliada nos processos posteriores

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Já vi que sim, tentei mais do que um processo, e em ambos embora consiga obter facilmente o número de Strings iguais no mesmo index, no que toca ao número de Strings iguais em index's diferentes dava quase sempre valores errados. Ainda tentei fazer algo do género ContaTrocado=ContaTrocado-ContaCorrecto; e também no if do segundo ciclo for acrescentar no final && y != j para que não contasse duas vezes a mesma String. Mas pelo que me dizes @HappyHippyHippo isso não é suficiente. Mais uma vez obrigado pela ajuda, vou tentar resolver essa questão e deixo aqui depois o código funcional.

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.