2009-08-07 15 views
6

Próbuję wprowadzić grę planszową do świata komputerów, a plansza składa się z 16 pól, po 6 z każdej strony i 4 w środku. Plansza ma kształt rombu, a dwa końce reprezentują obie drużyny. W grze, peices przesuwają się tylko w kierunku bazy wroga (ze specjalnymi zdolnościami oczywiście) Więc oto moje pytanie: jaka według ciebie struktura danych najlepiej reprezentuje planszę gry? umysł był drzewem, ale ja naprawdę nie podoba mi się pomysł, ponieważ nie byłoby dwóch „korzenie” Wszelkie sugestieNajlepsza struktura danych reprezentująca planszę gry

płyta wygląda następująco:.?

& 
    & & 
& & & 
* * * * 
$ $ $ 
    $ $ 
    $ 

więc zespół & mogą tylko ruch w kierunku zespołu $ i vice versa, * będącego neutralnym terytorium

+0

Czy możesz przesłać gdzieś rysunek planszy? Nie jestem pewien, czy dobrze zinterpretowałem ci opis. –

Odpowiedz

11

Czy to w zasadzie kwadrat? Kształt diamentu to tylko kwestia interpretacji? Tak jak ...

M A A A 
B M A A 
B B M A 
B B B M 

jeśli tak, może po prostu użyj tablicy 2D i użyj swojego systemu wyświetlania, aby "przekształcić" w diament.

edit

myślę można mapować przenieść zestaw do tablicy - jeśli „$” kawałki tylko poruszać w górę iw lewo lub w górę iw prawo, które jest podobne do mojego „B "sztuki poruszające się tylko" w górę "lub" w prawo ". Podobnie, jeśli elementy "&" poruszają się tylko w dół iw lewo lub w dół iw prawo, to tak, jakby kawałki "A" przesuwały się w dół lub w lewo.

Pomysł polega na tym, że wewnętrznie do programu, pomyśl o swoich danych "w górę iw dół", ale kiedy przedstawiasz swój stan gry swojemu użytkownikowi, po prostu narysuj w konfiguracji diamentowej.

+0

to dokładnie kwadratura, ale użyłem diamentu, ponieważ w przypadku kwadratu, peice musiałyby się przesunąć po przekątnej w kierunku drugiego rogu zamiast tylko w górę lub w dół, co uważam za dużo bardziej sensowne i wygodniejsze. –

+2

A 2D szyk to zdecydowanie droga. Jest to nie tylko szybka i wygodna struktura, ale zasady ruchu powinny być łatwe do kodowania. Nie komplikuj! – Darryl

0

Użyłbym pewnego rodzaju wykresu, na przykład:

class Field 
{ 
    private List<Field> neighbours; 
} 

Lub nie jest to lista, ale tablica zawierająca zerowe odniesienia dla pól granicznych. Każda deska może być reprezentowana przez to.

+0

Jest to oczywiście najprostszy sposób robienia rzeczy, ale nie podoba mi się to, ponieważ nie pokazuje ograniczeń dla ruchu w lewo/prawo, a lista sąsiadów nie powie ci wyraźnie, gdzie znajduje się region. –

0

Dlaczego nie użyć prostej struktury macierzy? Jeśli plansza ma kształt rombu, ma kształt kwadratu/prostokąta, prawda?

Dim myBoard(5,5) As Array 

Oczywiście, jeśli deska ma dziwny kształt, (jak tam są przestrzenie i rzeczy w środku) to może nie działać.

+0

Może nadal działać, dopóki rzeczy w środku są diamentami - mogą być reprezentowane jako wartości puste lub coś podobnego. –

+0

sam commetn jako justjeff, dzięki za pomysły chociaż –

1

Co z dwoma drzewami z czterema środkowymi polami, które są takie same? (Mam na myśli odnoszenie się do tych samych obiektów)

+0

Myślałem o tym również, ale nie byłem pewien, co się stanie, jeśli wezmę środkowe pole i złapię jego rodziców? Skąd mam wiedzieć, który dostanę? Najlepsza odpowiedź! –

+0

Powiedziałeś, że gracz może tylko iść do przodu - więc czy potrzebujesz rodzica? –

4

Nie troszcz się tylko o to, jak reprezentować planszę, ale także jak reprezentować kawałki, ponieważ plansza i kawałki muszą komunikować ich wzajemną obecność i efekty.

Dlatego sposób, w jaki reprezentujesz swoją tablicę, zależy od tego, jak reprezentujesz swoje elementy i zasady gry ograniczające planszę i części.

Twoje pierwsze zmartwienie dotyczy sposobu reprezentowania elementów.

Kawałek do gry lub automat do gier to idealny model do programowania obiektowego.

Pozwól mi zilustrować poprzez dozowanie precz z deklaracji, takich jak publicznie, statyczne itp

abstract class BasicUnit 
{ 
// determine constraints of movement here. 
// update position and return new position 
abstract Position move(Direction d); 

abstract Position getPosition(); 
Arsenal arsenal; 
} 

class Worker 
extends BasicUnit 
{ 
Position move(Direct d) 
{ 
    //whateveer, etc 
} 
} 

class farmer 
extends Worker 
{ 
Position move(Direct d) 
{ 
    //whateveer, etc 
} 
} 

class Warrior 
extends BasicUnit 
{ 
Position move(Direct d) 
{ 
    //whateveer, etc 
} 
} 

class Sniper 
extends Warrior 
{ 
Position move(Direct d) 
{ 
    //whateveer, etc 
} 
} 

Teraz trzeba zdecydować, czy pozycje elementów na płycie jest

  • deska centric : pozycje sztuk są rejestrowane na tablicy tylko:
  • centrycznie: pozycje są rejestrowane tylko na sztukach:
  • zbędne: musisz zmniejszyć liczbę zaktualizuj zarówno kawałek, jak i planszę, gdy element zostanie przeniesiony.

W przypadku większości gier planszowych skupienie się na kawałku nie byłoby dobrym pomysłem, ponieważ trzeba by przeszukać każdy element, aby określić, czy pozycja jest zajęta.

Jeśli chodzi o wyżywienie na planszy, musisz przeszukać każdą pozycję planszy, aby znaleźć położenie kawałka.

Aby uzyskać nadmiarowość, należy upewnić się, że pozycje zarejestrowane przez obie plansze i części nie są źle wyrównane. Jeśli planujesz zezwolić na grę w Internecie, gdzie sesje mogą być wstrzymane i hibernowane, możesz spotkać się z wyzwaniami związanymi z synchronizacją.

Tak, odpowiedź na twoje pytanie jest - mieszany wektor do reprezentowania zarządu.

Hashowany wektor to kolekcja z dwoma drzwiami dostępowymi - jedna dostępna według pozycji, druga dostępna za pomocą klucza. Twój hashed wektor pozwoliłyby na dostęp

  • planszę stanie dowiedzieć się, jakie urządzenie jest na pozycji
  • id elementu, aby dowiedzieć się, gdzie na płycie jest.

Nie możesz reprezentować planszy jako drzewa, chyba że jest to wielopłaszczyznowa gra planszowa. Drzewo jest potrzebne, gdy masz drzewo, drabinę lub zamek, który siedzi na pozycji planszy, tak, że gdy jednostka osiągnie poziomą pozycję planszy, będzie musiała przejść do pionowej pozycji drabiny lub zamku . A w zamku jednostka musi zostać przekierowana do licznych pomieszczeń. Albo na drzewie jest czarownica zdolna schwytać jednostkę w butelkę z mylącą ścieżką ucieczki. Dlatego użycie struktury drzewa do reprezentowania twojej planszy stanowiłoby niepotrzebną komplikację w programowaniu twojej gry.

Nie ma znaczenia, czy jest kwadratowy z rombu lub koła, itp. Wystarczy wyliczyć położenie planszy. Metoda wyliczania musi być wygodna do przechwytywania twoich reguł.

Oznacza to, że nie należy wyliczać jednej części jako (1,3), a następnie wyliczać sąsiednią część jako (2,7) - to tylko zdrowy rozsądek. Ponieważ sąsiedzi (1,3) to (0,2), (1,2), (2,2), (0,3), (2,3), (0,4), (1,4) i (2,4), ale nie (2,7).

Potrzebny jest zatem dwuwymiarowy haszowany wektor.

, aby zaspokoić swoje potrzeby znalezienia się, jakie urządzenie jest na x, y pozycja swoim pokładzie:

BasicUnit getPosition(x,y) 

jak również dowiedzieć się (x, y) Pozycja jednostki.

Position getUnit(BasicUnit unit) 

Następnie można zaplanować swoją grę, aby być rozszerzalna tak, że gracz na osiągnięciu zwycięstwa mógł przejść do następnego poziomu grać który ma inny kształt płyty. Twój wektor dwuwymiarowy będzie nadal używany, ponieważ oddzielisz warstwę prezentacji swojego oprogramowania od struktury danych.

Po prostu wstawiasz więcej pozycji do swojego wektora.

Można zobaczyć mój wykonania Java 1-D hashed wektor w http://code.google.com/p/synthfuljava/wiki/HashVector

przełożyć je do wyboru języka programowania i dodać jeszcze jeden wymiar wektora do niego.

+0

Zapomniałem dodać, że transformacja wektorowego hasza 1-D jest dość prostą sprawą odwzorowania pozycji abtract (x, y) na rzeczywistą liniową pozycję wektora mieszanego 1-D. Więc jeśli płyta jest 9 o 9, transformujących (x, y) do indeksu wektora jest vectorindex = x + 9 * y –

+0

dobra wiadomość, ale haszowanej wektor jest taka przesada do tego. Tablica ma tylko 4x4, co oznacza, że ​​hashowanie spowolni ją w porównaniu z prostą mapą. –

Powiązane problemy