private void btnProsledi_Click(object sender, EventArgs e) { Potez p = new Potez(int.Parse(numericUpDown1.Value.ToString()), int.Parse(numericUpDown2.Value.ToString())); glavna.trenutnaFiguraZaDodavanje = p; this.Close(); }
/// <summary> /// Vrsi potez /// </summary> /// <param name="p1">Destinacija</param> public void UradiPotez(Potez p1, Potez p2) //p1 mesto na koje ide { int tmp; tmp = Stanje.matrica[p1.x, p1.y]; Stanje.matrica[p1.x, p1.y] = Stanje.matrica[p2.x, p2.y]; Stanje.matrica[p2.x, p2.y] = tmp; naPotezu = naPotezu ^ 3; }
/// <summary> /// Provarava validnost poteza(da li moze da skoci na polje)(ne gleda da li je zauzeto, samo da li je potez validan u smislu povlacenja) /// </summary> /// <param name="tip"></param> /// <param name="p">Polazne koordinate</param> /// <returns></returns> public bool DaLiJeValidan(Tip tip, Potez p) { if (tip == Tip.BeliKralj || tip == Tip.CrniKralj) { if (this.x == p.x - 1) { if (this.y == p.y || this.y == p.y - 1 || this.y == p.y + 1) { return(true); } } if (this.x == p.x + 1) { if (this.y == p.y || this.y == p.y - 1 || this.y == p.y + 1) { return(true); } } if (this.x == p.x) { if (this.y == p.y - 1 || this.y == p.y + 1) { return(true); } } return(false); } if (tip == Tip.BeliTop) { if (this.x == p.x) { if (this.y != p.y) { return(true); } return(false); } if (this.y == p.y) { if (this.x != p.x) { return(true); } return(false); } } return(false); }
/// <summary> /// Vraca listu mogucih poteza za figuru /// </summary> /// <param name="f"></param> /// <returns></returns> public List <Potez> listaMogucihPoteza(Tip tip, Potez trenutneKoordinate) { List <Potez> lista = new List <Potez>(); List <Potez> listaZaVracanje = new List <Potez>(); lista = Stanje.listaSlobodnihPolja(); foreach (Potez p in lista) { if (p.UGranicama()) { if (p.DaLiJeValidan(tip, trenutneKoordinate)) { p.tipFigure = tip; listaZaVracanje.Add(p); } } } return(listaZaVracanje); }
private void b_Click(object sender, EventArgs e) { Button b = sender as Button; if (i % 2 != 0) //ako se klikne na prazno "i" ostaje 0 { pocetneKoordinate = new Potez((int.Parse((int.Parse(b.Tag.ToString()) / 10).ToString())), (int.Parse((int.Parse(b.Tag.ToString()) % 10).ToString()))); if (kontekst.Stanje.matrica[pocetneKoordinate.x, pocetneKoordinate.y] == 0) { i--; } else { //proverava da li je odgovarajuci igrac na potezu if ((kontekst.Stanje.matrica[pocetneKoordinate.x, pocetneKoordinate.y] == 2 || kontekst.Stanje.matrica[pocetneKoordinate.x, pocetneKoordinate.y] == 3) && kontekst.naPotezu == 1) { i--; } if (kontekst.Stanje.matrica[pocetneKoordinate.x, pocetneKoordinate.y] == 1 && kontekst.naPotezu == 2) { i--; } } listaMogucihPoteza = kontekst.FinalnaListaMogucihPoteza(kontekst, pocetneKoordinate); if (listaMogucihPoteza.Count > 0) { foreach (Potez p in listaMogucihPoteza) { buttons[p.x, p.y].BackColor = Color.LightSkyBlue; } } } if (i % 2 == 0) //vec je kliknuto jedanput na figuru, pa moze da se izvrsi potez, ukoliko se klikne na validno polje { bool sadrzi = false; odredisneKoordinate = new Potez((int.Parse((int.Parse(b.Tag.ToString()) / 10).ToString())), (int.Parse((int.Parse(b.Tag.ToString()) % 10).ToString()))); odredisneKoordinate.tipFigure = (Tip)kontekst.Stanje.matrica[pocetneKoordinate.x, pocetneKoordinate.y]; foreach (Potez p in listaMogucihPoteza) { if (p.Equals(odredisneKoordinate)) { sadrzi = true; } } if (sadrzi) { kontekst.UradiPotez(odredisneKoordinate, pocetneKoordinate); } Refresh(); label1.Text = kontekst.DalijeNapadnut(Tip.CrniKralj).ToString(); label3.Text = kontekst.DalijeNapadnut(Tip.BeliTop).ToString(); if (kontekst.DaLiJeKraj()) { if (kontekst.DaLiJeMat()) { MessageBox.Show("MAT!"); } else { MessageBox.Show("PAT!"); } } } i++; }
private void btnIgraj_Click(object sender, EventArgs e) { if (kontekst.naPotezu == (int)Igra.Beli) { Potez p = kontekst.AlphaBeta(kontekst, 4, int.MinValue, int.MaxValue); lblPotezi.Text = Context.i.ToString(); Context.i = 0; Koordinate mestoFigureKojaIgra = kontekst.NadjiFiguru(p.tipFigure, kontekst); Koordinate beliTop = kontekst.NadjiFiguru(Tip.BeliTop, kontekst); Context context = new Context(kontekst); context.UradiPotez(new Potez(mestoFigureKojaIgra.x, mestoFigureKojaIgra.y), p); if (!context.DalijeNapadnut(Tip.BeliTop)) { kontekst.UradiPotez(new Potez(mestoFigureKojaIgra.x, mestoFigureKojaIgra.y), p); } else { List <Potez> listaFigureKojaIgra = kontekst.FinalnaListaMogucihPoteza(kontekst, new Potez(beliTop.x, beliTop.y)); if (listaFigureKojaIgra.Contains(new Potez(beliTop.x, 0))) { kontekst.UradiPotez(new Potez(beliTop.x, beliTop.y), new Potez(beliTop.x, 0)); } else { kontekst.UradiPotez(new Potez(beliTop.x, beliTop.y), new Potez(beliTop.x, 7)); } } Refresh(); label1.Text = kontekst.DalijeNapadnut(Tip.CrniKralj).ToString(); label3.Text = kontekst.DalijeNapadnut(Tip.BeliTop).ToString(); if (kontekst.DaLiJeKraj()) { if (kontekst.DaLiJeMat()) { MessageBox.Show("MAT!"); } else if (kontekst.DaLiJePat()) { MessageBox.Show("PAT!"); } kontekst.Seralization(Context.transposTable); MessageBox.Show("Serijalizacija transpozicione tabele uspesna!"); } } else { Context.i = 0; Potez p = kontekst.AlphaBeta(kontekst, 4, int.MinValue, int.MaxValue); lblPotezi.Text = Context.i.ToString(); Koordinate mestoFigureKojaIgra = kontekst.NadjiFiguru(p.tipFigure, kontekst); kontekst.UradiPotez(new Potez(mestoFigureKojaIgra.x, mestoFigureKojaIgra.y), p); Refresh(); label1.Text = kontekst.DalijeNapadnut(Tip.CrniKralj).ToString(); label3.Text = kontekst.DalijeNapadnut(Tip.BeliTop).ToString(); if (kontekst.DaLiJeKraj()) { if (kontekst.DaLiJeMat()) { MessageBox.Show("MAT!"); } else if (kontekst.DaLiJePat()) { MessageBox.Show("PAT!"); } kontekst.Seralization(Context.transposTable); MessageBox.Show("Serijalizacija transpozicione tabele uspesna!"); } } }
public Potez(Potez p) { this.x = p.x; y = p.y; Value = p.Value; }
public Potez AlphaBeta(Context ctx, int depth, int alpha, int beta) { Potez najbolji = new Potez(); //ovaj potez vraca funkcija Potez pom = new Potez(); Context.i++; if (depth == 0 || ctx.DaLiJeKraj()) { najbolji.Value = ctx.Evaluate(depth - 4); return(najbolji); } Potez trenutnoMesto; Koordinate trenutneKoordinate; List <Potez> listaPoteza = new List <Potez>(); List <Potez> listaKralja = new List <Potez>(); List <Potez> listaTopa = new List <Potez>(); Koordinate beliKralj = NadjiFiguru(Tip.BeliKralj, ctx); Koordinate beliTop = NadjiFiguru(Tip.BeliTop, ctx); Koordinate crniKralj = NadjiFiguru(Tip.CrniKralj, ctx); if (ctx.naPotezu == (int)Igra.Beli) { listaKralja = FinalnaListaMogucihPoteza(ctx, new Potez(beliKralj.x, beliKralj.y)); listaTopa = FinalnaListaMogucihPoteza(ctx, new Potez(beliTop.x, beliTop.y)); listaPoteza.AddRange(listaTopa); listaPoteza.AddRange(listaKralja); } else { listaPoteza = FinalnaListaMogucihPoteza(ctx, new Potez(crniKralj.x, crniKralj.y)); } int v; if (ctx.naPotezu == (int)Igra.Beli) { v = int.MinValue; foreach (Potez pot in listaPoteza) { trenutneKoordinate = NadjiFiguru(pot.tipFigure, ctx); trenutnoMesto = new Potez(trenutneKoordinate.x, trenutneKoordinate.y); Context zaProsledjivanje = new Context(ctx); zaProsledjivanje.UradiPotez(trenutnoMesto, pot); if (transposTable.Contains(zaProsledjivanje.hashFunction() + zaProsledjivanje.hash2() + zaProsledjivanje.GetHashCode())) { int hash = (int)transposTable[zaProsledjivanje.hashFunction() + zaProsledjivanje.hash2() + zaProsledjivanje.GetHashCode()]; najbolji.Value = hash; return(najbolji); } pom = AlphaBeta(zaProsledjivanje, depth - 1, alpha, beta); if (v < pom.Value) { v = pom.Value; najbolji = pot; najbolji.Value = v; alpha = Math.Max(alpha, v); } if (beta <= alpha) { break; } } if (!transposTable.Contains(ctx.hashFunction() + ctx.hash2() + ctx.GetHashCode())) { transposTable.Add(ctx.hashFunction() + ctx.hash2() + ctx.GetHashCode(), najbolji.Value); } return(najbolji); } else { v = int.MaxValue; foreach (Potez pot in listaPoteza) { trenutneKoordinate = NadjiFiguru(Tip.CrniKralj, ctx); trenutnoMesto = new Potez(trenutneKoordinate.x, trenutneKoordinate.y); Context zaProsledjivanje = new Context(ctx); zaProsledjivanje.UradiPotez(trenutnoMesto, pot); if (transposTable.Contains(zaProsledjivanje.hashFunction() + zaProsledjivanje.hash2() + zaProsledjivanje.GetHashCode())) { int hash = (int)transposTable[zaProsledjivanje.hashFunction() + zaProsledjivanje.hash2() + zaProsledjivanje.GetHashCode()]; najbolji.Value = hash; return(najbolji); } pom = AlphaBeta(zaProsledjivanje, depth - 1, alpha, beta); if (v > pom.Value) { v = pom.Value; najbolji = pot; najbolji.Value = v; beta = Math.Min(beta, v); } if (beta <= alpha) { break; } } if (!transposTable.Contains(ctx.hashFunction() + ctx.hash2() + ctx.GetHashCode())) { transposTable.Add(ctx.hashFunction() + ctx.hash2() + ctx.GetHashCode(), najbolji.Value); } return(najbolji); } }
/// <summary> /// Kreira konacnu listu mogucih poteza koje figura moze odigradi /// </summary> /// <param name="ctx"></param> /// <param name="trenutneKoordinate"></param> /// <returns></returns> public List <Potez> FinalnaListaMogucihPoteza(Context ctx, Potez trenutneKoordinate) { List <Potez> listaZaVracanje = new List <Potez>(); List <Potez> listaNedozvoljenihPoteza = new List <Potez>(); Tip figura = (Tip)ctx.Stanje.matrica[trenutneKoordinate.x, trenutneKoordinate.y]; Koordinate beliKralj = NadjiFiguru(Tip.BeliKralj, ctx); Koordinate beliTop = NadjiFiguru(Tip.BeliTop, ctx); Koordinate crniKralj = NadjiFiguru(Tip.CrniKralj, ctx); //kreira listu svih poteza za figuru listaZaVracanje = ctx.listaMogucihPoteza(figura, trenutneKoordinate); switch (figura) { case Tip.CrniKralj: //treba da nadje polja koja napadaju beli kralj i top List <Potez> listaNedozvoljenihPotezaKralj = new List <Potez>(); List <Potez> listaNedozvoljenihPotezaTop = new List <Potez>(); listaNedozvoljenihPotezaKralj = listaMogucihPoteza(Tip.BeliKralj, new Potez(beliKralj.x, beliKralj.y)); listaNedozvoljenihPotezaTop = listaMogucihPoteza(Tip.BeliTop, new Potez(beliTop.x, beliTop.y)); if (beliKralj.x == beliTop.x || beliKralj.y == beliTop.y) { List <Potez> blokiraniPotezi = new List <Potez>(); if (beliKralj.x == beliTop.x) { if (beliKralj.y < beliTop.y) { for (int i = 0; i <= beliKralj.y; blokiraniPotezi.Add(new Potez(beliKralj.x, i++))) { ; } } else { for (int i = 7; i >= beliKralj.y; blokiraniPotezi.Add(new Potez(beliKralj.x, i--))) { ; } } } else if (beliKralj.y == beliTop.y) { if (beliKralj.x < beliTop.x) { for (int i = 0; i <= beliKralj.x; blokiraniPotezi.Add(new Potez(i++, beliKralj.y))) { ; } } else { for (int i = 7; i >= beliKralj.x; blokiraniPotezi.Add(new Potez(i--, beliKralj.y))) { ; } } } listaNedozvoljenihPotezaTop = listaNedozvoljenihPotezaTop.Except(blokiraniPotezi).ToList(); } listaNedozvoljenihPoteza.AddRange(listaNedozvoljenihPotezaKralj); listaNedozvoljenihPoteza.AddRange(listaNedozvoljenihPotezaTop); break; case Tip.BeliKralj: //treba da nadje polja koja napada crni kralj listaNedozvoljenihPoteza = listaMogucihPoteza(Tip.CrniKralj, new Potez(crniKralj.x, crniKralj.y)); break; case Tip.BeliTop: //treba da nadje polja koja napada crni kralj, a ne stiti beli kralj //i da mu onemoguci da preskace belog kralja listaNedozvoljenihPoteza = listaMogucihPoteza(Tip.CrniKralj, new Potez(crniKralj.x, crniKralj.y)); List <Potez> kretanjeBelogKralja = listaMogucihPoteza(Tip.BeliKralj, new Potez(beliKralj.x, beliKralj.y)); listaNedozvoljenihPoteza = listaNedozvoljenihPoteza.Except(kretanjeBelogKralja).ToList(); //proverava da li beli kralj blokira kretanje topa if (beliKralj.x == beliTop.x) { if (beliKralj.y < beliTop.y) { for (int i = 0; i <= beliKralj.y; listaNedozvoljenihPoteza.Add(new Potez(beliKralj.x, i++))) { ; } } else { for (int i = 7; i >= beliKralj.y; listaNedozvoljenihPoteza.Add(new Potez(beliKralj.x, i--))) { ; } } } else if (beliKralj.y == beliTop.y) { if (beliKralj.x < beliTop.x) { for (int i = 0; i <= beliKralj.x; listaNedozvoljenihPoteza.Add(new Potez(i++, beliKralj.y))) { ; } } else { for (int i = 7; i >= beliKralj.x; listaNedozvoljenihPoteza.Add(new Potez(i--, beliKralj.y))) { ; } } } break; } //iz liste mogucih poteza brise sve nedozvoljene poteze //u klasi potez funkcije Equals i GetHashCode su override-ovane da bi Except mogao da poredi poteze listaZaVracanje = listaZaVracanje.Except(listaNedozvoljenihPoteza).ToList(); return(listaZaVracanje); }