Piszę program umożliwiający grę w szachy dwóm osobom.
W klasie Jajca (mniejsza o nazwę) mam statyczne pole typu ArrayList przechowujące wszystkie figury, które są na szachownicy.
Kiedy następuje promocja piona, zostaje wywołane nowe okienko (po SwingUtilities.invokeLater()), gdzie po kliknięciu przycisku tworzy nową figurę (obiekt promotedPawn), przyjmijmy, hetmana i zamienia promowany pionek (siedzący na pozycji index)na tą figurę:
Jajca.getPieces().set(index, promotedPawn);
Gdy odpowiedzią na promocję jest zabicie świeżo wypromowanej figury, czyli tego hetmana...
public void doMove()
{
captured.removeFromBoard(); //zdejmuje zbijaną figurę a szachownicy
super.doMove(); //ustawia figurę bijącą na odpowiednie pole
indexOfCaptured=Jajca.getPieces().indexOf(captured);
Jajca.getPieces().set(indexOfCaptured, null); //usuwa zbijaną figurę z tablicy
}
...oczekuję, że pod referencją captured jest hetman i indexOfCaptured będzie równy indeksowi pionka, który został usunięty (jak mi się wydaje) z tablicy. Tymczasem wartość indexOfCaptured wynosi -1 i wywala błąd w następnej linijce. Jak sprawdziłem, podczas wykonywania linijki
indexOfCaptured=Jajca.getPieces().indexOf(captured);
pod referencją captured kryje się... pionek.
Jak to naprawić?
Wydaje mi się, że problem może leżeć w tym, że ArrayList nie jest, jak to się mówi, thread-safe i/lub braku synchronizacji.