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); }
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); }
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; }
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; }
private bool?[,] LuoUusiPelinTilaUudellaSiirrolla(Koordinaatit uudenLapsenSijainti) { var paivitettyPelinTila = (bool?[,])lauta.Clone(); paivitettyPelinTila[uudenLapsenSijainti.X, uudenLapsenSijainti.Y] = !peliMerkinVari; return paivitettyPelinTila; }
/// <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; }
public void PaivitaLeikkuritTest_SiirtoEiPaivitaLeikkureita() { var siirto = new Koordinaatit(7, 8); lauta.PaivitaLeikkurit(siirto); Assert.AreEqual(6, lauta.VasenLeikkuri); Assert.AreEqual(7, lauta.OikeaLeikkuri); }
public Solmu(bool?[,] pelilauta, Koordinaatit sijainti, bool merkinVari) { AlustaSolmu(pelilauta, merkinVari, sijainti.X, sijainti.Y); }
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(); }
/// <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; }
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(); }
public override Koordinaatit TeeSiirto(bool?[,] lauta, Koordinaatit edellinenSiirto) { throw new NotImplementedException(); }
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); }
// 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; }
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); }
/// <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; }
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); }
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; }
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); }
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); }
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); }
// 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; }
public override Koordinaatit TeeSiirto(bool?[,] lauta, Koordinaatit edellinenSiirto) { PaivitaPelitilanne(lauta, edellinenSiirto); Solmu tulos = AjaUCT(); return new Koordinaatit(tulos.X, tulos.Y); }
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; } }
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; }
public bool TeeSiirtoJaIlmoitaLoppuikoPeli(int x, int y, bool mustanSiirto) { var siirto = new Koordinaatit(x,y); if (mustanSiirto) return TeeMustaSiirto(siirto); return TeeValkeaSiirto(siirto); }
/// <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)); }
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); }
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); }