/// <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); } }
/// <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); }