/// <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> /// Funkcja, w której będą odbywać się wszystkie ruchy na planszy /// </summary> /// <param name="sender">W tym przypadku to kliknięty przycisk w aplikacji</param> private void Field_Click(object sender, RoutedEventArgs e) { var skadklikniete = (Button)sender; int pole_klikniete = Grid.GetRow(skadklikniete) * 8 + Grid.GetColumn(skadklikniete); //wzor na pole w tablicy -> nr pola = wiersz * 8 + kolumna #region Start Ruchu //w tym przypadku pole_klikniete to miejsce, z ktorego chcemy wykonac ruch if (!klikniete) { if (plansza.figura_na_polu(pole_klikniete) is null) { return; } if (plansza.figura_na_polu(pole_klikniete).ktory_gracz() != czyja_kolej) { return; } klikniete = true; start_ruchu = pole_klikniete; mozliwe_ruchy = (new Szachownica(plansza)).figura_na_polu(start_ruchu).ruchy_bez_szacha(pole_klikniete, plansza); pokaz_mozliwosci_na_planszy(mozliwe_ruchy); return; } #endregion Start Ruchu #region PotwierdzenieRuchu //w tym przypadku pole_klikniete to miejsce, na ktore chcemy wykonac ruch if (mozliwe_ruchy.Contains(pole_klikniete)) { Bierka ruszona = plansza.figura_na_polu(start_ruchu); if (ruszona is Pionek) { ((Pionek)ruszona).ruszono = true; } if (ruszona is Krol) { ((Krol)ruszona).ruszono = true; int ktora_strona; if (plansza.figura_na_polu(pole_klikniete) is Wieza) { ktora_strona = start_ruchu < pole_klikniete ? 1 : -1; //zaleznie od tego, gdzie znajduje sie wieza idziemy w inna strone plansza.ustaw_na_polu(new Wieza(ruszona.ktory_gracz()), start_ruchu + ktora_strona * 2 + -ktora_strona); plansza.wykonaj_ruch(start_ruchu, start_ruchu + ktora_strona * 2); } } plansza.wykonaj_ruch(start_ruchu, pole_klikniete); plansza.aktualizuj_szachowanie(); czyja_kolej = czyja_kolej == 1 ? 0 : 1; //zaznaczamy, że ruch odbył się poprawnie i zmieniamy obecnego gracza if (plansza.czy_szach(czyja_kolej)) { gracz_zaszachowany = czyja_kolej; if (plansza.czy_mat(czyja_kolej)) //jeśli jest mat to pytamy gracza czy chce zagrać jeszcze raz { aktualizuj_plansze(); string kto_wygral = czyja_kolej == 0 ? "White's" : "Black's"; MessageBoxResult wynik = MessageBox.Show(kto_wygral + " have won!\nDo you want to play again?", "New game box", MessageBoxButton.YesNo); switch (wynik) { case MessageBoxResult.Yes: NowaGra(); break; case MessageBoxResult.No: Close(); break; } } } else { gracz_zaszachowany = -1; } } else { mozliwe_ruchy = new List <int>(); //zerujemy wszystkie poprzednie możliwe ruchy, bo anulowaliśmy ruch } aktualizuj_plansze(); klikniete = false; //wracamy sprzed kliknięcia, jest to swoiste anulowanie poprzedniego kliknięcia #endregion PotwierdzenieRuchu }
/// <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); }