Czy pionki mogą podążać różnymi ścieżkami z jednego pola na drugie w jednym ruchu?

Dec 06 2020

Wdrażam grę w szachy. Znam zasady, ale niewiele w to grałem. Potrzebuję wyjaśnienia małej kwestii.

Przypuśćmy, że gracz legalnie przesuwa bierkę z pola A na pole B. Zastanów się, jaką ścieżkę przebył ten kawałek podczas tego ruchu. Czy może być inny w zależności od rodzaju elementu?

Nie jestem w stanie znaleźć takiego przypadku.

Edycja: - Dodaję kod interfejsu, z którym mam do czynienia, aby był bardziej przejrzysty, gdy niektórzy proszą o podanie szerszego kontekstu.

public class Chess {

    ChessBoard chessBoard;
    Player[] player;
    Player currentPlayer;
    List<Move> movesList;
    GameStatus gameStatus;

    public boolean playerMove(CellPosition fromPosition, CellPositionb toPosition, Piece piece); 
    public boolean endGame();
    private void changeTurn();

}
public abstract class Piece {

Color color;
public boolean validate(CellPosition fromPosition, CellPositionb toPosition);
}

public class Knight extends Piece {
public boolean validate(CellPosition fromPosition, CellPositionb toPosition);

}

Podobnie będą klasy dla innych figur, takich jak Knight. Teraz, jeśli gracz chce przesunąć się w szachach z jakiejś pozycji X na inną pozycję Y, metoda validate () figury zostanie wywołana przez playerMove () szachów, validate () może tylko sprawdzić, czy ruch jest prawidłowy, czy nie. Tak jak dla podanych figur, powiedzmy skoczek, sprawdzi, czy z danego miejsca celem jest jeden z 8 prawidłowych ruchów, dla wieży może to być jeden z czterech kierunków i tak dalej.

Funkcja playerMove () wywołuje funkcję Piece.validate (), a następnie dowiaduje się, że jest to prawidłowy ruch. Problem, który próbuję rozwiązać, teraz, gdy funkcja playerMove w szachach, wie, że jest poprawny move, nie wie, czy jest jakiś element pomiędzy z danego miejsca a miejsca przeznaczenia? Ponieważ kawałek nie ma kontekstu Board, nie może go wykryć i musi to być zrobione w funkcji playerMove () funkcji ches. zapisze tutaj kod, aby wygenerować listę możliwych kwadratów, które są zaangażowane od źródła do celu. Czy ta lista kwadratów zawsze będzie unikalna? Czy może być inna dla innego elementu? Ponieważ oprócz skoczka wszystkie ruchy są proste lub ukośne, więc powinno być unikalne, więc chcę to wyjaśnić.Jeśli nadal pytanie nie jest jasne, daj mi znać. Ale

Odpowiedzi

4 BrianTowers Dec 06 2020 at 04:55

W przypadku hetmanów, gońców i wież przemieszczających się z pola A na pole B jest tylko jeden sposób wykonania ruchu i wszystkie pola pomiędzy nimi muszą być puste, aby ruch ten był prawidłowy.

W przypadku skoczka poruszającego się z pola A na pole istnieją zasadniczo dwa sposoby, ale nie ma to znaczenia, ponieważ skoczkowie mogą przeskoczyć przeszkody.

W przypadku roszady król może przejść z punktu A do punktu B tylko w jeden sposób, a pole znajdujące się pomiędzy nim musi być puste, aby ten ruch był prawidłowy, a król musi zostać przesunięty jako pierwszy. W przypadku roszady jest tylko jeden sposób, w jaki wieża może przesunąć się z punktu A do punktu B i wszystkie pola pomiędzy nimi muszą być puste, z wyjątkiem króla, aby ruch ten był prawidłowy.

3 MikeD Dec 06 2020 at 04:42

Nie. To kwestia gustu, w jaki sposób skoczek podróżuje od pola początkowego do końcowego, ale nic nie jest napisane o tym, jak dotrze do kwadratu końcowego. To samo dotyczy roszady, tego, jak wieża dociera na pole docelowe, ponieważ musi tam dotrzeć, mijając króla, który właśnie wykonał ruch o dwa pola.

1 Acccumulation Dec 07 2020 at 11:04

Szczególnymi przypadkami do rozważenia są ruchy skoczkiem, roszada i ruchy pionkiem. Rycerze tak naprawdę nie mają ścieżki; możesz myśleć o nich jako o teleportowaniu się do celu. Pionki i roszada muszą przestrzegać tych samych ograniczeń dotyczących poruszania się po zajętych polach (mają te same pola, przez które „przechodzą”, jak każdy inny materiał z tym samym polem źródłowym i docelowym), ale mają również dodatkowe ograniczenia. Za każdym razem, gdy król porusza się inaczej niż roszada, nie „przechodzi” przez żadne pola, więc twoje pytanie tak naprawdę nie jest trafne.

Każde inne posunięcie to ruch wieży lub gońca. Za każdym razem, gdy hetman się porusza, wykonuje ruch wieżą lub goniec. Kiedy królowa wykonuje ruch gońca, postępuje zgodnie z tymi samymi zasadami, co przesuwanie gońca, a droga, którą wybiera, jest taka sama, jak w przypadku gońca. Kiedy wykonuje ruch wieżą, postępuje zgodnie z tymi samymi zasadami, co wieża (poza wspomnianą roszadą).

koedem Dec 08 2020 at 01:58

W przypadku pionów, które nie są skoczkiem, można sprawdzić tylko jedną ścieżkę. W przypadku wieży, gońca i hetmana wyznaczasz „promień”, król porusza się tylko o jedno pole, a skoczek nie przejmuje się tym, że inne figury przeszkadzają, więc ścieżka nie ma znaczenia. Aby to sprawdzić, musisz sprawdzić, czy pole docelowe nie jest przyjaznym pionem (ponieważ nie możesz złapać przyjaznych pionów), a dla ruchomych elementów promienia, wszystkie pola pomiędzy nimi są puste.

Pionek to oczywiście szczególny przypadek, bo inaczej bije, niż się porusza, mam nadzieję, że jesteście tego świadomi. :) (i ma dalsze komplikacje, takie jak zasada podwójnego kroku i reguła en passant)

UWAGA: Aby posunięcie było legalne, zawodnik będący w ruchu nie może być szachowany po wykonaniu ruchu. Więc musisz to również zweryfikować. Jednym z możliwych sposobów jest udawanie, że król poruszającego się gracza jest wieżą i sprawdzanie, czy może ona zbić wieżę wroga, a wtedy ta wroga wieża faktycznie sprawdza. (to samo dla innych figur i oczywiście jeszcze raz uważaj na pionki)

Zwrócę również uwagę, że zaimplementowałbym to znacznie inaczej, ale zakładam, że jest to projekt edukacyjny, więc powinno być dobrze.