Example #1
0
        public static void ustawSzach(List <Bierka> biale, List <Bierka> czarne)
        {
            Bierka.przeliczWszystieRuchy(biale, czarne);

            // sprawdzamy, czy komputer zaszachowa³ osobê
            foreach (Bierka bi in biale)
            {
                foreach (Point poi in bi.mozliweBicia)
                {
                    Bierka dozbicia = Bierka.getBierkaByPos(poi.X, poi.Y, biale, czarne);
                    if (dozbicia.GetType() == typeof(Krol))
                    {
                        Gracz_Komputer.szach = true;
                    }
                }
            }

            // czy osoba zaszachowa³a PC ?
            foreach (Bierka bi in czarne)
            {
                foreach (Point poi in bi.mozliweBicia)
                {
                    Bierka dozbicia = Bierka.getBierkaByPos(poi.X, poi.Y, biale, czarne);
                    if (dozbicia.GetType() == typeof(Krol))
                    {
                        Gracz_Czlowiek.szach = true;
                    }
                }
            }
        }
Example #2
0
        public static bool Zrob_RuchLosowy()
        {
            if (Gra.bierkiCzarne.Count == 0)
            {
                return(false);              //je¿eli komputer nie ma bierek to nie wykona ruchu losowego
            }
            if (Gracz_Komputer.szach)       //najpierw sprawdzamy czy zaistnia³ szach - jest on obs³ugiwany priorytetowo przed jakimkolwiek innym ruchem i gdy zaistnieje prubujemy przesuni¹æ króla
            {
                foreach (Bierka krol in Gra.bierkiCzarne)
                {
                    if (krol.GetType() == typeof(Krol))
                    {
                        krol.przesun(krol.mozliweRuchy[0].X, krol.mozliweRuchy[0].Y, true);
                        Gracz_Komputer.szach = false;
                    }
                }
            }
            //je¿eli nie zaistnia³ szach to szukamy mo¿liwoœci bicia

            Bierka bi = czyMoznaBic(Enums.Gracz.Komputer); //najpierw sprawdzamy czy bicie jest mo¿liwe

            if (bi != null)                                //je¿eli jest to bijemy
            {
                bi.zbij(Bierka.getBierkaByPos(bi.mozliweBicia[0].X, bi.mozliweBicia[0].Y, Gra.bierkiBiale, Gra.bierkiCzarne));
                Gra.kolejka = Enums.czyjaKolej.Osoba;
                Bierka.przeliczWszystieRuchy();
            }
            else
            {                   //je¿eli nie to próbujemy wykonaæ ruch dla losowej bierki
                bool   udany = false;
                Random r     = new Random();
                while (!udany)  //ale oczywiœcie ten ruch musi byæ mo¿liwy
                {
                    Bierka b = Gra.bierkiCzarne[r.Next(Gra.bierkiCzarne.Count)];
                    if (b.mozliweRuchy.Count > 0)
                    {
                        int rnd = r.Next(b.mozliweRuchy.Count);
                        if (b.przesun(b.mozliweRuchy[rnd].X, b.mozliweRuchy[rnd].Y, true))
                        {
                            Gra.kolejka = Enums.czyjaKolej.Osoba;
                            Bierka.przeliczWszystieRuchy();
                            udany = true;
                            break;
                        }
                    }
                }
            }
            return(true);
        }
Example #3
0
        public bool zbij(Bierka ofiara)
        {
            bool ret = false;

            if (ofiara != null)
            {
                if (this.mozliweBicia.Contains(new Point(ofiara.pozycjaX, ofiara.pozycjaY)))
                {
                    //  if (ofiara.ToString() == "Krol") MessageBox.Show("Nie można bić króla");
                    //  else
                    //   {

                    int pozycjaTMPX = this.pozycjaX;

                    this.pozycjaX = ofiara.pozycjaX;
                    this.pozycjaY = ofiara.pozycjaY;
                    this.bylRuch  = true;
                    ret           = true;

                    if (ofiara.kolor == Enums.Kolor_pionków.Biale)
                    {
                        Gra.bierkiBiale.Remove(ofiara);
                    }
                    else
                    {
                        Gra.bierkiCzarne.Remove(ofiara);
                    }

                    this.generujMozliweRuchy(Gra.bierkiBiale, Gra.bierkiCzarne);
                    this.wyczyscMozliweRuchyZeSmieci();

                    Gra.ileRuchow++;
                    string numer  = string.Empty;
                    string pionek = string.Empty;

                    if (this.GetType() == typeof(Pionek))
                    {
                        pionek = Gra.tlumaczNazweKolumny(pozycjaTMPX).ToLower();
                    }

                    int ktoryNumer = Gra.ileRuchow / 2;
                    ktoryNumer++;
                    if (Gra.ileRuchow % 2 == 1)
                    {
                        numer = " " + ktoryNumer + ". ";
                    }
                    else
                    {
                        numer = " ";
                    }
                    Gra.pgnString += numer + pionek + this.litera + "x" + Gra.tlumaczNazwePolaPGN(ofiara.pozycjaX, ofiara.pozycjaY).ToLower().Trim();
                }
                // }
            }
            else
            {
                MessageBox.Show("coś się popsuło");
                Bierka.przeliczWszystieRuchy();
            }

            return(ret);
        }
        static public RuchDrzewo wykonajNajlepszyRuch(List <Bierka> listaBiale, List <Bierka> listaCzarne)
        {
            int    punktyMax   = 0;
            Bierka wybrana     = new Bierka();
            Point  wybranyRuch = new Point();
            bool   czyBicie    = false;

            //  List<Bierka> listaBiale = new List<Bierka>();
            //  listaBiale = Tools.klonujBierki(Gra.bierkiBiale);

            foreach (Bierka b in listaBiale)
            {
                List <Point> listaP = new List <Point>();
                listaP = Tools.klonujPointy(b.mozliweRuchy);

                List <Point> listaP1 = new List <Point>();
                listaP1 = Tools.klonujPointy(b.mozliweBicia);

                int x = b.pozycjaX;
                int y = b.pozycjaY;

                foreach (Point p in listaP.Union(listaP1))
                {
                    bool bicie = false;
                    // List<Bierka> listaczarne = new List<Bierka>();
                    // listaczarne = Tools.klonujBierki(Gra.bierkiCzarne);
                    Bierka zbita = null;
                    bicie = false;

                    if (b.mozliweBicia.Contains(p))
                    {
                        zbita = Bierka.getBierkaByPos(p.X, p.Y, listaBiale, listaCzarne);
                        listaCzarne.Remove(zbita);
                        bicie = true;
                    }
                    else
                    {
                        b.przesun(p.X, p.Y, false);
                    }

                    Bierka.przeliczWszystieRuchy(listaBiale, listaCzarne);

                    int wynikBiale  = Bierka.getPunktacjaListyBierek(listaBiale, listaBiale, listaCzarne);
                    int wynikCzarne = Bierka.getPunktacjaListyBierek(listaCzarne, listaBiale, listaCzarne);

                    int roznica = wynikBiale - wynikCzarne;

                    if (punktyMax < roznica)
                    {
                        punktyMax   = roznica;
                        wybrana     = b;
                        wybranyRuch = p;
                        czyBicie    = bicie;
                    }

                    // przywracam zbit¹ bierkê
                    if (zbita != null)
                    {
                        listaCzarne.Add(zbita);
                    }

                    // cofam bierkê
                    b.pozycjaX = x;
                    b.pozycjaY = y;
                    Bierka.przeliczWszystieRuchy(listaBiale, listaCzarne);
                }
            }

            string pozycjaWybranej = Gra.tlumaczNazwePolaPGN(wybrana.pozycjaX, wybrana.pozycjaY);
            string pozycjadocelowa = Gra.tlumaczNazwePolaPGN(wybranyRuch.X, wybranyRuch.Y);

            RuchDrzewo ruch = new RuchDrzewo(wybrana, wybranyRuch, punktyMax, czyBicie);


            return(ruch);
        }
Example #5
0
        public static RuchDrzewo obliczRuchAI(List <Bierka> GraBiale, List <Bierka> GraCzarne)
        {
            List <RuchDrzewo> listaRuchow          = new List <RuchDrzewo>();
            List <Bierka>     listaCzarneNieRuszac = new List <Bierka>();

            listaCzarneNieRuszac = Tools.klonujBierki(GraCzarne);

            foreach (Bierka b1 in listaCzarneNieRuszac)
            {
                List <Point> listaP = new List <Point>();
                listaP = Tools.klonujPointy(b1.mozliweRuchy);

                List <Point> listaP1 = new List <Point>();
                listaP1 = Tools.klonujPointy(b1.mozliweBicia);

                foreach (Point p1 in listaP.Union(listaP1))
                {
                    bool   biciePierwsze = false;
                    Bierka zbita         = new Bierka();

                    List <Bierka> listaBiale1 = new List <Bierka>();
                    listaBiale1 = Tools.klonujBierki(GraBiale);
                    List <Bierka> listaCzarne1 = new List <Bierka>();
                    listaCzarne1 = Tools.klonujBierki(GraCzarne);



                    int xPoprzednie = b1.pozycjaX;
                    int yPoprzednie = b1.pozycjaY;


                    if (b1.mozliweBicia.Contains(p1))
                    {
                        zbita = Bierka.getBierkaByPos(p1.X, p1.Y, listaBiale1, listaCzarne1);
                        listaBiale1.Remove(zbita);
                        biciePierwsze = true;
                    }
                    else
                    {
                        b1.przesun(p1.X, p1.Y, false);
                    }


                    Bierka.przeliczWszystieRuchy(listaBiale1, listaCzarne1);
                    RuchDrzewo rd = Gracz_Czlowiek.wykonajNajlepszyRuch(listaBiale1, listaCzarne1);
                    Bierka.przeliczWszystieRuchy(listaBiale1, listaCzarne1);



                    List <Bierka> listaBiale2 = new List <Bierka>();
                    listaBiale2 = Tools.klonujBierki(listaBiale1);
                    List <Bierka> listaCzarne2 = new List <Bierka>();
                    listaCzarne2 = Tools.klonujBierki(listaCzarne1);


                    foreach (Bierka b2 in listaCzarne2)
                    {
                        List <Point> listaP2 = new List <Point>();
                        listaP2 = Tools.klonujPointy(b2.mozliweRuchy);

                        List <Point> listaP3 = new List <Point>();
                        listaP3 = Tools.klonujPointy(b2.mozliweBicia);

                        foreach (Point p2 in listaP2.Union(listaP3))
                        {
                            bool bicie = false;
                            zbita = new Bierka();

                            int x = b2.pozycjaX;
                            int y = b2.pozycjaY;

                            if (b2.mozliweBicia.Contains(p2))
                            {
                                zbita = Bierka.getBierkaByPos(p2.X, p2.Y, listaBiale2, listaCzarne2);
                                listaBiale2.Remove(zbita);
                                bicie = true;
                            }
                            else
                            {
                                b2.przesun(p2.X, p2.Y, false);
                            }


                            Bierka.przeliczWszystieRuchy(listaBiale2, listaCzarne2);


                            List <Bierka> listaBialeOstatnia = new List <Bierka>();
                            listaBialeOstatnia = Tools.klonujBierki(listaBiale2);
                            List <Bierka> listaCzarneOstatnia = new List <Bierka>();
                            listaCzarneOstatnia = Tools.klonujBierki(listaCzarne2);


                            rd = Gracz_Czlowiek.wykonajNajlepszyRuch(listaBialeOstatnia, listaCzarneOstatnia);
                            Bierka.przeliczWszystieRuchy(listaBialeOstatnia, listaCzarneOstatnia);


                            int bialePkt  = Bierka.getPunktacjaListyBierek(listaBialeOstatnia, listaBialeOstatnia, listaCzarneOstatnia);
                            int czarnePkt = Bierka.getPunktacjaListyBierek(listaCzarneOstatnia, listaBialeOstatnia, listaCzarneOstatnia);

                            b1.pozycjaX = xPoprzednie;
                            b1.pozycjaY = yPoprzednie;
                            listaRuchow.Add(new RuchDrzewo(b1, p1, czarnePkt - bialePkt, biciePierwsze));


                            if (bicie)
                            {
                                listaBiale2.Add(zbita);
                            }
                            else
                            {
                                b2.pozycjaX = x;
                                b2.pozycjaY = y;
                            }
                        }
                    }
                }
            }

            int        max         = 0;
            RuchDrzewo wybranyRuch = new RuchDrzewo(); // = listaRuchow[0];   // gdy jest remis

            if (listaRuchow.Count > 0)
            {
                wybranyRuch = listaRuchow[0];                         // gdy remis punktowy
            }
            foreach (RuchDrzewo ruch in listaRuchow)
            {
                if (ruch.ile > max)
                {
                    max         = ruch.ile;
                    wybranyRuch = ruch;
                }
            }

            // jak wszystko skonczone to przejrzyj liste elementow i znajdŸ max.
            return(wybranyRuch);
        }