Jump to content

Guardar Valores Random em Arrays


BrunoSantos
 Share

Go to solution Solved by bioshock,

Recommended Posts

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 by apocsantos
geshi
Link to comment
Share on other sites

(...) 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

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 by apocsantos
Link to comment
Share on other sites

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 by bioshock
  • Vote 1
Link to comment
Share on other sites

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

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

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

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

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 by apocsantos
geshi
Link to comment
Share on other sites

  • Solution

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:

  1. Ordenar ambos os arrays
  2. 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 by bioshock
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.