/// <summary> /// Sprawdza które pola szachuje dany pionek (to różni się od pól, na które może się ruszyć) /// </summary> /// <param name="pole">Pole piona</param> /// <param name="pomocnicza_szachownica">Szachownica sprawdzana</param> /// <returns>Pola które szachuje sprawdzany pionek</returns> public List <int> zobacz_szachowane(int pole, Szachownica pomocnicza_szachownica) { var kolumna_pionka = pole % 8; var gdzie_patrzec = bialy_gracz == 1 ? -1 : 1; List <int> zwrot = new List <int>(); if (kolumna_pionka != 7) { if (pomocnicza_szachownica.figura_na_polu(pole + gdzie_patrzec * 8 + 1) is null) { zwrot.Add(pole + gdzie_patrzec * 8 + 1); } else if (pomocnicza_szachownica.figura_na_polu(pole + gdzie_patrzec * 8 + 1).ktory_gracz() != this.bialy_gracz) { zwrot.Add(pole + gdzie_patrzec * 8 + 1); } } if (kolumna_pionka != 0) { if (pomocnicza_szachownica.figura_na_polu(pole + gdzie_patrzec * 8 - 1) is null) { zwrot.Add(pole + gdzie_patrzec * 8 - 1); } else if (pomocnicza_szachownica.figura_na_polu(pole + gdzie_patrzec * 8 - 1).ktory_gracz() != this.bialy_gracz) { zwrot.Add(pole + gdzie_patrzec * 8 - 1); } } return(zwrot); }
/// <summary> /// Funkcja pokazuje, na ktore pola moze ruszyc sie gracz </summary> /// <returns> Tablicę pól, na którą można się ruszyć </returns> public override List <int> zobacz_mozliwosci(int pole, Szachownica pomocnicza_szachownica) { var kolumna_pionka = pole % 8; var gdzie_patrzec = bialy_gracz == 1 ? -1 : 1; List <int> zwrot = new List <int>(); if (kolumna_pionka == 0) { if (!(pomocnicza_szachownica.figura_na_polu(pole + gdzie_patrzec * 8 - 1) is null)) { if (pomocnicza_szachownica.figura_na_polu(pole + gdzie_patrzec * 8 - 1).ktory_gracz() != this.bialy_gracz) { zwrot.Add(pole + gdzie_patrzec * 8 + 1); } } } if (kolumna_pionka == 7) { if (!(pomocnicza_szachownica.figura_na_polu(pole + gdzie_patrzec * 8 - 1) is null)) { if (pomocnicza_szachownica.figura_na_polu(pole + gdzie_patrzec * 8 - 1).ktory_gracz() != this.bialy_gracz) { zwrot.Add(pole + gdzie_patrzec * 8 - 1); } } } if (pomocnicza_szachownica.figura_na_polu(pole + gdzie_patrzec * 8) is null) { zwrot.Add(pole + gdzie_patrzec * 8); if (!ruszono) { var gdzie_patrzec_temp = gdzie_patrzec * 2; if (pomocnicza_szachownica.figura_na_polu(pole + gdzie_patrzec_temp * 8) is null) { zwrot.Add(pole + gdzie_patrzec_temp * 8); } } } if (!(pomocnicza_szachownica.figura_na_polu(pole + gdzie_patrzec * 8 + 1) is null)) //sprawdza czy może wykonać bicie po skosie { if (pomocnicza_szachownica.figura_na_polu(pole + gdzie_patrzec * 8 + 1).ktory_gracz() != this.bialy_gracz) { zwrot.Add(pole + gdzie_patrzec * 8 + 1); } } if (!(pomocnicza_szachownica.figura_na_polu(pole + gdzie_patrzec * 8 - 1) is null)) { if (pomocnicza_szachownica.figura_na_polu(pole + gdzie_patrzec * 8 - 1).ktory_gracz() != this.bialy_gracz) { zwrot.Add(pole + gdzie_patrzec * 8 - 1); } } return(zwrot); }
/// <summary> /// Sprawdza czy ruch jest możliwy, tj czy ruch nie spowoduje szacha /// </summary> /// <param name="start">Skąd ma być ruch</param> /// <param name="koniec">Dokąd ma być ruch</param> /// <param name="inp_szachownica">Szachownica na której sprawdzamy możliwość</param> /// <returns>P jeśli można się ruszyć bez szacha, F wpp</returns> public bool ruch_mozliwy(int start, int koniec, Szachownica inp_szachownica) { int ktory_gracz = inp_szachownica.figura_na_polu(start).ktory_gracz(); inp_szachownica.wykonaj_ruch(start, koniec); inp_szachownica.aktualizuj_szachowanie(); if (inp_szachownica.czy_szach(ktory_gracz)) //jeśli po ruchu figury jest szach na przeciwnym królu, to wtedy nie można wykonać tego ruchu { return(false); } return(true); }
/// <summary> /// Sprawdza na które można się ruszyć (zgodnie z szachowymi zasadami) /// </summary> /// <param name="pole">Pole figury którą chcemy się ruszyć</param> /// <param name="inp_szachownica">Szachownica na której sprawdzamy</param> /// <returns>Pola, na które ruch nie spowoduje szacha</returns> public List <int> ruchy_bez_szacha(int pole, Szachownica inp_szachownica) { List <int> strzaly = inp_szachownica.figura_na_polu(pole).zobacz_mozliwosci(pole, inp_szachownica); List <int> zwrot = new List <int>(); foreach (int x in strzaly) { if (ruch_mozliwy(pole, x, new Szachownica(inp_szachownica))) { zwrot.Add(x); } } return(zwrot); }
/// <summary> /// Funkcja pokazuje, na ktore pola moze ruszyc sie gracz </summary> /// <returns> Tablicę pól, na którą można się ruszyć </returns> public override List <int> zobacz_mozliwosci(int pole, Szachownica szachownica) { Szachownica pomocnicza_szachownica = new Szachownica(szachownica); List <int> zwrot = new List <int>(); int kolumna = pole % 8; int wiersz = (pole - kolumna) / 8; if (wiersz + 2 <= 7 && kolumna - 1 >= 0) { if ((pomocnicza_szachownica.figura_na_polu((wiersz + 2) * 8 + kolumna - 1) is null)) { zwrot.Add((wiersz + 2) * 8 + kolumna - 1); } if (!(pomocnicza_szachownica.figura_na_polu((wiersz + 2) * 8 + kolumna - 1) is null)) { if (pomocnicza_szachownica.figura_na_polu((wiersz + 2) * 8 + kolumna - 1).ktory_gracz() != this.bialy_gracz) { zwrot.Add((wiersz + 2) * 8 + kolumna - 1); } } } if (wiersz + 1 <= 7 && kolumna - 2 >= 0) { if ((pomocnicza_szachownica.figura_na_polu((wiersz + 1) * 8 + kolumna - 2) is null)) { zwrot.Add((wiersz + 1) * 8 + kolumna - 2); } if (!(pomocnicza_szachownica.figura_na_polu((wiersz + 1) * 8 + kolumna - 2) is null)) { if (pomocnicza_szachownica.figura_na_polu((wiersz + 1) * 8 + kolumna - 2).ktory_gracz() != this.bialy_gracz) { zwrot.Add((wiersz + 1) * 8 + kolumna - 2); } } } if (wiersz - 2 >= 0 && kolumna - 1 >= 0) { if ((pomocnicza_szachownica.figura_na_polu((wiersz - 2) * 8 + kolumna - 1) is null)) { zwrot.Add((wiersz - 2) * 8 + kolumna - 1); } if (!(pomocnicza_szachownica.figura_na_polu((wiersz - 2) * 8 + kolumna - 1) is null)) { if (pomocnicza_szachownica.figura_na_polu((wiersz - 2) * 8 + kolumna - 1).ktory_gracz() != this.bialy_gracz) { zwrot.Add((wiersz - 2) * 8 + kolumna - 1); } } } if (wiersz - 1 >= 0 && kolumna - 2 >= 0) { if ((pomocnicza_szachownica.figura_na_polu((wiersz - 1) * 8 + kolumna - 2) is null)) { zwrot.Add((wiersz - 1) * 8 + kolumna - 2); } if (!(pomocnicza_szachownica.figura_na_polu((wiersz - 1) * 8 + kolumna - 2) is null)) { if (pomocnicza_szachownica.figura_na_polu((wiersz - 1) * 8 + kolumna - 2).ktory_gracz() != this.bialy_gracz) { zwrot.Add((wiersz - 1) * 8 + kolumna - 2); } } } if (wiersz + 2 <= 7 && kolumna + 1 <= 7) { if ((pomocnicza_szachownica.figura_na_polu((wiersz + 2) * 8 + kolumna + 1) is null)) { zwrot.Add((wiersz + 2) * 8 + kolumna + 1); } if (!(pomocnicza_szachownica.figura_na_polu((wiersz + 2) * 8 + kolumna + 1) is null)) { if (pomocnicza_szachownica.figura_na_polu((wiersz + 2) * 8 + kolumna + 1).ktory_gracz() != this.bialy_gracz) { zwrot.Add((wiersz + 2) * 8 + kolumna + 1); } } } if (wiersz + 1 <= 7 && kolumna + 2 <= 7) { if ((pomocnicza_szachownica.figura_na_polu((wiersz + 1) * 8 + kolumna + 2) is null)) { zwrot.Add((wiersz + 1) * 8 + kolumna + 2); } if (!(pomocnicza_szachownica.figura_na_polu((wiersz + 1) * 8 + kolumna + 2) is null)) { if (pomocnicza_szachownica.figura_na_polu((wiersz + 1) * 8 + kolumna + 2).ktory_gracz() != this.bialy_gracz) { zwrot.Add((wiersz + 1) * 8 + kolumna + 2); } } } if (wiersz - 2 >= 0 && kolumna + 1 <= 7) { if ((pomocnicza_szachownica.figura_na_polu((wiersz - 2) * 8 + kolumna + 1) is null)) { zwrot.Add((wiersz - 2) * 8 + kolumna + 1); } if (!(pomocnicza_szachownica.figura_na_polu((wiersz - 2) * 8 + kolumna + 1) is null)) { if (pomocnicza_szachownica.figura_na_polu((wiersz - 2) * 8 + kolumna + 1).ktory_gracz() != this.bialy_gracz) { zwrot.Add((wiersz - 2) * 8 + kolumna + 1); } } } if (wiersz - 1 >= 0 && kolumna + 2 <= 7) { if ((pomocnicza_szachownica.figura_na_polu((wiersz - 1) * 8 + kolumna + 2) is null)) { zwrot.Add((wiersz - 1) * 8 + kolumna + 2); } if (!(pomocnicza_szachownica.figura_na_polu((wiersz - 1) * 8 + kolumna + 2) is null)) { if (pomocnicza_szachownica.figura_na_polu((wiersz - 1) * 8 + kolumna + 2).ktory_gracz() != this.bialy_gracz) { zwrot.Add((wiersz - 1) * 8 + kolumna + 2); } } } return(zwrot); }
/// <summary> /// Funkcja pokazuje, na ktore pola moze ruszyc sie gracz </summary> /// <returns> Tablicę pól, na którą można się ruszyć </returns> public override List <int> zobacz_mozliwosci(int pole, Szachownica pomocnicza_szachownica) { List <int> zwrot = new List <int>(); int temp_kolumna = pole % 8; int temp_wiersz = (pole - temp_kolumna) / 8; for (int i = temp_wiersz + 1; i <= 7; i++) { if (pomocnicza_szachownica.figura_na_polu(i * 8 + temp_kolumna) is null) { zwrot.Add(i * 8 + temp_kolumna); } else if (pomocnicza_szachownica.figura_na_polu(i * 8 + temp_kolumna).ktory_gracz() != this.bialy_gracz) { zwrot.Add(i * 8 + temp_kolumna); break; } else if (pomocnicza_szachownica.figura_na_polu(i * 8 + temp_kolumna).ktory_gracz() == this.bialy_gracz) { break; } } for (int i = temp_wiersz - 1; i >= 0; i--) { if (pomocnicza_szachownica.figura_na_polu(i * 8 + temp_kolumna) is null) { zwrot.Add(i * 8 + temp_kolumna); } else if (pomocnicza_szachownica.figura_na_polu(i * 8 + temp_kolumna).ktory_gracz() != this.bialy_gracz) { zwrot.Add(i * 8 + temp_kolumna); break; } else if (pomocnicza_szachownica.figura_na_polu(i * 8 + temp_kolumna).ktory_gracz() == this.bialy_gracz) { break; } } for (int i = temp_kolumna - 1; i >= 0; i--) { if (pomocnicza_szachownica.figura_na_polu(temp_wiersz * 8 + i) is null) { zwrot.Add(temp_wiersz * 8 + i); } else if (pomocnicza_szachownica.figura_na_polu(temp_wiersz * 8 + i).ktory_gracz() != this.bialy_gracz) { zwrot.Add(temp_wiersz * 8 + i); break; } else if (pomocnicza_szachownica.figura_na_polu(temp_wiersz * 8 + i).ktory_gracz() == this.bialy_gracz) { break; } } for (int i = temp_kolumna + 1; i <= 7; i++) { if (pomocnicza_szachownica.figura_na_polu(temp_wiersz * 8 + i) is null) { zwrot.Add(temp_wiersz * 8 + i); } else if (pomocnicza_szachownica.figura_na_polu(temp_wiersz * 8 + i).ktory_gracz() != this.bialy_gracz) { zwrot.Add(temp_wiersz * 8 + i); break; } else if (pomocnicza_szachownica.figura_na_polu(temp_wiersz * 8 + i).ktory_gracz() == this.bialy_gracz) { break; } } return(zwrot); }
/// <summary> /// Funkcja aktualizuje w UI pozycje pionków -> przechodzi po tablicy i ustawia nowe pionki /// Wynajduje też i aktualizuje informacje gdzie znajdują się dane wieże (to jest niezbędne do wykonania roszady) /// </summary> private void aktualizuj_plansze() { List <int> biale_wieze = new List <int>(2); List <int> czarne_wieze = new List <int>(2); int pozycja_bialego_krola = 0; int pozycja_czarnego_krola = 0; for (int i = 0; i < 64; i++) { przyciski[i].BorderThickness = new Thickness(0); var brush = new ImageBrush(); //jeśli_gracz zasachowany to znaczy ze zaden gracz niezaszachowany ergo nie ma szacha brush.ImageSource = Convert(plansza.poleNaSzachownicy(i)); brush.Stretch = Stretch.Fill; przyciski[i].Background = brush; if (plansza.figura_na_polu(i) is Krol) { if (plansza.figura_na_polu(i).ktory_gracz() == 1) { pozycja_bialego_krola = i; } else { pozycja_czarnego_krola = i; } } if (plansza.figura_na_polu(i) is Wieza) { if (plansza.figura_na_polu(i).ktory_gracz() == 1) { biale_wieze.Add(i); } else { czarne_wieze.Add(i); } } } //aktualizacja pozycji wież dla białego króla if (biale_wieze.Count == 0) { ((Krol)plansza.figura_na_polu(pozycja_bialego_krola)).pozycja_pierwszej_wiezy = -1; } else if (biale_wieze.Count == 1) { ((Krol)plansza.figura_na_polu(pozycja_bialego_krola)).pozycja_pierwszej_wiezy = biale_wieze[0]; } else if (biale_wieze.Count == 2) { ((Krol)plansza.figura_na_polu(pozycja_bialego_krola)).pozycja_drugiej_wiezy = biale_wieze[1]; } else { ((Krol)plansza.figura_na_polu(pozycja_bialego_krola)).pozycja_drugiej_wiezy = -1; } //aktualizacja pozycji wież dla czarnego króla if (czarne_wieze.Count == 0) { ((Krol)plansza.figura_na_polu(pozycja_czarnego_krola)).pozycja_pierwszej_wiezy = -1; } else if (czarne_wieze.Count == 1) { ((Krol)plansza.figura_na_polu(pozycja_czarnego_krola)).pozycja_pierwszej_wiezy = czarne_wieze[0]; } else if (czarne_wieze.Count == 2) { ((Krol)plansza.figura_na_polu(pozycja_czarnego_krola)).pozycja_drugiej_wiezy = czarne_wieze[1]; } else { ((Krol)plansza.figura_na_polu(pozycja_czarnego_krola)).pozycja_drugiej_wiezy = -1; } }
/// <summary> /// Wszystkie możliwe pola na które może ruszyć się król (z wyłączeniem szachowania) /// </summary> /// <param name="pole">Pole króla</param> /// <param name="pomocnicza_szachownica">Szachownica na której sprawdzamy</param> /// <returns>Lista pól na które można się ruszyć</returns> public override List <int> zobacz_mozliwosci(int pole, Szachownica pomocnicza_szachownica) { List <int> zwrot = new List <int>(); void mozliwa_roszada(int temp_pole) { int temp_kolumna = temp_pole % 8; int temp_wiersz = (temp_pole - temp_kolumna) / 8; int dokad; for (int i = temp_kolumna - 1; i >= 0; i--) { dokad = temp_wiersz * 8 + i; if (pomocnicza_szachownica.figura_na_polu(dokad) is null) { continue; } if (pomocnicza_szachownica.figura_na_polu(dokad).ktory_gracz() == this.bialy_gracz && pomocnicza_szachownica.figura_na_polu(dokad) is Krol) { zwrot.Add(temp_pole); } break; } for (int i = temp_kolumna + 1; i <= 7; i++) { dokad = temp_wiersz * 8 + i; if (pomocnicza_szachownica.figura_na_polu(dokad) is null) { continue; } if (pomocnicza_szachownica.figura_na_polu(dokad).ktory_gracz() == this.bialy_gracz && pomocnicza_szachownica.figura_na_polu(dokad) is Krol) { zwrot.Add(temp_pole); } break; } } ///<summary> ///Funkcja, ktora sprawdza czy krol moze ruszyc sie na dane pole, zdecydowałem sie uzyc funkcji zeby poprawic czytelnosc kodu ///</summary> void pom_ruch_krola(int pom_wiersz, int kolumna_pom) { int dokad = pom_wiersz * 8 + kolumna_pom; if (kolumna_pom <= 7 && kolumna_pom >= 0 && pom_wiersz <= 7 && pom_wiersz >= 0) { if (pomocnicza_szachownica.figura_na_polu(dokad) is null) { zwrot.Add(dokad); } else { if (pomocnicza_szachownica.figura_na_polu(dokad).ktory_gracz() != this.bialy_gracz) { zwrot.Add(dokad); } } } } int kolumna = pole % 8; int wiersz = (pole - kolumna) / 8; pom_ruch_krola(wiersz + 1, kolumna + 1); pom_ruch_krola(wiersz + 1, kolumna); pom_ruch_krola(wiersz + 1, kolumna - 1); pom_ruch_krola(wiersz, kolumna + 1); pom_ruch_krola(wiersz, kolumna - 1); pom_ruch_krola(wiersz - 1, kolumna - 1); pom_ruch_krola(wiersz - 1, kolumna); pom_ruch_krola(wiersz - 1, kolumna + 1); if (!ruszono && !pomocnicza_szachownica.czy_szach(bialy_gracz)) { if (pozycja_pierwszej_wiezy != -1) { mozliwa_roszada(pozycja_pierwszej_wiezy); } if (pozycja_drugiej_wiezy != -1) { mozliwa_roszada(pozycja_drugiej_wiezy); } } return(zwrot); }
/// <summary> /// /// </summary> /// <param name="pole"></param> /// <param name="pomocnicza_szachownica"></param> /// <returns></returns> public override List <int> zobacz_mozliwosci(int pole, Szachownica pomocnicza_szachownica) { List <int> zwrot = new List <int>(); int temp_kolumna = pole % 8; int temp_wiersz = (pole - temp_kolumna) / 8; while (temp_wiersz > 0 && temp_wiersz <= 7 && temp_kolumna > 0 && temp_kolumna <= 7) { temp_kolumna--; temp_wiersz--; if (temp_wiersz * 8 + temp_kolumna < 0 || temp_wiersz * 8 + temp_kolumna > 63) { break; } if (pomocnicza_szachownica.figura_na_polu(temp_wiersz * 8 + temp_kolumna) is null) { zwrot.Add(temp_wiersz * 8 + temp_kolumna); } else if (pomocnicza_szachownica.figura_na_polu(temp_wiersz * 8 + temp_kolumna).ktory_gracz() != this.bialy_gracz) { zwrot.Add(temp_wiersz * 8 + temp_kolumna); break; } else if (pomocnicza_szachownica.figura_na_polu(temp_wiersz * 8 + temp_kolumna).ktory_gracz() == this.bialy_gracz) { break; } if (temp_wiersz == 0 || temp_wiersz == 7 || temp_kolumna == 0 || temp_kolumna == 7) { break; } } temp_kolumna = pole % 8; temp_wiersz = (pole - temp_kolumna) / 8; while (temp_wiersz >= 0 && temp_wiersz < 7 && temp_kolumna >= 0 && temp_kolumna < 7) { temp_kolumna++; temp_wiersz++; if (temp_wiersz * 8 + temp_kolumna < 0 || temp_wiersz * 8 + temp_kolumna > 63) { break; } if (pomocnicza_szachownica.figura_na_polu(temp_wiersz * 8 + temp_kolumna) is null) { zwrot.Add(temp_wiersz * 8 + temp_kolumna); } else if (pomocnicza_szachownica.figura_na_polu(temp_wiersz * 8 + temp_kolumna).ktory_gracz() != this.bialy_gracz) { zwrot.Add(temp_wiersz * 8 + temp_kolumna); break; } else if (pomocnicza_szachownica.figura_na_polu(temp_wiersz * 8 + temp_kolumna).ktory_gracz() == this.bialy_gracz) { break; } if (temp_wiersz == 0 || temp_wiersz == 7 || temp_kolumna == 0 || temp_kolumna == 7) { break; } } temp_kolumna = pole % 8; temp_wiersz = (pole - temp_kolumna) / 8; while (temp_wiersz >= 0 && temp_wiersz < 7 && temp_kolumna > 0 && temp_kolumna <= 7) { temp_kolumna--; temp_wiersz++; if (temp_wiersz * 8 + temp_kolumna < 0 || temp_wiersz * 8 + temp_kolumna > 63) { break; } if (pomocnicza_szachownica.figura_na_polu(temp_wiersz * 8 + temp_kolumna) is null) { zwrot.Add(temp_wiersz * 8 + temp_kolumna); } else if (pomocnicza_szachownica.figura_na_polu(temp_wiersz * 8 + temp_kolumna).ktory_gracz() != this.bialy_gracz) { zwrot.Add(temp_wiersz * 8 + temp_kolumna); break; } else if (pomocnicza_szachownica.figura_na_polu(temp_wiersz * 8 + temp_kolumna).ktory_gracz() == this.bialy_gracz) { break; } if (temp_wiersz == 0 || temp_wiersz == 7 || temp_kolumna == 0 || temp_kolumna == 7) { break; } } temp_kolumna = pole % 8; temp_wiersz = (pole - temp_kolumna) / 8; while (temp_wiersz > 0 && temp_wiersz <= 7 && temp_kolumna >= 0 && temp_kolumna < 7) { temp_kolumna++; temp_wiersz--; if (temp_wiersz * 8 + temp_kolumna < 0 || temp_wiersz * 8 + temp_kolumna > 63) { break; } if (pomocnicza_szachownica.figura_na_polu(temp_wiersz * 8 + temp_kolumna) is null) { zwrot.Add(temp_wiersz * 8 + temp_kolumna); } else if (pomocnicza_szachownica.figura_na_polu(temp_wiersz * 8 + temp_kolumna).ktory_gracz() != this.bialy_gracz) { zwrot.Add(temp_wiersz * 8 + temp_kolumna); break; } else if (pomocnicza_szachownica.figura_na_polu(temp_wiersz * 8 + temp_kolumna).ktory_gracz() == this.bialy_gracz) { break; } if (temp_wiersz == 0 || temp_wiersz == 7 || temp_kolumna == 0 || temp_kolumna == 7) { break; } } return(zwrot); }