예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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
        }
예제 #3
0
        /// <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);
        }