Beispiel #1
0
 private bool TeeMustaSiirto(Koordinaatit siirto)
 {
     if (lauta[siirto.X, siirto.Y] != null)
     {
         throw new Exception("Musta teki väärän siirron. Siirto jo olemassa");
     }
     lauta[siirto.X, siirto.Y] = false;
     PaivitaLeikkurit(siirto);
     return TarkistaLoppuikoPeliTallaSiirrolla(siirto.X, siirto.Y, mustaVari, lauta);
 }
Beispiel #2
0
 public void EtsiSeuraavaMahdollinenSiirtoVasemmaltaYlos_EiAiempiaSiirtoja_OikealtaLoytyyMerkki()
 {
     //testien initissä laitettiin merkki ruutuun (4,10)
     var oletetutKoordinaatit = new Koordinaatit(3, 9);
     var tulos = solmu.EtsiSeuraavaMahdollinenSiirtoVasemmaltaYlos();
     Assert.AreEqual(oletetutKoordinaatit.X, tulos.X);
     Assert.AreEqual(oletetutKoordinaatit.Y, tulos.Y);
 }
Beispiel #3
0
 public bool OnkoSiirtoLoytynytAiemmin(Koordinaatit uusiSiirto, List<Koordinaatit> mahdollisetSiirrot)
 {
     foreach (var siirto in mahdollisetSiirrot)
     {
         if (siirto.X == uusiSiirto.X && siirto.Y == uusiSiirto.Y) return true;
     }
     return false;
 }
Beispiel #4
0
 public Koordinaatit SiirrySeuraavaanRuutuunVasemmalta(Koordinaatit etsintaKoordinaatit)
 {
     int seuraavanXKoord;
     int seuraavanYKoord;
     if (etsintaKoordinaatit.Y < 14)
     {
         seuraavanYKoord = etsintaKoordinaatit.Y + 1;
         seuraavanXKoord = etsintaKoordinaatit.X;
         return new Koordinaatit(seuraavanXKoord, seuraavanYKoord);
     }
     if (etsintaKoordinaatit.X < 14)
     {
         seuraavanYKoord = 0;
         seuraavanXKoord = etsintaKoordinaatit.X + 1;
         return new Koordinaatit(seuraavanXKoord, seuraavanYKoord);
     }
     return null;
 }
Beispiel #5
0
 private bool?[,] LuoUusiPelinTilaUudellaSiirrolla(Koordinaatit uudenLapsenSijainti)
 {
     var paivitettyPelinTila = (bool?[,])lauta.Clone();
     paivitettyPelinTila[uudenLapsenSijainti.X, uudenLapsenSijainti.Y] = !peliMerkinVari;
     return paivitettyPelinTila;
 }
Beispiel #6
0
 /// <summary>
 /// Etsii annetuista koordinaateista (ei etsi annetusta pisteestä!) seuraavan mahdollisen siirron vasemmalta ylös
 /// </summary>
 public Koordinaatit EtsiSeuraavaMahdollinenSiirto(bool?[,] tutkittavaLauta, Koordinaatit aloitusKoordinaatit)
 {
     if (aloitusKoordinaatit == null) return null;
     var koordinaatit = EtsiSeuraavaTyhjäRuutuVasemmalta(aloitusKoordinaatit);
     if (koordinaatit == null) return null;
     for (var i = koordinaatit.X; i < 15; i++)
     {
         //ensimmäinen tutkittava rivi
         if (i == koordinaatit.X)
         {
             for (var j = koordinaatit.Y; j < 15; j++)
             {
                 if (TutkiVierekkaisistaRuuduistaLoytyykoPeliMerkkia(i, j, tutkittavaLauta)) return new Koordinaatit(i, j);
             }
         }
         else // muut rivit
         {
             for (var j = 0; j < 15; j++)
             {
                 if (TutkiVierekkaisistaRuuduistaLoytyykoPeliMerkkia(i, j, tutkittavaLauta)) return new Koordinaatit(i, j);
             }
         }
     }
     return null;
 }
Beispiel #7
0
 public void PaivitaLeikkuritTest_SiirtoEiPaivitaLeikkureita()
 {
     var siirto = new Koordinaatit(7, 8);
     lauta.PaivitaLeikkurit(siirto);
     Assert.AreEqual(6, lauta.VasenLeikkuri);
     Assert.AreEqual(7, lauta.OikeaLeikkuri);
 }
Beispiel #8
0
 public Solmu(bool?[,] pelilauta, Koordinaatit sijainti, bool merkinVari)
 {
     AlustaSolmu(pelilauta, merkinVari, sijainti.X, sijainti.Y);
 }
Beispiel #9
0
 private void TeeIhmisenSiirto(Ruutu painettu)
 {
     painettu.SetKlikattuJaVariJaVarjaa(seuraavanTaytettavanRuudunVari);
     var siirtoPeliKoordinaateissa = MuunnaUiKoordinaateistaPeliKoordinaatteihin(painettu.XKoordinaatti,painettu.YKoordinaatti);
     if (lauta.TeeSiirtoJaIlmoitaLoppuikoPeli(siirtoPeliKoordinaateissa.X, siirtoPeliKoordinaateissa.Y, mustanPelaajanVuoro)) IlmoitaPelinLoppumisesta();
     edellinenSiirto = siirtoPeliKoordinaateissa;
     VaihdaVuoroa();
     MctsTeeSiirto();
 }
Beispiel #10
0
        /// <summary>
        /// alustaa pelilaudan, luo ruudut
        /// </summary>
        private void AlustaKayttoliittymanPelilaudanPelitilanne()
        {
            for (var i = 0; i < korkeus; i++)
            {
                for (var j = 0; j < leveys; j++)
                {
                    var apu = new Ruutu(j, i);
                    apu.rectangle.Fill = new SolidColorBrush(pohja);
                    apu.Vari = pohja;
                    apu.MouseLeftButtonDown += Ruutu_MouseLeftButtonDown;
                    apu.MouseEnter += Ruutu_MouseEnter;
                    apu.MouseLeave += Ruutu_MouseLeave;
                    Grid.SetRow(apu, i);
                    Grid.SetColumn(apu, j);
                    LaudanGrid.Children.Add(apu);

                    if (i == 7 && j == 7)
                    {
                        apu.SetKlikattuJaVariJaVarjaa(mustaPelimerkki);
                    }
                }
            }
            edellinenSiirto = new Koordinaatit(7,7);
            lauta.AlustaPelilauta();
            mustanPelaajanVuoro = false;
            seuraavanTaytettavanRuudunVari = valkeaPelimerkki;
        }
Beispiel #11
0
 private void MctsTeeSiirto()
 {
     var tehtySiirto = mcts.TeeSiirto(lauta.Lauta, edellinenSiirto);
     edellinenSiirto = tehtySiirto;
     var ruutuJohonSiirtoTehtiin = GetRuutu(tehtySiirto.X, tehtySiirto.Y, false);
     ruutuJohonSiirtoTehtiin.SetKlikattuJaVariJaVarjaa(seuraavanTaytettavanRuudunVari);
     if (lauta.TeeSiirtoJaIlmoitaLoppuikoPeli(tehtySiirto.X, tehtySiirto.Y, mustanPelaajanVuoro)) IlmoitaPelinLoppumisesta();
     VaihdaVuoroa();
 }
Beispiel #12
0
 public override Koordinaatit TeeSiirto(bool?[,] lauta, Koordinaatit edellinenSiirto)
 {
     throw new NotImplementedException();
 }
Beispiel #13
0
        public void Init()
        {
            lauta = new PeliLauta();

            testiLauta = lauta.Lauta;
            testiLauta[4, 10] = true;
            var sijainti = new Koordinaatit(4, 10);
            const bool valkoinenVari = true;
            const bool mustaVari = false;
            solmu = new Solmu(testiLauta, sijainti, valkoinenVari);
            juuri = new Solmu(new PeliLauta().Lauta, 7, 7, mustaVari, onkoJuuri: true);
        }
Beispiel #14
0
        // Etsii seuraavan tyhjän ruudun lähtien annetuista koordinaateista (ei etsi annetusta pisteestä!) oikealta vasemmalle, ylähäältä alas
        public Koordinaatit EtsiSeuraavaTyhjäRuutuOikealta(Koordinaatit etsintaKoordinaatit)
        {
            var koordinaatit = SiirrySeuraavaanRuutunOikealta(etsintaKoordinaatit);
            for (var i = koordinaatit.X; i > -1; i--)
            {
                //ensimmäinen tutkittava rivi
                if (i == koordinaatit.X)
                {

                    for (var j = koordinaatit.Y; j > -1; j--)
                    {
                        if (lauta[i, j] == null) return new Koordinaatit(i, j);
                    }
                }
                else // muut rivit
                {
                    for (var j = 14; j > -1; j--)
                    {
                        if (lauta[i, j] == null) return new Koordinaatit(i, j);
                    }
                }
            }
            return null;
        }
Beispiel #15
0
 public void PaivitaLeikkuritTest_SiirtoPaivittaaOikeanLeikkurinReunaan()
 {
     var siirto = new Koordinaatit(14, 8);
     lauta.Lauta[14, 8] = valkeaMerkki;
     lauta.PaivitaLeikkurit(siirto);
     Assert.AreEqual(6, lauta.VasenLeikkuri);
     Assert.AreEqual(14, lauta.OikeaLeikkuri);
 }
Beispiel #16
0
        /// <summary>
        /// Tarkistaa annetun siirron ja edellisen tallennetun siirron avulla onko tämän solmun kaikki lapsi solmut löydetty.
        /// Lapset on löydetty jos parametrina annettu siirto ei ole enää uusi.
        /// Käyttää päättelyssä sitä tietoa että solmut lisätään aina vasemmalta ylös ja oikealta alas.
        /// </summary>
        public bool OnkoKaikkiLapsetEtsitty(Koordinaatit uusiSiirto)
        {
            if (edellisenLisatynSuunta == Suunta.Vasemmalle)
            {   //uusi siirto tehty oikealle
                if (edellisenVasemmaltaLisätynLapsenPaikka == null) return false;
                var xKoordinaattiUudellaPienempiKuinVanhalla = uusiSiirto.X < edellisenVasemmaltaLisätynLapsenPaikka.X;
                var xKoordinaattiSamaMuttaYKoordPienempi = (uusiSiirto.X == edellisenVasemmaltaLisätynLapsenPaikka.X) && (uusiSiirto.Y <= edellisenVasemmaltaLisätynLapsenPaikka.Y);
                if (xKoordinaattiUudellaPienempiKuinVanhalla || xKoordinaattiSamaMuttaYKoordPienempi) return true;
                return false;
            }

            //uusi siirto tehty vasemmalle
            if (edellisenOikealtaLisätynLapsenPaikka == null) return false;
            var xKoordinaatiUudellaIsompiKuinVanhalla = uusiSiirto.X > edellisenOikealtaLisätynLapsenPaikka.X;
            var xKoordinaattiSamaMuuttaYKoordIsompi = (uusiSiirto.X == edellisenOikealtaLisätynLapsenPaikka.X) && (uusiSiirto.Y >= edellisenOikealtaLisätynLapsenPaikka.Y);
            if (xKoordinaatiUudellaIsompiKuinVanhalla || xKoordinaattiSamaMuuttaYKoordIsompi) return true;
            return false;
        }
Beispiel #17
0
 public void PaivitaLeikkuritTest_SiirtoPaivittaaVasemmanLeikkurin()
 {
     var siirto = new Koordinaatit(6, 8);
     lauta.Lauta[6, 8] = valkeaMerkki;
     lauta.PaivitaLeikkurit(siirto);
     Assert.AreEqual(5, lauta.VasenLeikkuri);
     Assert.AreEqual(7, lauta.OikeaLeikkuri);
 }
Beispiel #18
0
 public Koordinaatit SiirrySeuraavaanRuutunOikealta(Koordinaatit etsintaKoordinaatit)
 {
     int seuraavanXKoord;
     int seuraavanYKoord;
     if (etsintaKoordinaatit.Y > 0)
     {
         seuraavanYKoord = etsintaKoordinaatit.Y - 1;
         seuraavanXKoord = etsintaKoordinaatit.X;
         return new Koordinaatit(seuraavanXKoord, seuraavanYKoord);
     }
     if (etsintaKoordinaatit.X > 0)
     {
         seuraavanYKoord = 14;
         seuraavanXKoord = etsintaKoordinaatit.X - 1;
         return new Koordinaatit(seuraavanXKoord, seuraavanYKoord);
     }
     return null;
 }
Beispiel #19
0
 public void PaivitaLeikkuritTest_SiirtoPaivittaaVasemmanLeikkurinNollaksi()
 {
     var siirto = new Koordinaatit(0, 0);
     lauta.Lauta[0, 0] = valkeaMerkki;
     lauta.PaivitaLeikkurit(siirto);
     Assert.AreEqual(0, lauta.VasenLeikkuri);
     Assert.AreEqual(7, lauta.OikeaLeikkuri);
 }
Beispiel #20
0
 private void PaivitaEdellisenLisätynLapsenPaikka(Solmu uusiLapsi)
 {
     if (edellisenLisatynSuunta == Suunta.Oikealle)
     {   //Hakusuunta vuorottelee
         edellisenLisatynSuunta = Suunta.Vasemmalle;
         edellisenVasemmaltaLisätynLapsenPaikka = new Koordinaatit(uusiLapsi.X, uusiLapsi.Y);
         return;
     }
     //Hakusuunta vuorottelee
     edellisenLisatynSuunta = Suunta.Oikealle;
     edellisenOikealtaLisätynLapsenPaikka = new Koordinaatit(uusiLapsi.X, uusiLapsi.Y);
 }
Beispiel #21
0
 public void PelaaPeliLoppuunSatunnaisillaSiirroillaTest()
 {
     const bool pelaajanPelimerkinVari = true;
     testiLauta[6, 6] = pelaajanPelimerkinVari;
     var solmunSijainti = new Koordinaatit(6, 6);
     var solmu = new Solmu(testiLauta, solmunSijainti, pelaajanPelimerkinVari);
     var tulos = lauta.PelaaPeliLoppuunSatunnaisillaSiirroilla(solmu, pelaajanPelimerkinVari);
     if(tulos != 1 && tulos != -1) Assert.Fail("Väärä tulos: " + tulos);
 }
Beispiel #22
0
        // Etsii seuraavan tyhjän ruudun lähtien annetuista koordinaateista (ei etsi annetusta pisteestä!) vasemmalta oikealla, alhaalta ylös
        public Koordinaatit EtsiSeuraavaTyhjäRuutuVasemmalta(Koordinaatit etsintaKoordinaatit)
        {
            var koordinaatit = SiirrySeuraavaanRuutuunVasemmalta(etsintaKoordinaatit);
            if (koordinaatit == null) return null;
            for (var i = koordinaatit.X; i < 15; i++)
            {
                //ensimmäinen tutkittava rivi
                if (i == koordinaatit.X)
                {

                    for (var j = koordinaatit.Y; j < 15; j++)
                    {
                        if (lauta[i, j] == null) return new Koordinaatit(i, j);
                    }
                }
                else // muut rivit
                {
                    for (var j = 0; j < 15; j++)
                    {
                        if (lauta[i, j] == null) return new Koordinaatit(i, j);
                    }
                }
            }
            return null;
        }
Beispiel #23
0
 public override Koordinaatit TeeSiirto(bool?[,] lauta, Koordinaatit edellinenSiirto)
 {
     PaivitaPelitilanne(lauta, edellinenSiirto);
     Solmu tulos = AjaUCT();
     return new Koordinaatit(tulos.X, tulos.Y);
 }
Beispiel #24
0
        public void PaivitaLeikkurit(Koordinaatit siirto)
        {
            if (vasenLeikkuri >= siirto.X && siirto.X > 0)
            {
                vasenLeikkuri = siirto.X - 1;
            }

            if (vasenLeikkuri >= siirto.X && siirto.X == 0)
            {
                vasenLeikkuri = 0;
            }

            if (oikeaLeikkuri < siirto.X && siirto.X < 15)
            {
                oikeaLeikkuri = siirto.X;
            }
        }
Beispiel #25
0
 private void PaivitaPelitilanne(bool?[,] lauta, Koordinaatit edellinenSiirto)
 {
     //TODO jatka selvittämättä miksi mcts:n laudaussa on jo tässä vaiheessa vastustajan tekemä siirto
     var eiOleEnsimmainenSiirto = edellinenSiirto.X != 7 && edellinenSiirto.Y != 7;
     if(_peliLauta.Lauta[edellinenSiirto.X, edellinenSiirto.Y] != null && eiOleEnsimmainenSiirto) throw new Exception("Vastustajan tekemä siirto oli jo olemassa");
     SelvitaUusiJuuri(lauta, edellinenSiirto);
     _peliLauta.Lauta = lauta;
 }
Beispiel #26
0
 public bool TeeSiirtoJaIlmoitaLoppuikoPeli(int x, int y, bool mustanSiirto)
 {
     var siirto = new Koordinaatit(x,y);
     if (mustanSiirto) return TeeMustaSiirto(siirto);
     return TeeValkeaSiirto(siirto);
 }
Beispiel #27
0
        /// <summary>
        /// Selvittää edellisen siirron perusteella mikä täytyy valita uudeksi juureksi
        /// </summary>
        public void SelvitaUusiJuuri(bool?[,] lauta, Koordinaatit edellinenSiirto)
        {
            var vastustajanPelimerkinVari = !pelimerkinVari;
            if (_juuri.X == edellinenSiirto.X && _juuri.Y == edellinenSiirto.Y) return;

            if (_juuri.Lapsi != null)
            {
                if (_juuri.Lapsi.X == edellinenSiirto.X && _juuri.Lapsi.Y == edellinenSiirto.Y)
                {
                    VaihdaJuuri(_juuri.Lapsi);
                    return;
                }

                foreach (var solmu in _juuri.Lapsi.Sisarukset)
                {
                    if (solmu.X == edellinenSiirto.X && solmu.Y == edellinenSiirto.Y)
                    {
                        VaihdaJuuri(solmu);
                        return;
                    }
                }
            }

            //uutta siirtoa ei ole ehditty käymään läpi edellisellä iteraatiolla, luodaan uusi juuri
            //täytyy kääntää merkin väri koska edellisen siirron tehnyt vastustaja
            VaihdaJuuri(new Solmu(lauta, edellinenSiirto, vastustajanPelimerkinVari));
        }
Beispiel #28
0
 private bool TeeValkeaSiirto(Koordinaatit siirto)
 {
     if (lauta[siirto.X, siirto.Y] != null)
     {
         throw new Exception("Valkea teki väärän siirron. Siirto jo olemassa");
     }
     lauta[siirto.X, siirto.Y] = true;
     PaivitaLeikkurit(siirto);
     return TarkistaLoppuikoPeliTallaSiirrolla(siirto.X, siirto.Y, valkoinenVari, lauta);
 }
Beispiel #29
0
 public void EtsiSeuraavaMahdollinenSiirtoVasemmaltaYlos_EiAiempiaSiirtoja_LaudanYlalaidastaLoytyyMerkki()
 {
     testiLauta[2, 14] = true;
     var oletetutKoordinaatit = new Koordinaatit(1, 13);
     var tulos = solmu.EtsiSeuraavaMahdollinenSiirtoVasemmaltaYlos();
     Assert.AreEqual(oletetutKoordinaatit.X, tulos.X);
     Assert.AreEqual(oletetutKoordinaatit.Y, tulos.Y);
 }