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 RuchDrzewo(Bierka b, Point ruch, int wartosc, bool bicie)
 {
     this.czyBicie = bicie;
     this.bierka = b;
     this.ile = wartosc;
     this.punkt = ruch;
 }
Example #3
0
        public bool przesun(int x, int y, bool pgn)
        {
            bool ret = false;

            if (this.mozliweRuchy.Contains(new Point(x, y)))
            {
                //if (this.kolor == Enums.Kolor_pionków.Biale && Gracz_Czlowiek.szach && this.GetType() != typeof(Krol))
                //{
                //    MessageBox.Show("Jest szach. Należy ruszyć się królem.");
                //    return false;
                //}


                this.pozycjaX = x;
                this.pozycjaY = y;
                ret           = true;

                // funkcja podzielona na dwie, ponieważ ta sama funkcja uzywana jest
                // do symulowania zachowania gracza i do przestawiania bierek przez mechanizm sztucznej inteligencji
                // a gdy algorytm coś oblicza, to nie chcemy sumować liczby wykonanych ruchów. chcemy
                // jedynie zmieniać współrzędne bierek
                if (pgn)
                {
                    this.generujMozliweRuchy(Gra.bierkiBiale, Gra.bierkiCzarne);
                    this.wyczyscMozliweRuchyZeSmieci();
                    this.bylRuch = true;

                    string numer = string.Empty;
                    Gra.ileRuchow++;
                    int ktoryNumer = Gra.ileRuchow / 2;
                    ktoryNumer++;
                    if (Gra.ileRuchow % 2 == 1)
                    {
                        numer = " " + ktoryNumer + ". ";
                    }
                    else
                    {
                        numer = " ";
                    }
                    Gra.pgnString += numer + this.litera + Gra.tlumaczNazwePolaPGN(x, y).ToLower().Trim();



                    Gra.ustawSzach(Gra.bierkiBiale, Gra.bierkiCzarne);
                    if (Gracz_Czlowiek.szach)
                    {
                        MessageBox.Show("Zaszachowano gracza");
                        Bierka.wygenerujMozliweRuchyKrola();
                    }
                    if (Gracz_Komputer.szach)
                    {
                        MessageBox.Show("Zaszachowano komputer");
                        Bierka.wygenerujMozliweRuchyKrola();
                    }
                }
            }

            return(ret);
        }
Example #4
0
        static public void roszada(Bierka wieza, Bierka krol, Enums.Roszada typRoszady)
        {
            int    pozycjaXKrola = 0;     // docelowa pozycja krola
            int    pozycjaXWiezy = 0;     // docelowa pozycja wieży
            string PGN           = "0-0"; // dla krotkiej roszady

            if (typRoszady == Enums.Roszada.Dluga)
            {
                pozycjaXKrola = 2;
                pozycjaXWiezy = 3;
                PGN          += "-0";
            }
            else
            {
                pozycjaXKrola = 6;
                pozycjaXWiezy = 5;
            }

            // pozycje Y się nie zmieniają.
            wieza.pozycjaX = pozycjaXWiezy;
            krol.pozycjaX  = pozycjaXKrola;

            // wygenerowanie możliwych ruchów dla biurerk, które biorą udział w roszadzie
            wieza.generujMozliweRuchy(Gra.bierkiBiale, Gra.bierkiCzarne);
            wieza.wyczyscMozliweRuchyZeSmieci();
            wieza.bylRuch = true;
            krol.generujMozliweRuchy(Gra.bierkiBiale, Gra.bierkiCzarne);
            krol.wyczyscMozliweRuchyZeSmieci();
            krol.bylRuch = true;

            string numer = string.Empty;

            Gra.ileRuchow++;
            int ktoryNumer = Gra.ileRuchow / 2;

            ktoryNumer++;
            if (Gra.ileRuchow % 2 == 1)
            {
                numer = " " + ktoryNumer + ". ";
            }
            else
            {
                numer = " ";
            }
            Gra.pgnString += numer + PGN;


            Gra.ustawSzach(Gra.bierkiBiale, Gra.bierkiCzarne);
            if (Gracz_Czlowiek.szach)
            {
                MessageBox.Show("Zaszachowano gracza");
                Bierka.wygenerujMozliweRuchyKrola();
            }
            if (Gracz_Komputer.szach)
            {
                MessageBox.Show("Zaszachowano komputer");
                Bierka.wygenerujMozliweRuchyKrola();
            }
        }
Example #5
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 #6
0
        // Paweł Potera & Krzysztof Sakowicz
        static public int getPunktacjaListyBierek(List <Bierka> lista, List <Bierka> biale, List <Bierka> czarne)
        {
            int ret = 0;

            foreach (Bierka b in lista)// Paweł Potera & Krzysztof Sakowicz
            {
                ret += b.punkty;

                foreach (Point p in b.mozliweBicia)
                {
                    Bierka b1 = getBierkaByPos(p.X, p.Y, biale, czarne);
                    // dodatkowe, w zasadzie oba zbędne warunki - tak w razie czego :)
                    if (b1 != null && b1.kolor != b.kolor)
                    {
                        ret += b1.punkty;
                    }
                }
            }
            return(ret);
        }
        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;
        }
Example #8
0
        public void generujMozliweRuchy(List <Bierka> biale, List <Bierka> czarne)
        {
            this.mozliweRuchy.Clear();
            this.mozliweBicia.Clear();

            if (this.kierunkiRuchu.Contains(Enums.KierunekRuchu.Gora))
            {
                if (this.kolor == Enums.Kolor_pionków.Czarne)
                {
                    for (int i = 1; i <= zasieg; i++)
                    {
                        if (getBierkaByPos(this.pozycjaX, this.pozycjaY + i, biale, czarne) == null)
                        {
                            if (this.pozycjaY + i <= 7)
                            {
                                this.mozliweRuchy.Add(new Point(this.pozycjaX, this.pozycjaY + i));
                            }
                        }
                        else
                        {
                            if (getBierkaByPos(this.pozycjaX, this.pozycjaY + i, biale, czarne).kolor == Enums.Kolor_pionków.Biale)
                            {
                                this.mozliweBicia.Add(new Point(this.pozycjaX, this.pozycjaY + i));
                            }
                            break;
                        }
                    }
                }
                else
                {
                    for (int i = 1; i <= zasieg; i++)
                    {
                        if (getBierkaByPos(this.pozycjaX, this.pozycjaY - i, biale, czarne) == null)
                        {
                            if (this.pozycjaY - i >= 0)
                            {
                                this.mozliweRuchy.Add(new Point(this.pozycjaX, this.pozycjaY - i));
                            }
                        }
                        else
                        {
                            if (getBierkaByPos(this.pozycjaX, this.pozycjaY - i, biale, czarne).kolor == Enums.Kolor_pionków.Czarne)
                            {
                                this.mozliweBicia.Add(new Point(this.pozycjaX, this.pozycjaY - i));
                            }
                            break;
                        }
                    }
                }
            }



            if (this.kierunkiRuchu.Contains(Enums.KierunekRuchu.Dol))
            {
                if (this.kolor == Enums.Kolor_pionków.Czarne)
                {
                    for (int i = 1; i <= zasieg; i++)
                    {
                        if (getBierkaByPos(this.pozycjaX, this.pozycjaY - i, biale, czarne) == null)
                        {
                            if (this.pozycjaY - i > 0)
                            {
                                this.mozliweRuchy.Add(new Point(this.pozycjaX, this.pozycjaY - i));
                            }
                        }
                        else
                        {
                            if (getBierkaByPos(this.pozycjaX, this.pozycjaY - i, biale, czarne).kolor == Enums.Kolor_pionków.Biale)
                            {
                                this.mozliweBicia.Add(new Point(this.pozycjaX, this.pozycjaY - i));
                            }
                            break;
                        }
                    }
                }
                else
                {
                    for (int i = 1; i <= zasieg; i++)
                    {
                        if (getBierkaByPos(this.pozycjaX, this.pozycjaY + i, biale, czarne) == null)
                        {
                            if (this.pozycjaY + i <= 7)
                            {
                                this.mozliweRuchy.Add(new Point(this.pozycjaX, this.pozycjaY + i));
                            }
                        }
                        else
                        {
                            if (getBierkaByPos(this.pozycjaX, this.pozycjaY + i, biale, czarne).kolor == Enums.Kolor_pionków.Czarne)
                            {
                                this.mozliweBicia.Add(new Point(this.pozycjaX, this.pozycjaY + i));
                            }
                            break;
                        }
                    }
                }
            }

            if (this.kierunkiRuchu.Contains(Enums.KierunekRuchu.ProstoSkos))
            {
                Point p1 = new Point(this.pozycjaX - 1, this.pozycjaY - 2);
                Point p2 = new Point(this.pozycjaX + 1, this.pozycjaY - 2);
                Point p3 = new Point(this.pozycjaX - 2, this.pozycjaY - 1);
                Point p4 = new Point(this.pozycjaX - 2, this.pozycjaY + 1);
                Point p5 = new Point(this.pozycjaX - 1, this.pozycjaY + 2);
                Point p6 = new Point(this.pozycjaX + 1, this.pozycjaY + 2);
                Point p7 = new Point(this.pozycjaX + 2, this.pozycjaY - 1);
                Point p8 = new Point(this.pozycjaX + 2, this.pozycjaY + 1);

                if (getBierkaByPos(p1.X, p1.Y, biale, czarne) == null)
                {
                    this.mozliweRuchy.Add(p1);
                }
                if (getBierkaByPos(p2.X, p2.Y, biale, czarne) == null)
                {
                    this.mozliweRuchy.Add(p2);
                }
                if (getBierkaByPos(p3.X, p3.Y, biale, czarne) == null)
                {
                    this.mozliweRuchy.Add(p3);
                }
                if (getBierkaByPos(p4.X, p4.Y, biale, czarne) == null)
                {
                    this.mozliweRuchy.Add(p4);
                }
                if (getBierkaByPos(p5.X, p5.Y, biale, czarne) == null)
                {
                    this.mozliweRuchy.Add(p5);
                }
                if (getBierkaByPos(p6.X, p6.Y, biale, czarne) == null)
                {
                    this.mozliweRuchy.Add(p6);
                }
                if (getBierkaByPos(p7.X, p7.Y, biale, czarne) == null)
                {
                    this.mozliweRuchy.Add(p7);
                }
                if (getBierkaByPos(p8.X, p8.Y, biale, czarne) == null)
                {
                    this.mozliweRuchy.Add(p8);
                }

                if (getBierkaByPos(p1.X, p1.Y, biale, czarne) != null && getBierkaByPos(p1.X, p1.Y, biale, czarne).kolor != this.kolor)
                {
                    this.mozliweBicia.Add(p1);
                }

                if (getBierkaByPos(p2.X, p2.Y, biale, czarne) != null && getBierkaByPos(p2.X, p2.Y, biale, czarne).kolor != this.kolor)
                {
                    this.mozliweBicia.Add(p2);
                }

                if (getBierkaByPos(p3.X, p3.Y, biale, czarne) != null && getBierkaByPos(p3.X, p3.Y, biale, czarne).kolor != this.kolor)
                {
                    this.mozliweBicia.Add(p3);
                }

                if (getBierkaByPos(p4.X, p4.Y, biale, czarne) != null && getBierkaByPos(p4.X, p4.Y, biale, czarne).kolor != this.kolor)
                {
                    this.mozliweBicia.Add(p4);
                }

                if (getBierkaByPos(p5.X, p5.Y, biale, czarne) != null && getBierkaByPos(p5.X, p5.Y, biale, czarne).kolor != this.kolor)
                {
                    this.mozliweBicia.Add(p5);
                }

                if (getBierkaByPos(p6.X, p6.Y, biale, czarne) != null && getBierkaByPos(p6.X, p6.Y, biale, czarne).kolor != this.kolor)
                {
                    this.mozliweBicia.Add(p6);
                }

                if (getBierkaByPos(p7.X, p7.Y, biale, czarne) != null && getBierkaByPos(p7.X, p7.Y, biale, czarne).kolor != this.kolor)
                {
                    this.mozliweBicia.Add(p7);
                }

                if (getBierkaByPos(p8.X, p8.Y, biale, czarne) != null && getBierkaByPos(p8.X, p8.Y, biale, czarne).kolor != this.kolor)
                {
                    this.mozliweBicia.Add(p8);
                }
            }


            if (this.kierunkiRuchu.Contains(Enums.KierunekRuchu.Skos))
            {
                // ruch w jedna strone
                for (int i = this.pozycjaX - 1; i <= zasieg && i >= 0 && i <= 7; i--)
                {
                    if (getBierkaByPos(i, this.pozycjaY - (this.pozycjaX - i), biale, czarne) == null)
                    {
                        this.mozliweRuchy.Add(new Point(i, this.pozycjaY - (this.pozycjaX - i)));
                    }
                    else
                    {
                        if (getBierkaByPos(i, this.pozycjaY - (this.pozycjaX - i), biale, czarne).kolor != this.kolor)
                        {
                            this.mozliweBicia.Add(new Point(i, this.pozycjaY - (this.pozycjaX - i)));
                        }
                        break;
                    }
                }

                // w druga...
                for (int i = this.pozycjaX + 1; i <= zasieg && i >= 0 && i <= 7; i++)
                {
                    if (getBierkaByPos(i, this.pozycjaY + (this.pozycjaX - i), biale, czarne) == null)
                    {
                        this.mozliweRuchy.Add(new Point(i, this.pozycjaY + (this.pozycjaX - i)));
                    }
                    else
                    {
                        if (getBierkaByPos(i, this.pozycjaY + (this.pozycjaX - i), biale, czarne).kolor != this.kolor)
                        {
                            this.mozliweBicia.Add(new Point(i, this.pozycjaY + (this.pozycjaX - i)));
                        }
                        break;
                    }
                }


                // ruch w jedna strone
                for (int i = this.pozycjaX - 1; i <= zasieg && i >= 0 && i <= 7; i--)
                {
                    if (getBierkaByPos(i, this.pozycjaY + (this.pozycjaX - i), biale, czarne) == null)
                    {
                        this.mozliweRuchy.Add(new Point(i, this.pozycjaY + (this.pozycjaX - i)));
                    }
                    else
                    {
                        if (getBierkaByPos(i, this.pozycjaY + (this.pozycjaX - i), biale, czarne).kolor != this.kolor)
                        {
                            this.mozliweBicia.Add(new Point(i, this.pozycjaY + (this.pozycjaX - i)));
                        }
                        break;
                    }
                }

                // w druga...
                for (int i = this.pozycjaX + 1; i <= zasieg && i >= 0 && i <= 7; i++)
                {
                    if (getBierkaByPos(i, this.pozycjaY - (this.pozycjaX - i), biale, czarne) == null)
                    {
                        this.mozliweRuchy.Add(new Point(i, this.pozycjaY - (this.pozycjaX - i)));
                    }
                    else
                    {
                        if (getBierkaByPos(i, this.pozycjaY - (this.pozycjaX - i), biale, czarne).kolor != this.kolor)
                        {
                            this.mozliweBicia.Add(new Point(i, this.pozycjaY - (this.pozycjaX - i)));
                        }
                        break;
                    }
                }
            }


            if (this.kierunkiRuchu.Contains(Enums.KierunekRuchu.Bok))
            {
                // ruch w jedna strone
                for (int i = this.pozycjaX - 1; i <= zasieg && i >= 0 && i <= 7; i--)
                {
                    if (getBierkaByPos(i, this.pozycjaY, biale, czarne) == null)
                    {
                        this.mozliweRuchy.Add(new Point(i, this.pozycjaY));
                    }
                    else
                    {
                        if (getBierkaByPos(i, this.pozycjaY, biale, czarne).kolor != this.kolor)
                        {
                            this.mozliweBicia.Add(new Point(i, this.pozycjaY));
                        }
                        break;
                    }
                }

                // w druga...
                for (int i = this.pozycjaX + 1; i <= zasieg && i >= 0 && i <= 7; i++)
                {
                    if (getBierkaByPos(i, this.pozycjaY, biale, czarne) == null)
                    {
                        this.mozliweRuchy.Add(new Point(i, this.pozycjaY));
                    }
                    else
                    {
                        if (getBierkaByPos(i, this.pozycjaY, biale, czarne).kolor != this.kolor)
                        {
                            this.mozliweBicia.Add(new Point(i, this.pozycjaY));
                        }
                        break;
                    }
                }
            }


            if (this.GetType() == typeof(Pionek))    // pion jest nietypowy i musi byc obsluzony oddzielnie
            {
                this.mozliweBicia.Clear();
                Point p1;
                Point p2;


                if (this.kolor == Enums.Kolor_pionków.Biale)
                {
                    p1 = new Point(this.pozycjaX - 1, this.pozycjaY - 1);
                    p2 = new Point(this.pozycjaX + 1, this.pozycjaY - 1);
                }
                else
                {
                    p1 = new Point(this.pozycjaX - 1, this.pozycjaY + 1);
                    p2 = new Point(this.pozycjaX + 1, this.pozycjaY + 1);
                }
                if (getBierkaByPos(p1.X, p1.Y, biale, czarne) != null && getBierkaByPos(p1.X, p1.Y, biale, czarne).kolor != this.kolor)
                {
                    this.mozliweBicia.Add(p1);
                }

                if (getBierkaByPos(p2.X, p2.Y, biale, czarne) != null && getBierkaByPos(p2.X, p2.Y, biale, czarne).kolor != this.kolor)
                {
                    this.mozliweBicia.Add(p2);
                }
            }


            if (this.GetType() == typeof(Krol))    // Krol też zachowuje się inaczej niż inne piony, dlatego jest traktowany inaczej
            {
                this.mozliweBicia.Clear();
                this.mozliweRuchy.Clear();
                Point p1, p2, p3, p4, p5, p6, p7, p8;

                p1 = new Point(this.pozycjaX - 1, this.pozycjaY);
                p2 = new Point(this.pozycjaX - 1, this.pozycjaY + 1);
                p3 = new Point(this.pozycjaX - 1, this.pozycjaY - 1);
                p4 = new Point(this.pozycjaX + 1, this.pozycjaY);
                p5 = new Point(this.pozycjaX + 1, this.pozycjaY + 1);
                p6 = new Point(this.pozycjaX + 1, this.pozycjaY - 1);
                p7 = new Point(this.pozycjaX, this.pozycjaY + 1);
                p8 = new Point(this.pozycjaX, this.pozycjaY - 1);

                // sposób na dodanie większej ilościo ręcznie stworzonych obiektów w jednej linii
                this.mozliweRuchy.AddRange(new Point[] { p1, p2, p3, p4, p5, p6, p7, p8 });


                List <Point> doUsuniecia = new List <Point>();

                foreach (Point p in this.mozliweRuchy)
                {
                    Bierka b = getBierkaByPos(p.X, p.Y, biale, czarne);
                    if (b != null)
                    {
                        // jeżeli jakaś bierka zajmuje pole na liście ruchów, to musimy usunąć ten ruch
                        doUsuniecia.Add(p);
                        // za to jeżeli ma inny kolor, to dodajemy to do bić.
                        if (b.kolor != this.kolor)
                        {
                            this.mozliweBicia.Add(p);
                        }
                    }
                }

                // taki zabieg, bo nie można usuwać obiektów z listy w momencie, kiedy po tej liście idzie pętla foreach
                // logiczne, ale potrafi zaskoczyć :)
                foreach (Point p in doUsuniecia)
                {
                    this.mozliweRuchy.Remove(p);
                }
            }
        }
Example #9
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);
        }
Example #10
0
 // ustawianie bierki, czyli narysowanie odpowiedniego obrazka na szachownicy (dokładniej to na panelu)
 private void ustawBierke(Bierka b)
 {
     Panel p = tableLayoutPanel1.GetControlFromPosition(b.pozycjaX, b.pozycjaY) as Panel;
     if (p != null)
     {
         p.BackgroundImage = b.grafika;
     }
 }
Example #11
0
        public static void roszada(Bierka wieza, Bierka krol, Enums.Roszada typRoszady)
        {
            int pozycjaXKrola = 0;  // docelowa pozycja krola
            int pozycjaXWiezy = 0;   // docelowa pozycja wieży
            string PGN = "0-0";   // dla krotkiej roszady

            if (typRoszady == Enums.Roszada.Dluga)
            {
                pozycjaXKrola = 2;
                pozycjaXWiezy = 3;
                PGN += "-0";
            }
            else
            {
                pozycjaXKrola = 6;
                pozycjaXWiezy = 5;
            }

            // pozycje Y się nie zmieniają.
            wieza.pozycjaX = pozycjaXWiezy;
            krol.pozycjaX = pozycjaXKrola;

            // wygenerowanie możliwych ruchów dla biurerk, które biorą udział w roszadzie
            wieza.generujMozliweRuchy(Gra.bierkiBiale, Gra.bierkiCzarne);
            wieza.wyczyscMozliweRuchyZeSmieci();
            wieza.bylRuch = true;
            krol.generujMozliweRuchy(Gra.bierkiBiale, Gra.bierkiCzarne);
            krol.wyczyscMozliweRuchyZeSmieci();
            krol.bylRuch = true;

            string numer = string.Empty;
            Gra.ileRuchow++;
            int ktoryNumer = Gra.ileRuchow / 2;
            ktoryNumer++;
            if (Gra.ileRuchow % 2 == 1) numer = " " + ktoryNumer + ". ";
            else numer = " ";
            Gra.pgnString += numer + PGN;

            Gra.ustawSzach(Gra.bierkiBiale, Gra.bierkiCzarne);
            if (Gracz_Czlowiek.szach)
            {
                MessageBox.Show("Zaszachowano gracza");
                Bierka.wygenerujMozliweRuchyKrola();
            }
            if (Gracz_Komputer.szach)
            {
                MessageBox.Show("Zaszachowano komputer");
                Bierka.wygenerujMozliweRuchyKrola();
            }
        }
Example #12
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;
        }
Example #13
0
        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 #14
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);
        }
Example #15
0
        static public List <Enums.Roszada> zwrocDostepneRoszady()
        {
            List <Enums.Roszada> lista     = new List <Enums.Roszada>();
            List <Bierka>        listaWiez = new List <Bierka>();
            bool czyRuchKrola = false;
            bool lewa         = false;
            bool prawa        = false;

            foreach (Bierka b in Gra.bierkiBiale)
            {
                // jeżeli ruszyl sie krol, to na pewno nie można zrobić roszady
                if (b.GetType() == typeof(Krol))
                {
                    if (b.bylRuch)
                    {
                        czyRuchKrola = true;
                    }
                }
            }
            if (czyRuchKrola)
            {
                return(null);
            }
            else
            {
                foreach (Bierka b in Gra.bierkiBiale)
                {
                    // jeżeli ruszyl sie krol, to na pewno nie można zrobić roszady
                    if (b.GetType() == typeof(Wieza))
                    {
                        if (!b.bylRuch)
                        {
                            listaWiez.Add(b);
                        }
                    }
                }
            }


            foreach (Bierka wie in listaWiez)
            {
                if (wie.pozycjaX == 0)
                {
                    lewa = true;
                }
                else if (wie.pozycjaY == 7)
                {
                    prawa = true;
                }
            }



            // bierki przeszkadzajace w duzej roszadzie
            Bierka b1 = getBierkaByPos(1, 7, Gra.bierkiBiale, Gra.bierkiCzarne);
            Bierka b2 = getBierkaByPos(2, 7, Gra.bierkiBiale, Gra.bierkiCzarne);
            Bierka b3 = getBierkaByPos(3, 7, Gra.bierkiBiale, Gra.bierkiCzarne);

            // bierki przeszkadzajace w malej roszadzie
            Bierka b4 = getBierkaByPos(5, 7, Gra.bierkiBiale, Gra.bierkiCzarne);
            Bierka b5 = getBierkaByPos(6, 7, Gra.bierkiBiale, Gra.bierkiCzarne);


            if (b1 == null && b2 == null && b3 == null && lewa)
            {
                // mozna zrobic dluga roszade
                lista.Add(Enums.Roszada.Dluga);
            }

            if (b4 == null && b5 == null && prawa)
            {
                // mozna zrobic krotka roszade
                lista.Add(Enums.Roszada.Krotka);
            }

            return(lista);
        }
Example #16
0
        public static 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 #17
0
        private void panel_Click(object sender, EventArgs e)
        {
            if (Gra.kolejka == Enums.czyjaKolej.Osoba)
            {
                TableLayoutPanelCellPosition pos = Tools.GetCellPosotion(tableLayoutPanel1);
                Bierka b = Bierka.getBierkaByPos(pos.Column, pos.Row, Gra.bierkiBiale, Gra.bierkiCzarne);

                if (wybrana == null && b != null && b.kolor == Enums.Kolor_pionków.Czarne) return;

                if (wybrana != null && b == null)
                {
                    if (!wybrana.przesun(pos.Column, pos.Row, true))
                    {
                        MessageBox.Show("ruch niedozwolony");
                    }
                    else
                    {
                        WyczyscPanele();
                        foreach (Bierka bi in Gra.bierkiBiale.Union(Gra.bierkiCzarne))
                        {
                            ustawBierke(bi);
                        }
                        Gra.kolejka = Enums.czyjaKolej.Komputer;
                        odswiezLabelKolejka();
                        Bierka.przeliczWszystieRuchy();

                        wykonajRuchPC();

                        WyczyscPanele();
                        // Bierka.przeliczWszystieRuchy();  // moze niepotrzebne
                        foreach (Bierka bi in Gra.bierkiBiale.Union(Gra.bierkiCzarne))
                        {
                            ustawBierke(bi);
                        }
                        odswiezLabelKolejka();
                    }
                }
                else if (wybrana != null && b != null && wybrana.kolor != b.kolor)   // bicie
                {
                    if (!wybrana.zbij(b))
                    {
                        MessageBox.Show("bicie niedozwolone");
                    }
                    else
                    {
                        WyczyscPanele();
                        foreach (Bierka bi in Gra.bierkiBiale.Union(Gra.bierkiCzarne))
                        {
                            ustawBierke(bi);
                        }
                        Gra.kolejka = Enums.czyjaKolej.Komputer;
                        odswiezLabelKolejka();
                        Bierka.przeliczWszystieRuchy();

                        wykonajRuchPC();
                        WyczyscPanele();
                        Bierka.przeliczWszystieRuchy();  // moze niepotrzebne
                        foreach (Bierka bi in Gra.bierkiBiale.Union(Gra.bierkiCzarne))
                        {
                            ustawBierke(bi);
                        }
                        odswiezLabelKolejka();
                    }
                }
                else wybrana = b;

                if (b == null)
                    label3.Text = "Puste pole " + pos.Column + " " + pos.Row;
                else
                {
                    label3.Text = b.ToString() + "  kolor: " + b.kolor + "(X,Y)=(" + b.pozycjaX + "," + b.pozycjaY + ")";
                    //b.generujMozliweRuchy();
                    Bierka.przeliczWszystieRuchy();
                    label4.Text = "możliwe ruchy: " + b.mozliweRuchy.Count() + Environment.NewLine + "możliwe bicia: " + b.mozliweBicia.Count();
                }
            }
            txtPgn.Text = Gra.pgnString;
            sprawdzMozliwoscRoszady();
        }