Closed maro512 closed 7 years ago
Teoretycznie może powstać kilka linii na raz. Trzeba by albo dodać do Boarda listę linii wygrywających (list, albo zbiorów płytek) albo zrobić interfejs nasłuchujący znajdowanie linii (w praktyce implementowałby go Game). Wtedy sprawdzanie wygranej byłoby sprawdzaniem kto ma niepustą listę. Minusem jest to, że przy każdym ruchu, przy sprawdzaniu istnienia linii tworzone by były nowe listy, które potem byłyby usuwane. Jest to możliwe. Gorzej byłoby np. z możliwością cofania ruchu (model: gracz wybiera płytkę, pokazuje mu się uzupełniona plansza i albo zatwierdza ruch, albo wybiera inne pole, plytkę). To prawie robienie Boarda od nowa, choć sądzę, że da się zrobić.
Wystarczy jedna lista, bo jak będzie remis to będą podświetlone linie dwóch graczy w ten sam sposób
Myślałem, żeby wyrzucić flagi whiteWin i blackWin zastępując je listami linii wygrywających. W obecnej wersji zwycięstwo sprawdzamy do skutku, czyli znajdziemy co najwyżej jedną linię wygrywającą w danym kolorze. Można też zastąpić flagi pojedynczymi liniami-listami płytek, albo zrobić jedną listę płytek, do której zsumuje się obie linie.
whiteWin i blackWin się przyda, jak będziemy wyświetlać kto wygrał. W ogóle można by spróbować zrobić animację, taką, że po dodaniu zwycięskiej płytki, po kolei podświetlają się wszystkie, które utworzyły tę pętlę. Wtedy potrzebna by była lista z płytkami w takiej kolejności jak przechodzi się przez pętlę
Podczas sprawdzania linii i tak przechodzi się ją po kolei. Pętlę przechodzi się w jedną stronę, więc jest łatwo, ale linię przechodzi się od jakiegoś punktu w dwie strony, więc trzeba uważać, przy wstawianiu. LinkedList pozwala wstawiać z dowolnego końca, więc nie powinno być problemów. Co do whiteWin i blackWin, to myślałem tylko o zmianie implementacji Boarda, a nie o usunięciu metod isBlackWin i isWhiteWin.
Zmieniłem (pozornie) orientację współrzędnych w modelu i poprawiłem PlayState
, żeby był kompatybilny. W Cell
jest już metoda getType
oraz para metod do pobierania współrzędnych w dobrej orientacji.
Tworzenie linii wygrywających jako list okazało się sprowadzać do jakichś sześciu dodatkowych inii kodu.
Można pobrać linię wygrywającą metodą getWinningLine
przyjmująca kolor jako argument. Jak (jeszcze) nie ma takiej linii to wychodzi null.
Jest też nowa metoda getCell(x,y)
zwracająca komórkę z określonej pozycji, oraz getCells
zwracająca kolekcję wszystkich pól na planszy. Wyrzuciłbym metodę getCurrPosition
w tej sytuacji.
Funkcja, która zwróci listę płytek znajdujących się na "trasie" wygrywającej, aby można zaznaczyć je na ekranie