开发者

Checking if both keys match isn't working right

This application works as if you were playing the lottery, you pick 5 numbers from a comboBox, click a button to generate the 5 key numbers and then you press another button to check the results (after you introduce the prize monei on the textbox below, AKA "prémio").

Checking if both keys match isn't working right

The button that does the checking is the highlighted one Verificar Prémio.

Here's it's code:

private void button5_Click(object sender, EventArgs e)
{

    if (textBox1.Text != "" && textBox1.Text!="Prémio em €")
    {
        int contador = 0;

        for (int i = 1; i <= 5; i++)
        {
            string posicao = i.ToString();

            for (int c = 1; c <= 5; c++)
            {
         开发者_开发百科       string poschave = c.ToString();
                if (listBox1.Items.IndexOf(posicao) == 
                    listBox2.Items.IndexOf(poschave))
                {
                    contador = contador + 1;

                }

            }

            i = int.Parse(posicao);

            double valor;
            double premio = double.Parse(textBox1.Text);

            if (contador == 5)
            {
                MessageBox.Show(" Parabens ganhou o 1º premio acertou 5 números 
                    o seu prémio é de " + premio + "€");
            }
            else
            {
                if (contador == 4)
                {
                    valor = premio * 0.75;
                    MessageBox.Show(" Acertou 4 numeros o seu premio é: " + 
                       valor + "€");
                }
                else
                {
                    if (contador == 3)
                    {
                        valor = premio * 0.5;
                        MessageBox.Show("Acertou 3 numeros o seu premio é: " + 
                           valor + "€");
                    }
                    else
                        if (contador <= 2)
                        {
                            MessageBox.Show(" Infelizmente nao ganhou, 
                               nada tente outra vez");
                        }
                    }

                }
            }
        }
    }

Whatever I do, it always shows the messageBox saying I got all 5 correct...

EDIT:

listBox1 is the one on the left, (3, 9, 17, 20, 10), you choose them from the combobox and when you Click "Apostar" it is added to it.

listBox2 is the box on the right.

EDIT2: By replacing

for (int c = 1; c <= 5; c++)
            {
                string poschave = c.ToString();
                if (listBox1.Items.IndexOf(posicao) == listBox2.Items.IndexOf(poschave))
                {
                    contador = contador + 1;

                }

            }

with

                foreach (var item in listBox1.Items)
            {
                // Convert it to string to avoid object reference comparison. Not 100% 
                // sure if this is needed
                string value = item.ToString();
                if (listBox2.Items.Contains(value))
                    contador++;
            }

The error doesnt show anymore however it still isnt working properly, my guess is that the program is checking if they match, then get the result, therefore it always show "you won nothing" 5 times in a row...

How can I fix this?


I don't understand Spanish(?) so it's very hard to understand your code (please use english variable names, even if you have a localized UI)

However, one cause of the problem could be this line:

listBox1.Items.IndexOf(posicao) == listBox2.Items.IndexOf(poschave)

In case neither posicao or poschave is found in their respective listboxes, -1 will be returned and the expression will be true (i.e. contador will be incremented). I'm guessing this is not the desired behavior.

If you instead want to check if an item in the left listbox is also available in the right, then you could do:

void Button_Click(object sender, EventArgs e)
{ 
    if (textBox1.Text == "" || textBox1.Text == "Prémio em €")
        return;
    int numMatches = 0;
    foreach (var item in listBox1.Items)
    {
        if (listBox2.Items.Contains(item))
            numMatches++;
    }
    // numMatches will now contain the number of elements in the left 
    // listbox that also exist in the right listbox
    if (numMatches > 2)
    {
        double premio = Double.Parse(textBox1.Text);
        double prize = 0;
        if (numMatches == 5)
          prize = premio * 1.0;
        if (numMatches == 4)
          prize = premio * 0.75;
        else 
          prize = premio * 0.5;
        // Use string.Format() instead to get fancier formatting of numbers
        Messagebox.Show ("Sweet, you got " + numMatches + " out of 5 correct numbers. Your prize is " + prize + "€");
    }
    else
    {
        MessageBox.Show("Sorry, not enough matches - you win nothing!");
    }
}

EDIT: The reason you get 5 message boxes is because you have the call to Messagebox.Show() inside a for loop that loops five times. I've updated the code sample above to do what I think you want your button callback to do


Your source is way too complicated, you have two loops, one integer > string followed by string > integer... try this:

int count = 0;
for (int i = 0; i < 5; i++)
{
    if (listBox2.Items.IndexOf(listBox1.Items[i]) > 0)
    {
        count++;
    }
}
// count is 0 - 5

You only check for 5 numbers of the left ListBox if it is in the right ListBox.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜