niedziałająca funkcja

0

Funkcja ma odrzucić 2 niepoprawne odpowiedzi (tak jak w milionerach). Niestety nie działa poprawnie (nie wyłącza odpowiednich buttonów ani nie podświetla ich na czerwono). Żaden błąd nie wyskakuje. Jak ktoś ma trochę czasu to może przejrzeć. Będę wdzięczny.

public class KolaRatunkowe
{
    OknoGry oknoGry = new OknoGry();

    Pytania pytania = new Pytania();

    Random x1 = new Random();
    Random x11 = new Random();

    int x2;
    int x3;

    string poprawnaOdp;


    public void polNaPol(PictureBox picture, OknoGry oknoGry, string poprawnaOdp)
    {
        picture.Enabled = false;
        picture.Cursor = Cursors.Arrow;


        bool buttonA = false;
        bool buttonB = false;
        bool buttonC = false;
        bool buttonD = false;


        if (oknoGry.btnOdpA.Text == poprawnaOdp)
        {
            buttonA = true;

            while (x2 == x3 || x2 == 1 || x3 == 1)
            {
                x2 = x1.Next(1, 4);
                x3 = x11.Next(1, 4);
            }

            if(x2 == 2 || x3 == 2)
            {
                oknoGry.btnOdpB.Enabled = false;
                oknoGry.btnOdpB.BackColor = System.Drawing.Color.Red;
            }
            else if(x2 == 3 || x3 == 3)
            {
                oknoGry.btnOdpC.Enabled = false;
                oknoGry.btnOdpC.BackColor = System.Drawing.Color.Red;
            }
            else if (x2 == 4 || x3 == 4)
            {
                oknoGry.btnOdpD.Enabled = false;
                oknoGry.btnOdpD.BackColor = System.Drawing.Color.Red;
            }
        }

        if (oknoGry.btnOdpB.Text == poprawnaOdp)
        {
            buttonB = true;

            while (x2 == x3 || x2 == 2 || x3 == 2)
            {
                x2 = x1.Next(1, 4);
                x3 = x11.Next(1, 4);
            }

            if (x2 == 1 || x3 == 1)
            {
                oknoGry.btnOdpA.Enabled = false;
                oknoGry.btnOdpA.BackColor = System.Drawing.Color.Red;
            }
            else if (x2 == 3 || x3 == 3)
            {
                oknoGry.btnOdpC.Enabled = false;
                oknoGry.btnOdpC.BackColor = System.Drawing.Color.Red;
            }
            else if (x2 == 4 || x3 == 4)
            {
                oknoGry.btnOdpD.Enabled = false;
                oknoGry.btnOdpD.BackColor = System.Drawing.Color.Red;
            }
        }

        if (oknoGry.btnOdpC.Text == poprawnaOdp)
        {
            buttonC = true;

            while (x2 == x3 || x2 == 3 || x3 == 3)
            {
                x2 = x1.Next(1, 4);
                x3 = x11.Next(1, 4);
            }

            if (x2 == 1 || x3 == 1)
            {
                oknoGry.btnOdpA.Enabled = false;
                oknoGry.btnOdpA.BackColor = System.Drawing.Color.Red;
            }
            else if (x2 == 2 || x3 == 2)
            {
                oknoGry.btnOdpB.Enabled = false;
                oknoGry.btnOdpB.BackColor = System.Drawing.Color.Red;
            }
            else if (x2 == 4 || x3 == 4)
            {
                oknoGry.btnOdpD.Enabled = false;
                oknoGry.btnOdpD.BackColor = System.Drawing.Color.Red;
            }
        }

        if (oknoGry.btnOdpD.Text == poprawnaOdp)
        {
            buttonD = true;

            while (x2 == x3 || x2 == 4 || x3 == 4)
            {
                x2 = x1.Next(1, 4);
                x3 = x11.Next(1, 4);
            }

            if (x2 == 1 || x3 == 1)
            {
                oknoGry.btnOdpA.Enabled = false;
                oknoGry.btnOdpA.BackColor = System.Drawing.Color.Red;
            }
            else if (x2 == 2 || x3 == 2)
            {
                oknoGry.btnOdpB.Enabled = false;
                oknoGry.btnOdpB.BackColor = System.Drawing.Color.Red;
            }
            else if (x2 == 3 || x3 == 3)
            {
                oknoGry.btnOdpC.Enabled = false;
                oknoGry.btnOdpC.BackColor = System.Drawing.Color.Red;
            }
        }

    }
}

Potem ją wywołuje w ten sposób:

    private void pictPol_Click(object sender, EventArgs e)
    {
        PictureBox picture = (PictureBox)sender;

        OknoGry oknoGry = new OknoGry();

        string poprawnaOdp = pytania.PoprawnaOdp[pytania.x2];

        KolaRatunkowe kolaRatunkowe = new KolaRatunkowe();

        kolaRatunkowe.polNaPol(picture, oknoGry, poprawnaOdp);

        
    }
0

Na początek przepisz to tak, żeby nie powtarzać wielokrotnie większości kodu. Potem możesz wbić się debugerem i krok po kroku sprawdzić, co się dzieje (F9 stawia się breakpoint, F5 uruchamia program pod debugerem, F10 i F11 - wykonuje następną linijkę).

0

Przejrzałem to z breakpointem linijka po linijce tak jak pisales i tak sie sklada ze program zapętla się podczas wykonywania pętli while, ponieważ cały czas losowane są te same wartości zmiennych x2 oraz x3.

0

tylko dlaczego tak się dzieje, że cały czas te same wartości są losowane?

0

Tak działa Random. Musiałbyś sobie o nim poczytać gdzieś w necie. Wystarczy, że zrobisz to na jednym Randomie i będzie działać. W sensie taki kod:

				x2 = x1.Next(1, 4);
                x3 = x1.Next(1, 4);

Dodatkowo masz 4 odpowiedzi czyli w Next żeby mieć zakres <1,4> to musiałbyś maxValue ustawić na 5 czyli Next(1,5)

Jeżeli już tak bardzo chciałbyś zrobić to na dwóch Randomach to w konstruktorze musiałbyś ustawić ziarno. Poniższy kod zwracałby Ci takie wyniki jakich byś oczekiwał:

			Random x1 = new Random(Guid.NewGuid().GetHashCode());
            Random x11 = new Random(Guid.NewGuid().GetHashCode());

Tutaj masz wyjaśnienie (nagłówek Explenation).
http://csharpindepth.com/Articles/Chapter12/Random.aspx

0

OK. Zrobiłem tak jak napisałeś i wszystko działa już poprawnie. Dzięki za pomoc!

1 użytkowników online, w tym zalogowanych: 0, gości: 1