tawny_alexa Posted April 20, 2015 at 06:31 PM Report Share #581535 Posted April 20, 2015 at 06:31 PM (edited) 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 April 20, 2015 at 06:57 PM by apocsantos geshi Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted April 20, 2015 at 08:37 PM Report Share #581541 Posted April 20, 2015 at 08:37 PM a questão inicial a ser realizada será : as cores a serem escolhidas poderão ser repetidas ? 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
apocsantos Posted April 20, 2015 at 09:36 PM Report Share #581542 Posted April 20, 2015 at 09:36 PM 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 1 Report "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 More sharing options...
tawny_alexa Posted April 21, 2015 at 08:52 AM Author Report Share #581551 Posted April 21, 2015 at 08:52 AM 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 Link to comment Share on other sites More sharing options...
tawny_alexa Posted May 9, 2015 at 11:48 AM Author Report Share #582803 Posted May 9, 2015 at 11:48 AM (edited) 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 May 9, 2015 at 09:20 PM by apocsantos geshi Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted May 9, 2015 at 05:21 PM Report Share #582814 Posted May 9, 2015 at 05:21 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
tawny_alexa Posted May 9, 2015 at 10:04 PM Author Report Share #582840 Posted May 9, 2015 at 10:04 PM (edited) 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 May 9, 2015 at 10:04 PM by tawny_alexa Link to comment Share on other sites More sharing options...
tawny_alexa Posted May 14, 2015 at 02:07 PM Author Report Share #583166 Posted May 14, 2015 at 02:07 PM (edited) 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 May 19, 2015 at 10:43 AM by apocsantos geshi Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted May 14, 2015 at 08:52 PM Report Share #583180 Posted May 14, 2015 at 08:52 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
tawny_alexa Posted May 14, 2015 at 10:25 PM Author Report Share #583187 Posted May 14, 2015 at 10:25 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now