Ir para o conteúdo
tawny_alexa

Letras Aleatórias

Mensagens Recomendadas

tawny_alexa

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;

}
}

Editado por apocsantos
geshi

Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
apocsantos

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

  • Voto 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"

assinatura.jpg

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tawny_alexa

a questão inicial a ser realizada será : as cores a serem escolhidas poderão ser repetidas ?

tenho as duas hipóteses, uma opção a repetir cores, outra sem ser possível repetir cores.[

@apocsantos muito obrigado pela ajuda, mais logo vou agarrar-me ao código e depois deixo o feedback.

Cumprimentos


Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tawny_alexa

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

Editado por apocsantos
geshi

Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tawny_alexa

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

Editado por tawny_alexa

Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tawny_alexa

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ê :confused:

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.

Editado por apocsantos
geshi

Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tawny_alexa

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.


Tânia Sardão - Estudante de Engenharia Electrotécnica e de Computadores

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.