Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C#: Ristinolla-pelissä ongelma

AtskaFin [12.02.2019 16:44:22]

#

Olen tehnyt C# ja Windows Forms:sta ristinolla -pelin. Pelin alussa ohjelman ala laidassa oleva reset -nappula on piilotettuna (reset_btn.Visible = false;). Kun ohjelma huomaa, että jompikumpi voitti, niin se ei anna asettaa enempää ristejä tai nollia ja tuo voittajan, sekä reset-nappulan esille. Kun lisään koodiin tuon reset_btn.Visible = true; , niin kaikki ristit ja nollat jostain syystä katoavat. Mistäköhän johtuu ? :/

Olen tehnyt pelialustan siis pictureBoxeilla ja piirrän niihin ristin ja nollat
graphics luokalla.

grafiikat.DrawEllipse(kyna, 10, 10, 75, 75);

Samalla haluaisin vinkkiä siihen, että olisiko voittaja yksinkertaisempaa tarkistaa kuin näin:

private void onkoToinenVoittanut()
        {
            if (
                //Vaakarivit
                ruudut[0] == 'o' && ruudut[1] == 'o' && ruudut[2] == 'o' ||
                ruudut[3] == 'o' && ruudut[4] == 'o' && ruudut[5] == 'o' ||
                ruudut[6] == 'o' && ruudut[7] == 'o' && ruudut[8] == 'o' ||
                //Pystyrivit
                ruudut[0] == 'o' && ruudut[3] == 'o' && ruudut[6] == 'o' ||
                ruudut[1] == 'o' && ruudut[4] == 'o' && ruudut[7] == 'o' ||
                ruudut[2] == 'o' && ruudut[5] == 'o' && ruudut[8] == 'o' ||
                //Vinot rivit
                ruudut[0] == 'o' && ruudut[4] == 'o' && ruudut[8] == 'o' ||
                ruudut[2] == 'o' && ruudut[4] == 'o' && ruudut[6] == 'o')
            {
                label_voittaja.Text = "Voittaja: O";
                GameOn = false;
                reset_btn.Visible = true;
            }
            else if (
                //Vaakarivit
                ruudut[0] == 'x' && ruudut[1] == 'x' && ruudut[2] == 'x' ||
                ruudut[3] == 'x' && ruudut[4] == 'x' && ruudut[5] == 'x' ||
                ruudut[6] == 'x' && ruudut[7] == 'x' && ruudut[8] == 'x' ||
                //Pystyrivit
                ruudut[0] == 'x' && ruudut[3] == 'x' && ruudut[6] == 'x' ||
                ruudut[1] == 'x' && ruudut[4] == 'x' && ruudut[7] == 'x' ||
                ruudut[2] == 'x' && ruudut[5] == 'x' && ruudut[8] == 'x' ||
                //Vinot rivit
                ruudut[0] == 'x' && ruudut[4] == 'x' && ruudut[8] == 'x' ||
                ruudut[2] == 'x' && ruudut[4] == 'x' && ruudut[6] == 'x')
            {
                label_voittaja.Text = "Voittaja: X";
                GameOn = false;
                reset_btn.Visible = true;
            }

Metabolix [12.02.2019 17:35:02]

#

Ongelma ei selviä tuosta koodista, mutta olisiko vika esim. siinä, että piirrät klikkauksen yhteydessä yksi kerrallaan ristejä ja nollia mutta et koskaan piirrä niitä aikaisempia uudestaan? Siinä tapauksessa nykyinen ratkaisusi on vähän sama kuin se, että piirtäisit tussilla näyttöruutuun ja siivooja kävisi pyyhkimässä sen.

Ikkuna voi pyyhkiytyä tyhjäksi monestakin syystä, esimerkiksi silloin, kun pienennät ja suurennat ikkunan tai käytät sen piilossa toisen ikkunan takana). Sen takia sinun pitää joka piirtokerralla (ikkunan tai PictureBoxin Paint-tapahtumassa) piirtää koko pelilauta (kaikki ristit ja nollat).

Vielä parempi ratkaisu olisi tehdä kuvat rististä ja nollasta ja asettaa jokaiseen PictureBoxiin oikea kuva, jolloin PictureBox piirtäisi kuvan aina tarvittaessa automaattisesti. Jos kuvaan haluaa piirtää lisäyksiä, kannattaa piirtää itse kuvaan eikä PictureBoxiin.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta