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; } } } }
public RuchDrzewo(Bierka b, Point ruch, int wartosc, bool bicie) { this.czyBicie = bicie; this.bierka = b; this.ile = wartosc; this.punkt = ruch; }
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); }
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(); } }
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); }
// 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; }
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); } } }
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); }
// 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; } }
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(); } }
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); }
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); }
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); }
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; }
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(); }