TransWikia.com

O usuário terá 3 tentativas para acertar a senha

Stack Overflow em Português Asked by Rayra on November 5, 2021

O formulário seguinte não abre quando a senha está correta e se está errada continua passando mesmo se a senha tiver digitada 3 vezes.

private void btnEntrar_Click(object sender, EventArgs e)
    {
        int erro=0;

        if (senha != "")
        {
            while(erro<=2)
            { 
                String verifica = txtVerifica.Text;
                if (verifica == senha)
                {
                    if (Application.OpenForms.OfType<Desenvolvimento>().Count() > 0)
                    {
                        Form desenvolvimento = Application.OpenForms["Desenvolvimeto"];
                        desenvolvimento.Show();
                        this.Hide();
                    }
                    else
                    {
                        Desenvolvimento desenvolvimento = new Desenvolvimento();
                        desenvolvimento.Show();
                        this.Hide();
                    }
                }
                else
                {
                    if (erro == 3)
                    {
                        MessageBox.Show("Três tentativas !");
                        Application.Exit();
                    }
                    else
                    {
                        erro=erro+1;
                        MessageBox.Show("Senha inválida !");
                        break;
                    }
                }
            }
        }
        else
        {
            MessageBox.Show("Cadastre uma senha !");
            txtSenha.Focus();
        }
    }

3 Answers

O o problema é que a lógica não deve ser dentro deste método, é uma lógica para todo o formulário e o controle de tentativas deve ser no objeto e não no método. Tirando essa variável funciona. E dá para fazer várias simplificações. Algumas coisas ainda podem ser melhoradas.

private int tentativasErradas = 0;

private void btnEntrar_Click(object sender, EventArgs e) {
    if (senha != "") {
        if (txtVerifica.Text == senha) {
            Form desenvolvimento = Application.OpenForms.OfType<Desenvolvimento>().Any() ? Application.OpenForms["Desenvolvimeto"] : new Desenvolvimento();
            desenvolvimento.Show();
            this.Hide();
       } else {
            if (tentativasErradas == 3) {
                MessageBox.Show("Três tentativas !");
                Application.Exit();
            } else {
                tentativasErradas++;
                MessageBox.Show("Senha inválida !");
            }
        }
    } else {
        MessageBox.Show("Cadastre uma senha !");
        txtSenha.Focus();
    }
}

Coloquei no GitHub para referência futura.

Answered by Maniero on November 5, 2021

O porque de "continua passando mesmo se a senha tiver digitada 3 vezes".

Sempre que o utilizador carrega no botão que gera o evento btnEntrar_Click(), logo na primeira linha, passas o erro = 0, o que faz com que seja sempre a "primeira vez". Mesmo que o utilizador esteja a entrar pela 100ª vez, o erro vai estar sempre a ser reposto para 0. É uma falha da tua parte.

Tira essa variável do evento do botão.

static int erro = 0;

E sempre que o utilizador errar na palavra-chave incrementas.

Algo deste género.

class Program
{
    static int erro = 0;
    private void btnEntrar_Click(object sender, EventArgs e)
    {
        erro++;
        if(erro < 3)
        {
         //utilizador ainda não falhou 3 vezes
        }
        else
        {
         //utilizador falhou 3 vezes (ou mais)
        }
    }
}

Como vez, a diferença é que o erro=0 não esta a ser reposto para 0 no evento do botão.

Answered by zakharuk_pasha on November 5, 2021

Toda vez que você executa a função btnEntrar_Click(); a variável int erro=0; novamente recebe o valor zero. Experimente declarar a variável no corpo de sua classe dessa forma:

class Program
{
    static int erro;

    static void Main(string[] args)
    {
        Menu();
    }
}

Não se esqueça de incrementar a variável caso seu algoritmo identifique um erro na autenticação dessa forma:

erro++;

Answered by Guilherme Lima on November 5, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP