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 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); }