1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

C# - Bloqueio do programa durante o runtime

Discussão em 'Programação' iniciada por Dark_Webster, 1 de Dezembro de 2008. (Respostas: 9; Visualizações: 2019)

  1. Dark_Webster

    Dark_Webster Power Member

    Boas. Estou a desenvolver um programa que gere números do euromilhões. Verifiquem o código e vejam se algo está a atrasar o programa. Ao randomizar uma chave ele bloqueia ao fazer a 6ªchave, ao randomizar números, bloqueia a segunda vez, e ao randomizar estrelas bloqueia imediatamente.

    Então:

    Código:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    
    namespace Euromilhões
    {
        public partial class Euromilhões : Form
        {public Random randomizadornumeros = new Random();
            public Random randomizadorestrelas = new Random();
            public Euromilhões()
            {
                InitializeComponent();
            }
    
            private void Temporizador1_Tick(object sender, EventArgs e)
            {
                LabelData.Text = DateTime.Now.ToString();  
            }
    
            private void TimerLoad_Tick(object sender, EventArgs e)
            {
                GrupoNúmeros.Show();
                GrupoEstrelas.Show();
                LabelData.Show();
                TimerLoad.Stop();
            }
    
            private void Euromilhões_Load(object sender, EventArgs e)
            {
                LabelNomeUser.Text = "Olá " + Environment.UserName + "!";
                GrupoNúmeros.Hide();
                GrupoEstrelas.Hide();
                LabelData.Hide();
                TimerLoad.Start();
                Temporizador1.Start();
            }
    
            private void AlterarACorDoForm_Click(object sender, EventArgs e)
            {
                EscolhaDaCor.ShowDialog();
                this.BackColor = EscolhaDaCor.Color;
            }
    
            private void RandomizarChave_Click(object sender, EventArgs e)
            {
                RandomizarChave.Enabled = false;
                RandomizarNúmeros.Enabled = false;
                RandomizarEstrelas.Enabled = false;
                Numero1.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
                Numero2.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
                while (Numero2.Text == Numero1.Text) ;
                {
                    Numero2.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
                }
                Numero3.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
                while (Numero3.Text == Numero2.Text && Numero3.Text == Numero1.Text) ;
                {
                    Numero3.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
                }
                Numero4.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
                while (Numero4.Text == Numero3.Text && Numero4.Text == Numero2.Text && Numero4.Text == Numero1.Text) ;
                {
                    Numero4.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
                }
                Numero5.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
                while (Numero5.Text == Numero4.Text && Numero5.Text == Numero3.Text && Numero5.Text == Numero2.Text && Numero5.Text == Numero1.Text) ;
                {
                    Numero5.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
                }
                Estrela1.Text = Convert.ToString(randomizadorestrelas.Next(1, 9));
                Estrela2.Text = Convert.ToString(randomizadorestrelas.Next(1, 9));
                while (Estrela2.Text == Estrela1.Text) ;
                {
                    Estrela2.Text = Convert.ToString(randomizadorestrelas.Next(1, 9));
                }
                RandomizarChave.Enabled = true;
                RandomizarNúmeros.Enabled = true;
                RandomizarEstrelas.Enabled = true;
            }
    
            private void RandomizarNúmeros_Click(object sender, EventArgs e)
            {
                RandomizarChave.Enabled = false;
                RandomizarNúmeros.Enabled = false;
                RandomizarEstrelas.Enabled = false;
                Numero1.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
                Numero2.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
                while (Numero2.Text == Numero1.Text) ;
                {
                    Numero2.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
                }
                Numero3.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
                while (Numero3.Text == Numero2.Text && Numero3.Text == Numero1.Text) ;
                {
                    Numero3.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
                }
                Numero4.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
                while (Numero4.Text == Numero3.Text && Numero4.Text == Numero2.Text && Numero4.Text == Numero1.Text) ;
                {
                    Numero4.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
                }
                Numero5.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
                while (Numero5.Text == Numero4.Text && Numero5.Text == Numero3.Text && Numero5.Text == Numero2.Text && Numero5.Text == Numero1.Text) ;
                {
                    Numero5.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
                }
                RandomizarChave.Enabled = true;
                RandomizarNúmeros.Enabled = true;
                RandomizarEstrelas.Enabled = true;
            }
    
            private void RandomizarEstrelas_Click(object sender, EventArgs e)
            {
                RandomizarChave.Enabled = false;
                RandomizarNúmeros.Enabled = false;
                RandomizarEstrelas.Enabled = false;
                Estrela1.Text = Convert.ToString(randomizadorestrelas.Next(1, 9));
                Estrela2.Text = Convert.ToString(randomizadorestrelas.Next(1, 9));
                while (Estrela2.Text == Estrela1.Text) ;
                {
                    Estrela2.Text = Convert.ToString(randomizadorestrelas.Next(1, 9));
                }
                RandomizarChave.Enabled = true;
                RandomizarNúmeros.Enabled = true;
                RandomizarEstrelas.Enabled = true;
            }
    
            private void ExportarChave_Click(object sender, EventArgs e)
            {
                DialogGravarChave.ShowDialog();
                StreamWriter Chave = File.CreateText(DialogGravarChave.FileName);
                Chave.Write("Números:");
                Chave.WriteLine(Numero1.Text + " " + Numero2.Text + " " + Numero3.Text + " " + Numero4.Text + " " + Numero5.Text);
                Chave.Write("Estrelas:");
                Chave.WriteLine(Estrela1.Text + " " + Estrela2.Text);
                Chave.WriteLine("");
                Chave.WriteLine(DateTime.Now);
                Chave.Close();
            }
        }
    }
    Estarei a fazer algo mal? PS: Não liguem à extensão do código e talvez a complexidade que está no código, comecei em C# há coisa de 5 dias.

    O RandomizarChave.Enabled = true; . o RandomizarNúmeros.Enabled = true; e o RandomizarEstrelas.Enabled = true; são apenas para desactivar botões da barra de menu.
     
  2. S0ul

    S0ul Power Member

    O while não leva ";"! Não estou a dizer que o problema seja daqui ;)!

    while(condição)
    {
    }
     
  3. S0ul

    S0ul Power Member

    Bem estive a testar, e sem os ";" que tinhas, funciona, agora reparei que na parte dos números costuma haver repetição! Dá uma vista de olhos nisso!
     
  4. Dark_Webster

    Dark_Webster Power Member

    Muito obrigado, assim já não bloqueia :D.

    Também já reparei que ele repete números. Existe alguma maneira diferente de impedir que se repitam, de uma maneira diferente da que fiz claro:D.

    EDIT : Uso a mesma rotina de comparação em VB.NET e nunca repetiu um número.
     
    Última edição: 1 de Dezembro de 2008
  5. solidforms

    solidforms Power Member

    Gerar numeros aleatorios depende do poder de computação. A unica soluçao que eu vejo é guardar os numeros que saem e pesquisar nessa estrutura de dados por numeros repetidos.
    Agora, complexidades,... 1, 2, 3, numeros guardados, mas imagina que chegas a um ponto que tens mesmo muitos numeros, nao compensava.

    É impossivel, nos dias de hoje (mas por enquanto :D), gerar numeros aleatorios puros. Qualquer sistema de numeros aleatorios que encontres ou, acabam ao fim de milhoes de vezes, criar um padrao ou repetem-se em demasia.
    Ainda é um dos paradigmas, os numeros aleatorios puros. Quanto mais para criar um sistema computaciolnamente poderoso para o euro milhoes, nao digo impossivel :001:. Tal como nao consegues aleatorios puros, o euromilhoes tambem nao consegue, portanto, descobre o padrao xD, lol.
    Desculpem se estou a dizer algo errado ;).

    Cumps ;).
     
  6. S0ul

    S0ul Power Member


    Basta substituires no while, o && por ||, pk basta que um numero seja igual aos anteriores para entrar no ciclo while, pk no teu caso estavas a dizer que tinha de ser igual a todos os numeros atribuidos anterioremente, o que não é realidade! Imagina que já passaram 3 numeros e vais para o 4 e este é repetido, realmente ele verifica uma das condições, mas como tu disseste que tem de se verificar as outras 2 então vai dar bosta e vai continuar :)!
    Espero que tenha ajudado e tenhas compreendido o que tinhas mal feito!
     
  7. Dark_Webster

    Dark_Webster Power Member

    Obrigado, já me livraste de uma tormenta que já me andava a assombrar desde que converti este programa para C#.
     
  8. IComeFromBehind

    IComeFromBehind Power Member

    Não era muito mais fácil teres um array com todos os números fazeres-lhe um shuffle e escolher os N primeiros?
     
  9. Dark_Webster

    Dark_Webster Power Member

    Se alguém se importar mais ou menos como fazer o que está no post acima agradecia. Já andei a procurar algumas coisas sobre isso e não encontro nada( ou não ando a procurar fundo o suficiente).
     

Partilhar esta Página