Advertisement
Guest User

Untitled

a guest
Jun 27th, 2016
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.00 KB | None | 0 0
  1. package logika;
  2.  
  3. import java.awt.*;
  4. import java.util.ArrayList;
  5.  
  6. /**
  7. * Klasa Sciezka jest odpowiedzialna za ściezki tworzące bazy.
  8. */
  9. public class Sciezka {
  10. /**
  11. * Lista pozycji w ścieżce, współrzędne kropek tworzących sciezke.
  12. */
  13. private ArrayList<Pozycja> pozycje = new ArrayList<Pozycja>();
  14. /**
  15. * kolor bazy
  16. */
  17. private TypKropki kolor;
  18.  
  19. /**
  20. * zamienia typ bazy na kolor używany do rysowania kropek i linii w bazach
  21. *
  22. * @return kolor
  23. */
  24. public Color kolorSciezki() {
  25. return kolor == TypKropki.CZERWONA ? Color.RED : Color.BLUE;
  26. }
  27.  
  28. /**
  29. * Konstruktor który przyjmuje za parametry współrzędne punktu startowego i na ich podstawie ustala kolor ścieżki
  30. *
  31. * @param x
  32. * @param y
  33. */
  34. public Sciezka(int x, int y) {
  35. kolor = Gra.pobierzInstancje().pobierzKomorke(x, y);
  36. }
  37.  
  38. /**
  39. * Dodaje punkt startowy do ścieżki - pierwszą pozycję kropki
  40. *
  41. * @param x
  42. * @param y
  43. */
  44. public void dodajPunktStartowy(int x, int y) {
  45. pozycje.add(new Pozycja(x, y));
  46. }
  47.  
  48. @Override
  49. /**
  50. * Zamienia ścieżkę na liczbę, która jest sumą wszystkich x kropek w liście pomnozona przez 2 i y pomnozonych przez 3.
  51. */
  52. public int hashCode() {
  53. int wartosc = 0;
  54. for (Pozycja pozycja : pozycje)
  55. wartosc += (pozycja.X * 2 + pozycja.Y * 3);
  56. return wartosc;
  57. }
  58.  
  59. /**
  60. * Tworzy nową ścieżkę i kopiuje inną ścieżkię wraz z jej pozycjami i kolorem
  61. *
  62. * @return kopia
  63. */
  64. public Sciezka kopiuj() {
  65. Sciezka kopia = new Sciezka(pozycje.get(0).X, pozycje.get(0).Y);
  66. kopia.pozycje.addAll(pozycje);
  67. return kopia;
  68. }
  69.  
  70. /**
  71. * Sprawdza, czy kropka o współrzędnych x,y należy już do ścieżki
  72. *
  73. * @param x
  74. * @param y
  75. * @return true, jezeli nalezy, false jezeli nie
  76. */
  77. public boolean zawieraPunkt(int x, int y) {
  78. for (Pozycja pozycja : pozycje) {
  79. if (pozycja.X == x && pozycja.Y == y)
  80. return true;
  81. }
  82. return false;
  83. }
  84.  
  85. /**
  86. * Jest to metoda rekurencyjna. Działa na zasadzie przeszukiwania drzewa. Próbuje utworzyć ścieżkę idącą w każdym kierunku z danego punktu. Jeżeli następny sprawdzany punkt ma taki sam kolor, to jest ona wywoływana na jego rzecz rekurencyjnie.
  87. * Metoda kończy się, kiedy znalazła wszystkie możliwe ścieżki tak, że ich ostatni punkt byłby pierwszym.
  88. *
  89. * @param x
  90. * @param y
  91. * @param sciezka kopia ścieżki idąca w innym kierunku
  92. * @param listaSciezek lista wszystkich ścieżek znalezionych przez algorytm
  93. * @return lista ścieżek
  94. */
  95. private static ArrayList<Sciezka> szukajSciezki(int x, int y, Sciezka sciezka, ArrayList<Sciezka> listaSciezek) {
  96. //sprawdza, czy lista istnieje, jezeli nie, to stworzy nową listę, żeby można było do niej dodawać
  97. if (listaSciezek == null)
  98. listaSciezek = new ArrayList<Sciezka>();
  99. //pętla stara się przejść przez wszystkie punkty dookoła
  100. for (int iy = y - 1; iy <= y + 1; iy++) {
  101. for (int ix = x - 1; ix <= x + 1; ix++) {
  102. //sprawdza, czy punkt należy do planszy, czy jest takiego samego koloru i sprawdza, czy punkt nie jest punktem startowym
  103. if (ix < Gra.WIELKOSC_PLANSZY && iy < Gra.WIELKOSC_PLANSZY && ix > 0 && iy > 0 && Gra.pobierzInstancje().pobierzKomorke(ix, iy) == sciezka.kolor && !(ix == x && iy == y)) {
  104. //kopiuje dotychczasowa sciezke, bo idzie w innym kierunku
  105. Sciezka kopia = sciezka.kopiuj();
  106. //tworzy nową pozycję miejsca w które idziemy
  107. Pozycja nowaPozycja = new Pozycja(ix, iy);
  108. // sprawdza czy nastepna pozycja jest poczatkiem sciezki i czy wielkosc sciezki >=4 żeby wykluczyc zapetlenia
  109. if (kopia.pozycje.get(0).equals(nowaPozycja) && kopia.pozycje.size() >= 4) {
  110. //dodaje do listy sciezek skonczona sciezke
  111. listaSciezek.add(kopia);
  112. //sprawdza, czy sciezka nie przechodzi drugi raz przez ten sam punkt
  113. } else if (!sciezka.zawieraPunkt(ix, iy)) {
  114. //dodaje do kopii nową pozycję
  115. kopia.pozycje.add(nowaPozycja);
  116. //wywolanie metody jeszcze raz, rekurencyjnie, zeby szukala dalej
  117. szukajSciezki(ix, iy, kopia, listaSciezek);
  118. }
  119. }
  120. }
  121. }
  122. //po przejsciu przez wszystkie mozliwe sciezki zwraca listę ścieżek, które rzeczywiście można utworzyć
  123. return listaSciezek;
  124. }
  125.  
  126. /**
  127. * Metoda jest odpowiedzialna za dodanie do listy baz ścieżek, które mozna utworzyć po wykonaniu ruchu
  128. *
  129. * @param x
  130. * @param y
  131. */
  132. public static void dodajSciezke(int x, int y) {
  133. //tworzymy nową sciezke startującą w punkcie, w którym wykonano właśnie ruch (podstawowa pierwsza ścieżka)
  134. Sciezka poczatek = new Sciezka(x, y);
  135. // Punkt poczatkowy dodaje do sciezki
  136. poczatek.dodajPunktStartowy(x, y);
  137. // Szukanie wszystkich mozliwych sciezek z tego punktu
  138. ArrayList<Sciezka> sciezki = szukajSciezki(x, y, poczatek, new ArrayList<Sciezka>());
  139. // szukanie najdluzszej sciezki, z której mozna utworzyc baze
  140. Sciezka najdluzsza = null;
  141. //do sprawdzenia czy dodana sciezka pochodzi ma w sobie tylko jakas wspolrzedna, czy cala baze
  142. Sciezka zawartaWBazie = null;
  143. for (Sciezka sprawdzana : sciezki) {
  144. /**
  145. * Do sprawdzania czy punkt nalezy do wielokątu (czy kropka jest w srodku bazy) uzyłam klasy polygon, która zawiera taki algorytm
  146. */
  147. Polygon wielokat = new Polygon();
  148. for (Pozycja pozycja : sprawdzana.pozycje)
  149. wielokat.addPoint(pozycja.X, pozycja.Y);
  150. //zmienna, która stanowi o tym, czy w bazie znajduje sie chociaz jedna kropka innego koloru
  151. boolean zawieraInna = false;
  152. //petla przechodzi przez wszystkie punkty na naszej planszy gry i dla kazdego sprawdza, czy: jego kolor jest przeciwny do sciezki, czy nalezy do naszej bazy (w srodku), czy kropka jest w innej bazie i sprawdza, czy kropka nie nalezy juz do innej bazy i czy kropka w ogole nalezy do naszego wielokatu
  153. for (int py = 1; py < Gra.WIELKOSC_PLANSZY; py++) {
  154. for (int px = 1; px < Gra.WIELKOSC_PLANSZY; px++) {
  155. if (Gra.pobierzInstancje().pobierzKomorke(px, py) != TypKropki.BRAK && Gra.pobierzInstancje().pobierzKomorke(px, py) != sprawdzana.kolor && !Gra.pobierzInstancje().czyKropkaZdobyta(px, py) && !Gra.pobierzInstancje().czyKropkaWBazie(px, py) && wielokat.contains(px, py)) {
  156. //jezeli wszystkie warunki sa prawdziwe, to ustawiamy na true
  157. zawieraInna = true;
  158. //dodaje kropke do listy kropek zdobytych
  159. Gra.pobierzInstancje().kropkaZdobyta(px, py);
  160. }
  161. }
  162. }
  163. //sprawdza, czy sciezka ma jakakolwiek kropkę, która jest w środku
  164. if (zawieraInna) {
  165. //jezeli najdluzsza sciezka nie zostala jeszcze znaleziona lub znaleziona sciezka jest krotsza niz obecna, to zamieniamy najdluzsza na obecna
  166. if (najdluzsza == null || najdluzsza.pozycje.size() < sprawdzana.pozycje.size()) {
  167. najdluzsza = sprawdzana;
  168. zawartaWBazie = null;
  169. }
  170.  
  171. // jezeli nie ma, to sprawdzmy czy zawiera jakas inna baze w calosci
  172. } else {
  173. // sprawdza wszystkie sciezki, jezeli jakas sie zawiera w srodku to dodaje
  174. for (Sciezka sciezka : Gra.pobierzInstancje().getSciezki()) {
  175. // zaklada ze wszystkie naleza, a jak chociaz jedna nie nalezy to wtedy ustawia na false
  176. boolean wszystkieNaleza = true;
  177. for (Pozycja pozycja : sciezka.getPozycje()) {
  178. //sprawdza, czy: jego kolor jest przeciwny do sciezki, czy nalezy do naszej bazy (w srodku), czy kropka jest w innej bazie i sprawdza i czy kropka w ogole nalezy do naszego wielokatu
  179. if (!(Gra.pobierzInstancje().pobierzKomorke(pozycja.X, pozycja.Y) != TypKropki.BRAK && Gra.pobierzInstancje().pobierzKomorke(pozycja.X, pozycja.Y) != sprawdzana.kolor && !Gra.pobierzInstancje().czyKropkaZdobyta(pozycja.X, pozycja.Y) && wielokat.contains(pozycja.X, pozycja.Y))) {
  180. wszystkieNaleza = false;
  181. break;
  182. }
  183. }
  184. if (wszystkieNaleza) {
  185. najdluzsza = sprawdzana;
  186. zawartaWBazie = sciezka;
  187. }
  188. }
  189. }
  190. }
  191. //jezeli najdluzsza zosatala znaleziona, to dodaje ja do listy sciezek i tworzy z niej baze
  192. if (najdluzsza != null) {
  193. Gra.pobierzInstancje().getSciezki().add(najdluzsza);
  194. najdluzsza.stworzBaze();
  195. if (zawartaWBazie != null) {
  196. for (Pozycja pozycja : zawartaWBazie.pozycje)
  197. Gra.pobierzInstancje().kropkaZdobyta(pozycja.X, pozycja.Y);
  198. }
  199. }
  200. }
  201.  
  202. /**
  203. * tworzy baze ze sciezki
  204. */
  205. public void stworzBaze() {
  206. //przechodzi przez wszystkie pozycje i dodaje je do kropek w bazie
  207. for (Pozycja pozycja : pozycje)
  208. Gra.pobierzInstancje().kropkaWBazie(pozycja.X, pozycja.Y);
  209. }
  210.  
  211. /**
  212. * Zwraca liste pozycji w sciezce
  213. * @return pozycje
  214. */
  215. public ArrayList<Pozycja> getPozycje() {
  216. return pozycje;
  217. }
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement