BrunoSantos Posted March 23, 2015 at 01:40 PM Report Share #580039 Posted March 23, 2015 at 01:40 PM (edited) BOAS! Estou a desenvolver um programa que simula uma espécie de totoloto visto que é necessário gerar 5 números e 1 número da sorte. O objectivo é que o utilizador insira 5 números e 1 numero da sorte e depois do programa gerar os 5 números e o numero da sorte, avise o utilizador de ganhou algum prémio ou não, mas para isso eu guardei os valores que o utilizador inseriu em 6 Array's ( 5 números e 1 número da sorte ) mas não sei como guardar os valores gerados numa array. VARIÁVEIS: num1, num2, num3, num4, num5, numSup. Guardam os valores gerados. numero1, numero2, numero3, numero4, numero5, numeroSup. Guardam os valores que o utilizador inserir. Vou apenas dar apresentar a parte do código em que mostra o que expliquei. Obrigado!! private void GerarValores() { Random random = new Random(); int num1 = 0, num2 = 0, num3 = 0, num4 = 0, num5 = 0, numSup = 0; //Guardar o valor dos 6 números gerados: //Do_While para que não haja valores repetidos: do{ num1 = random.Next(0, 50); num2 = random.Next(0, 50); num3 = random.Next(0, 50); num4 = random.Next(0, 50); num5 = random.Next(0, 50); numSup = random.Next(0, 14); } while ((num1 == num2) || (num1 == num3) || (num1 == num4) || (num1 == num5) || (num2 == num3) || (num2 == num4) || (num2 == num5) || (num3 == num4) || (num3 == num5) || (num4 == num5)); } private void verificarNumeros() { GerarValores(); //Comprimir os valores em uma so variável: int[] numerosGerados = new int[5]; int[] numerosUtilizador = new int[5]; int[] numeroDaSorteGerado = new int[1]; int[] numeroDaSorteUtilizador = new int[1]; //Comprimir valores que o utilizador inseriu: numerosUtilizador[0] = Convert.ToInt16(cbNum1); numerosUtilizador[1] = Convert.ToInt16(cbNum2); numerosUtilizador[2] = Convert.ToInt16(cbNum3); numerosUtilizador[3] = Convert.ToInt16(cbNum4); numerosUtilizador[4] = Convert.ToInt16(cbNum5); numeroDaSorteGerado[0] = Convert.ToInt16(cbNumsup); //Comprimir valores que o programa gerou: numerosGerados[0] = Convert.ToInt16(); numerosGerados[1] = Convert.ToInt16(); numerosGerados[2] = Convert.ToInt16(); numerosGerados[3] = Convert.ToInt16(); numerosGerados[4] = Convert.ToInt16(); } Edited March 23, 2015 at 04:26 PM by apocsantos geshi Link to comment Share on other sites More sharing options...
bioshock Posted March 23, 2015 at 02:28 PM Report Share #580047 Posted March 23, 2015 at 02:28 PM (...) mas para isso eu guardei os valores que o utilizador inseriu em (...) Array's (...) mas não sei como guardar os valores gerados numa array. Decide-te, sabes ou não sabes? Estás a criar arrays a mais. Basta-te um array de tamanho 5, sendo que o último (ou primeiro como preferires) índice indica o número da sorte. Não percebo porque estás a converter inteiros para inteiros? int[] numerosUtilizador = new int[5]; numerosUtilizador[0] = cbNum1; numerosUtilizador[1] = cbNum2; numerosUtilizador[2] = cbNum3; numerosUtilizador[3] = cbNum4; numerosUtilizador[4] = cbNum5; numerosUtilizador[5] = cbNumsup; Se queres devolver os números gerados do método GerarValores() terás das duas uma: instanciar o array fora para que possas aceder a ele onde quiseres ou terás de converter o método para função. A minha sugestão é a da conversão. private int[] GerarValores() { // o teu código ... return new int[] { num1, num2, num3, num4, num5, numSup }; } Link to comment Share on other sites More sharing options...
BrunoSantos Posted March 23, 2015 at 02:45 PM Author Report Share #580055 Posted March 23, 2015 at 02:45 PM (edited) Ok, o código ficou assim. Outra coisa que eu gostava de saber agora é como posso saber se o utilizador ganhou prémio ou não e para isso é necessário pelo menos 2 for's um para os números e outro para o número da sorte, e eu necessitava de ajuda a por em prática porque sou um pouco mau a realizar for's. Obrigado pela ajuda 🙂 PS: Nunca trabalhei com array's estive apenas a ver alguns tutoriais basicos no youtube. private int[] GerarValores() { Random random = new Random(); int num1 = 0, num2 = 0, num3 = 0, num4 = 0, num5 = 0, numSup = 0; //Guardar o valor dos 6 números gerados: //Do_While para que não haja valores repetidos: do{ num1 = random.Next(0, 50); num2 = random.Next(0, 50); num3 = random.Next(0, 50); num4 = random.Next(0, 50); num5 = random.Next(0, 50); numSup = random.Next(0, 14); } while ((num1 == num2) || (num1 == num3) || (num1 == num4) || (num1 == num5) || (num2 == num3) || (num2 == num4) || (num2 == num5) || (num3 == num4) || (num3 == num5) || (num4 == num5)); //Comprimir os valores em uma so variável: int[] numerosUtilizador = new int[5]; //Comprimir valores que o utilizador inseriu: numerosUtilizador[0] = Convert.ToInt16(cbNum1); numerosUtilizador[1] = Convert.ToInt16(cbNum2); numerosUtilizador[2] = Convert.ToInt16(cbNum3); numerosUtilizador[3] = Convert.ToInt16(cbNum4); numerosUtilizador[4] = Convert.ToInt16(cbNum5); numerosUtilizador[5] = Convert.ToInt16(cbNumsup); return new int[] { num1, num2, num3, num4, num5, numSup }; } Edited March 23, 2015 at 04:25 PM by apocsantos Link to comment Share on other sites More sharing options...
bioshock Posted March 23, 2015 at 04:31 PM Report Share #580071 Posted March 23, 2015 at 04:31 PM (edited) O teu Do While não é muito fiável porque se, por ventura, quiseres alterar o sorteio para 20 números vais ter de suar para fazer todas as condições. Aconselho-te então a construir a tua lógica sobre vários fragmentos que tenham propósitos diferentes. private int randomNumber() { Random rnd = new Random(); return rnd.Next(0, 50); } // Devolve o número da sorte de determinado array() private int getLuckyNumber(int[] numbers) { return numbers[numbers.Length - 1]; } private int[] GerarValores() { int[] numeros = new int[6]; for (int i = 0; i <= numeros.Length - 1; i++) { int numberSorted = randomNumber(); bool addNumber = true; // Identifica se adiciona o número ou não ao array de números() for (int x = 0; x <= numeros.Length - 1; x++) { // Verifica se o número já existe no array de números() if (numeros[x] == numberSorted) { /* * Caso exista deve-se obrigar o ciclo a voltar * a percorrer o índice "i" (actual) */ i--; addNumber = false; break; } } // Caso o número não existe no array de números() pode adicionar if (addNumber == true) { numeros[i] = numberSorted; } } return numeros; } A partir daqui consegues construir a verificação se ele ganhou ou não o jogo? Edited March 23, 2015 at 04:32 PM by bioshock 1 Report Link to comment Share on other sites More sharing options...
BrunoSantos Posted March 23, 2015 at 05:37 PM Author Report Share #580080 Posted March 23, 2015 at 05:37 PM Infelizmente não percebo muita da linguagem que está nessa parte do código, tal como o bool, o subprograma getLuckyNumber porque que está number.leght -1? e o ultimo if, mas percebo minimamente o que está ai exposto. Agora tenho uma duvida, na variável numberSorted está a guardar o valor do número gerado certo? E a variável numeros guarda os valores que o utilizador inseriu? Link to comment Share on other sites More sharing options...
bioshock Posted March 23, 2015 at 05:58 PM Report Share #580082 Posted March 23, 2015 at 05:58 PM Por partes então. A função getLuckyNumber() só te a construí para que fosse fácil para ti fazer uma validação entre o número da sorte sorteado e o número da sorte do utilizador, desta forma: int[] numerosSorteados = GerarValores(); int[] numerosUtilizador = new int[5]; // vamos supor que tem valores dentro do array() if(getLuckyNumber(numerosSorteados) == getLuckyNumber(numerosUtilizador)) { // O número da sorte sorteado é igual ao número da sorte do utilizador } Quando crias um array tens de ter em atenção o limite do mesmo. Por exemplo, se instanciares int[6], significa que o mesmo vai ter 6 posições, mas nota: a posição, em programação, começa em 0. Resumindo, int[6] tem 6 posições que se inicia em 0 e acaba em 5 (0, 1, 2, 3, 4, 5). Eu sugeri-te (no primeiro post) colocar o número da sorte em último lugar, então para acederes há última posição (que é a posição do número da sorte) deves dar uso há função que retorna o tamanho do array number.Length. Contudo, o valor que é retornado por essa função é de 7 posições porque é interpretado como (0, 1, 2, 3, 4, 5, 6) daí eu subtrair 1 number.Length - 1 que é igual a 6 posições. A variável numeros, que está dentro da função GerarValores(), guarda os números sorteados. Não são os números do utilizador. Link to comment Share on other sites More sharing options...
BrunoSantos Posted March 23, 2015 at 06:45 PM Author Report Share #580088 Posted March 23, 2015 at 06:45 PM Muito bem, já percebi agora tenho uma pequena duvida em relação ao prémio que o utilizador ganhou. O que eu queria fazer era que quando o utilizador clica-se no botão depois de preencher tudo corretamente, apresenta-se a chave com os 5 números gerados e o número da sorte e de seguida indicava se tinha prémio ou não. Link to comment Share on other sites More sharing options...
bioshock Posted March 23, 2015 at 09:05 PM Report Share #580092 Posted March 23, 2015 at 09:05 PM Sim..e o que tentaste? Link to comment Share on other sites More sharing options...
BrunoSantos Posted March 23, 2015 at 09:41 PM Author Report Share #580094 Posted March 23, 2015 at 09:41 PM Nunca trabalhei com Array's por isso não faço a mínima como chama-las em um MessageBox.Show porque normalmente para apresentar os números de alguma coisa seria com o .ToString mas não funciona assim... Mas eu queria fazer isso na main, então no inicio declarei a variável igualmente ( int[ ] numerosSorteados = GerarValores( ); ) e depois tentei usar o MessageBox.Show ( numerosSorteados.ToString( )); sem sucesso... Link to comment Share on other sites More sharing options...
bioshock Posted March 23, 2015 at 09:51 PM Report Share #580095 Posted March 23, 2015 at 09:51 PM (edited) Sim, é normal que não funcione. Tens de percorrer a lista. for (int i = 0; i <= numerosSorteados.Length - 1; i++) { MessageBox.show(numerosSorteados[i].ToString()); } Edited March 23, 2015 at 09:51 PM by bioshock Link to comment Share on other sites More sharing options...
BrunoSantos Posted March 23, 2015 at 10:13 PM Author Report Share #580100 Posted March 23, 2015 at 10:13 PM (edited) Ok, muito obrigado. Para saber se tinha ganho o 6º Prémio que era equivalente a 1 Número da sorte usei o código que me tinha dado, e para saber se ganhou o 1º prémio fiz o seguinte: Está certo? if (getLuckyNumber(numerosSorteados) == getLuckyNumber(numerosUtilizador)) { MessageBox.Show("Você ganhou o 6º prémio! Acertou no número da sorte!"); } if (numerosUtilizador == numerosSorteados) { MessageBox.Show("PARABÉNS!!! Você é o grande vencedor do primeiro prémio!"); } Edited March 24, 2015 at 10:42 AM by apocsantos geshi Link to comment Share on other sites More sharing options...
Solution bioshock Posted March 23, 2015 at 10:35 PM Solution Report Share #580103 Posted March 23, 2015 at 10:35 PM (edited) O código para verificar o 6º prémio está correcto, o outro está errado. Não podes comparar dois arrays dessa forma. Imagina o seguinte cenário: int[2] numerosSorteados = new int[2]; int[2] numerosUtilizador = new int[2]; numerosSorteados[0] = 3; numerosSorteados[1] = 1; numerosUtilizador[0] = 1; numerosUtilizador[1] = 3; Apesar de ambos os números existirem em ambos os arrays, estão sobre diferentes posições, portanto não podes comparar com exactidão. Tens duas opções: Ordenar ambos os arrays Percorrer os arrays e verificar se existe os números em ambos os arrays. A primeira solução é mais rápida. Array.Sort(numerosSorteados); Array.Sort(numerosUtilizador); if(numerosSorteados.SequenceEqual(numerosUtilizador)) { MessageBox.Show("PARABÉNS!!! Você é o grande vencedor do primeiro prémio!"); } NOTA: desta forma não vais conseguir dizer se o utilizador ganhou o 2º, 3º ou 4º prémio.. Edited March 23, 2015 at 10:35 PM by bioshock Link to comment Share on other sites More sharing options...
BrunoSantos Posted March 23, 2015 at 11:24 PM Author Report Share #580108 Posted March 23, 2015 at 11:24 PM Então e existe alguma maneira de saber se o utilizador ganhou o 2º, 3º ou 4º prémio? Link to comment Share on other sites More sharing options...
bioshock Posted March 24, 2015 at 09:05 AM Report Share #580122 Posted March 24, 2015 at 09:05 AM Sim, fazendo dois ciclos, um dentro de outro, como no exemplo do meu 2º post. Link to comment Share on other sites More sharing options...
BrunoSantos Posted March 24, 2015 at 03:33 PM Author Report Share #580142 Posted March 24, 2015 at 03:33 PM Ok. muito obrigado pela ajuda. O programa está completo 🙂 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