maro512 / Loop2

Apache License 2.0
0 stars 0 forks source link

Linia lub pętla wygrywająca #9

Closed maro512 closed 7 years ago

maro512 commented 7 years ago

Funkcja, która zwróci listę płytek znajdujących się na "trasie" wygrywającej, aby można zaznaczyć je na ekranie

pzjp commented 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ć.

maro512 commented 7 years ago

Wystarczy jedna lista, bo jak będzie remis to będą podświetlone linie dwóch graczy w ten sam sposób

pzjp commented 7 years ago

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.

maro512 commented 7 years ago

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ę

pzjp commented 7 years ago

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.

pzjp commented 7 years ago

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.