Nieograniczona plansza- gra Gomoku

0

Witam,

Piszę do Was koledzy z prośbą o pomoc w tworzeniu takiej nieograniczonej planszy gry. Obecnie mam 5x5, wszystko działa, ale w założeniu jest, że ma być plansza nieograniczona. Macie jakieś pomysły w jaki sposób najlepiej będzie to rozwiązać?

0

Zgaduję, że tablicą dynamiczną lub czymś do niej pochodnym?

0

Najprościej za pomocą tablicy, choć będzie to czasochłonne w przypadku osiągnięcia limitu i konieczności kopiowania mniejszej tablicy do większej. Jeszcze pytanie kluczowe co chcesz przechowywać w tablicy. Tylko piony, czy "całą" planszę.

0

Tak z tego co zrozumiałem muszę przechowywać całą planszę, dajmy przykład mam obszar gry 3x3 i chodzi o to, że w momencie umieszczenia kółka czy tam krzyżyka na dolnym brzegu albo prawym powinno sukcesywnie poszerzać planszę oczywiście wszystko to ma się odbywać na bieżąco, podczas gry.

0

Może tak, informacje przechowujesz w zmiennej rozmiar typu int, oraz w zmiennej pola typu ArrayList<ArrayList<Pole>>. Po umieszczeniu kółka lub krzyżyka na brzegu, wykonujesz taki kod:

//jeśli osiągnięto prawy lub dolny brzeg dodajemy kolumnę po prawej i wiersz na dole
for(int w=0;w<rozmiar;w++)
{
    pola.get(w).add(new Pole());
}
ArrayList<Pole> nowyWiersz = new ArrayList<Pole>();
for(int k=0;k<=rozmiar;k++)
{
    nowyWiersz.add(new Pole());
}
pola.add(nowyWiersz);
//jeśli osiągnięto lewy lub górny brzeg dodajemy kolumnę po lewej i wiersz na górze
...
   pola.get(w).add(0,new Pole());
...

pola.add(0,nowyWiersz);
rozmiar++;
0

A po co tak? Ja bym podszedł do tematu troszeczkę inaczej. W zależności jak hardkorowo rozumiemy nieograniczoność (można dobić do 2xMAX_INT pionów na planszy).

  1. Przechowujesz tylko zapełnione pola. Pola puste nie muszą być przechowywane.
  2. Na boku zapisujesz skrajne piony, które określają rozmiar planszy.
// dwie tablice z pionami klasy dziedziczą po Pion
Czarny[] czarne;
Bialy[] biale;
Pion lewyG, prawyG, PrawyD, lewyD; // piony skrajne. 
//...

void postawPion(Pion pion){
    czyRozszerzaPlansze(pion); // sprawdza czy pion rozszerza plansze. tzn. czy któraś z jego pozycji jest większa niż lewyG, prawyG, PrawyD, lewyD.
    aktualnyGracz.dopiszRuch(pion); / dopisuje pion do tabelki.
}

pola puste są traktowane jako null i można wtedy zastosować odpowiednie podejście do rendrerowania planszy.

Renderowanie planszy (graficzne)

  1. renderujesz kolejne piony z tablic czarne i biale,
  2. jako tło planszy ustawiasz jej schemat.
  3. dopisujesz listenery na piony, które będą zabraniać ruchu w polu zajętym oraz globalny listener na tło-planszę pozwalający na wykonanie ruchu.

Wersja bardziej hardkorowa polega na utworzeniu klasy Wiersz (albo kolumna) i przechowywaniu pionów w danym wierszu w kolejności od lewej do prawej. Dodatkowo masz jeszcze jedną posortowaną kolekcję zawierającą tylko wiersze zawierające co najmniej jeden pion. Renderowanie polega na:

void renderujWiersz(Wiersz wiersz){
    Pion p;
    while((p = wiersz.kolejnyPion)!=null){
        int następnySąsiad= wiersz.pozycjaNastępnego(p);
        renderujPion(Pion);
        renderujPustePola(pion,następnySąsiad-1); 
    }
}

czy jakoś tak... ;)

0

Chodzi o grę gomoku. Wystarczy przechowywać położenia kolejno kładzionych pionów. Do tego dodać algorytm sprawdzania, czy po dołożeniu kamienia wyłoniono zwycięzcę. Inna kwestia, to wizualizacja tego. Tutaj można sobie wybrać dowolny rozsądny rozmiar planszy do pokazywania, np. 20x20 i dać użytkownikowi możliwość przesuwania planszy na ekranie. Przesunięcie będzie wymagało odrysowania pionów na polach w widocznym zakresie, plansza nadal będzie ta sama.

0

Moim zdaniem nie ma co kombinować. Plansza 100x100 spokojnie może zostać uznana za nieograniczoną, a można ją zrobić spokojnie zwykłymi tablicami.
Standardowa kartka z zeszytu ma około 29x42 kratki, największa plansz do Go (na której gra się Gomoku) ma 19x19.
Większe plansze po prostu nie mają już sensu dla użytkownika.

Problem może się pojawić jeśli masz gracza komputerowego, właściwe zoptymalizowanie algorytmu przy dużej planszy może okazać się dość trudne.

0

Dzisiaj będę próbował, napiszę jakie efekty, dziękuje za pomoc. ;-)

0
cienki napisał(a):

Witam,

Piszę do Was koledzy z prośbą o pomoc w tworzeniu takiej nieograniczonej planszy gry. Obecnie mam 5x5, wszystko działa, ale w założeniu jest, że ma być plansza nieograniczona. Macie jakieś pomysły w jaki sposób najlepiej będzie to rozwiązać?

To zależy, jakie operacje chcesz wykonywać na takiej strukturze. Ale tak na pierwszy rzut oka to najprościej będzie skonstruować słownik, w którym kluczami będą pozycje na planszy, a wartościami pionki. Coś w rodzaju Map<Pozycja, Pionek>.

0

Koledzy koniec końców udało mi się stworzyć grę o planszy 10x10 na tablicy jednowymiarowej (nieograniczona rzeczywiście nie miała sensu). Wszystko już mi działa tylko pozostał problem ze sprawdzaniem wygranej. Czy jest w ogóle możliwość sprawdzania tego na tablicy jednowymiarowej? Czytałem, że można sprawdzać wszystkie możliwości od klikniętego pola tzn. na lewo, prawo, dół, góra i ukosy. Tylko jak obsługiwać wyjątki jeśli wyjdzie się po za tablice?

1 użytkowników online, w tym zalogowanych: 0, gości: 1