Exemple #1
0
        /// <summary>
        /// Rekursiivinen aliohjelma joka hakee PelilautaRuudun viereiset Kirjainlaatat
        /// ja lisää ne Kirjainlaattalistaan tarkistuksia ja pistelaskua varten
        /// </summary>
        /// <param name="edellinen">PelilautaRuutu jonka viereisiä haetaan</param>
        /// <param name="viereiset">lista laatoista jotka muodostavat sanan</param>
        /// <param name="suunta">mihin suuntaan etsitään</param>
        /// <remarks>int suunta: 1, 2, 3 tai 4
        /// 1 == ylös
        /// 2 == alas
        /// 3 == vasemmalle
        /// 4 == oikealle
        /// </remarks>
        private void HaeSeuraavaViereinen(PelilautaRuutu edellinen, List <Kirjainlaatta> viereiset, int suunta)
        {
            PelilautaRuutu ruutu = null;

            // ylös
            if (suunta == 1)
            {
                ruutu = GetChildAt(edellinen.PositionX, edellinen.PositionY + 1);
            }
            // alas
            if (suunta == 2)
            {
                ruutu = GetChildAt(edellinen.PositionX, edellinen.PositionY - 1);
            }
            // vasemmalle
            if (suunta == 3)
            {
                ruutu = GetChildAt(edellinen.PositionX - 1, edellinen.PositionY);
            }
            // oikealle
            if (suunta == 4)
            {
                ruutu = GetChildAt(edellinen.PositionX + 1, edellinen.PositionY);
            }
            if (ruutu == null || ruutu.RuutuSisaltaaLaatan != true)
            {
                return;
            }
            else
            {
                if (suunta == 1 || suunta == 3)
                {
                    viereiset.Insert(0, ruutu.GetKirjainlaatta());
                }
                if (suunta == 2 || suunta == 4)
                {
                    viereiset.Add(ruutu.GetKirjainlaatta());
                }
                HaeSeuraavaViereinen(ruutu, viereiset, suunta);
            }
        }
Exemple #2
0
        /// <summary>
        /// Hakee Kirjainlaatat (ensimmäisen lisätyn laatan määräämästä sarakkeesta), jotka
        /// muodostavat sanan pelaajan tällä kierroksella lisäämien Kirjainlaattojen kanssa
        /// ja tarkistaa että niiden muodostama sana löytyy hyväksyttyjen
        /// sanojen listalta.
        /// </summary>
        /// <returns>Listan Kirjainlaatoista jotka muodostavat sanan</returns>
        private List <List <Kirjainlaatta> > HaePisteSarakeLaatat()
        {
            List <List <Kirjainlaatta> > pisteytettavatSanat = new List <List <Kirjainlaatta> >();
            List <Kirjainlaatta>         laatat = new List <Kirjainlaatta>();

            bool keskimmainenRuutuPeitossa = false;
            int  vanhojaLaattojaSanassa = 0;
            int  ensimmainen = laudalleLisatyt[0].PositionY, viimeinen = laudalleLisatyt[0].PositionY;

            // Etsitään sanan aloitus- ja lopetuspisteet
            for (int i = 1; i < laudalleLisatyt.Count; i++)
            {
                if (laudalleLisatyt[i].PositionY < ensimmainen)
                {
                    ensimmainen = laudalleLisatyt[i].PositionY;
                }
                if (laudalleLisatyt[i].PositionY > viimeinen)
                {
                    viimeinen = laudalleLisatyt[i].PositionY;
                }
            }

            // Lisätään kaikki Kirjainlaatat alku-ja loppupisteiden välistä
            // tarkistettavien listaan.
            for (int i = ensimmainen; i <= viimeinen; i++)
            {
                PelilautaRuutu ruutu = GetChildAt(laudalleLisatyt[0].PositionX, i);
                if (ruutu.RuutuSisaltaaLaatan)
                {
                    Kirjainlaatta k = ruutu.GetKirjainlaatta();
                    laatat.Add(k);
                }
                else
                {
                    RaiseLaattojenSijoitteluVirheEvent();
                    return(null);
                }
            }

            //Tarkistetaan onko lisättyjen laattojen ala/yläpuolella laattoja
            //ja lisätään ne tarkistettavaksi
            List <Kirjainlaatta> viereiset = new List <Kirjainlaatta>();

            viereiset.AddRange(laatat);

            int            eka = viereiset[0].PositionY, vika = viereiset[viereiset.Count - 1].PositionY;
            int            rivi = viereiset[0].PositionX;
            PelilautaRuutu r; // = GetChildAt(rivi, eka - 1);

            // ylhäällä olevat
            while ((r = GetChildAt(rivi, eka - 1)) != null && r.RuutuSisaltaaLaatan != false)
            {
                eka = r.PositionY;
                viereiset.Insert(0, r.GetKirjainlaatta());
                //r = GetChildAt(rivi, eka - 1);
            }
            //alhaalla olevat
            //r = GetChildAt(rivi, vika + 1);
            while ((r = GetChildAt(rivi, vika + 1)) != null && r.RuutuSisaltaaLaatan != false)
            {
                vika = r.PositionY;
                viereiset.Add(r.GetKirjainlaatta());
                //r = GetChildAt(rivi, vika + 1);
            }

            // Tarkistetaan sanan sijoittelu
            foreach (Kirjainlaatta k in viereiset)
            {
                PelilautaRuutu ruutu = GetChildAt(k.PositionX, k.PositionY);
                if (KierrosNumero == 0 && ruutu.PistekerroinTyyppi == 5)
                {
                    keskimmainenRuutuPeitossa = true;
                }
                if (k.Aktiivinen == false && KierrosNumero > 0)
                {
                    vanhojaLaattojaSanassa++;
                }
            }
            // Tarkistetaan että ensimmäinen lisätty sana peittää
            // pelilaudan keskimmäisen ruuden (aloitusruutu)
            if (KierrosNumero == 0 && !keskimmainenRuutuPeitossa)
            {
                RaiseEnsimmainenSanaEiAloitusruudussaVirheEvent();
                return(null);
            }
            // Tarkistetaan että lisätty sana on 'kiinni' jossakin
            // aikaisemmin lisätyssä sanassa
            if (laudalleLisatyt.Count > 1 && !onkoLisatytSamallaRivilla(laudalleLisatyt))
            {
                if (KierrosNumero > 0 && !(vanhojaLaattojaSanassa > 0))
                {
                    RaiseSanaEiKiinniAikaisemmassaVirheEvent();
                    return(null);
                }
            }

            String kokosana = "";

            foreach (Kirjainlaatta kirjain in viereiset)
            {
                kokosana += kirjain.Kirjain;
            }
            if (EtsiSanalistasta(kokosana))
            {
                pisteytettavatSanat.Add(viereiset);
            }
            else
            {
                // ilmoitetaan käyttäjälle virheestä
                RaiseSanaaEiLoytynytEvent(kokosana);
                // palautetaan null-lista, jotta ei anneta pisteitä virheellisistä sijoituksista
                return(null);
            }

            //Tarkistetaan muodostaako jokin syötetyn sanan Kirjainlaatoista
            //'lisäsanoja' vasemmalla/oikealla olevien laattojen kanssa
            List <Kirjainlaatta> lisasana = new List <Kirjainlaatta>();

            foreach (Kirjainlaatta laatta in laatat)
            {
                lisasana.Clear();
                int sarake = laatta.PositionY;
                eka  = laatta.PositionX;
                vika = laatta.PositionX;
                //r = GetChildAt(eka - 1, sarake);
                //Jos vasemmalle tai oikealla laattoja, lisätään tämä laatta listaan
                if ((r = GetChildAt(eka - 1, sarake)) != null && r.RuutuSisaltaaLaatan ||
                    (GetChildAt(vika + 1, sarake)) != null && GetChildAt(vika + 1, sarake).RuutuSisaltaaLaatan)
                {
                    lisasana.Add(laatta);
                }
                else
                {
                    // siirry seuraavan laatan kohdalle
                    continue;
                }

                // vasemmalla olevat
                while ((r = GetChildAt(eka - 1, sarake)) != null && r.RuutuSisaltaaLaatan != false)
                {
                    eka = r.PositionX;
                    lisasana.Insert(0, r.GetKirjainlaatta());
                    //r = GetChildAt(eka - 1, sarake);
                }

                // oikealla olevat
                //r = GetChildAt(vika + 1, sarake);
                while ((r = GetChildAt(vika + 1, sarake)) != null && r.RuutuSisaltaaLaatan != false)
                {
                    vika = r.PositionX;
                    lisasana.Add(r.GetKirjainlaatta());
                    //r = GetChildAt(vika + 1, sarake);
                }

                // tarkistetaan muodostuiko hyväksyttyvä sana
                String uusisana = "";
                foreach (Kirjainlaatta kirjain in lisasana)
                {
                    uusisana += kirjain.Kirjain;
                }
                if (EtsiSanalistasta(uusisana))
                {
                    pisteytettavatSanat.Add(lisasana);
                }
                else
                {
                    // ilmoitetaan käyttäjälle virheestä; jos joku 'lisäsanoista'
                    // on virheellinen, kirjainlaatat eivät voi olla tässä muodostelmassa
                    // vaikka 'pääsana' olisi oikein
                    RaiseSanaaEiLoytynytEvent(uusisana);
                    // palautetaan null-lista, jotta ei anneta pisteitä virheellisistä sijoituksista
                    return(null);
                }
            }
            return(pisteytettavatSanat);
        }