コード例 #1
0
ファイル: Dodaj.cs プロジェクト: PavleCvetkovic/AI-CoeusChess
        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();
        }
コード例 #2
0
        /// <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;
        }
コード例 #3
0
ファイル: Potez.cs プロジェクト: PavleCvetkovic/AI-CoeusChess
 /// <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);
 }
コード例 #4
0
        /// <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);
        }
コード例 #5
0
        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++;
        }
コード例 #6
0
        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!");
                }
            }
        }
コード例 #7
0
ファイル: Potez.cs プロジェクト: PavleCvetkovic/AI-CoeusChess
 public Potez(Potez p)
 {
     this.x = p.x;
     y      = p.y;
     Value  = p.Value;
 }
コード例 #8
0
        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);
            }
        }
コード例 #9
0
        /// <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);
        }