2010-08-09 7 views
5

Najprostszym sposobem przedstawienia płaszczyzny kwadrylowej (grupy kwadratów) jest użycie tablicy dwuwymiarowej.Forma i przedstawienie ruchu płaszczyzny sześciokątnej

W języku C# możemy zadeklarować to jako int[,] i może uczynić nasz samolot wielki jak chcemy:

string[3,3] => tic-tac-toe board (or similar) 
string[8,8] => chess or checkers board 

do „wrzucenia” element w samolocie, my po prostu asign to Toa nowe „stanowisko”

//using our tic-tac-toe board: 
string[0,0] = "x"; //top-left 
string[1,1] = "o"; //middle-middle 

//to move 
string[0,1] = bN; //Black Knight's starting positon 
string[2,2] = bN; //Black Knight moves 
string[0,1] = String.Empty; 

A zatem, jak przedstawiliby Państwo sześciokątną płaszczyznę (wiązkę sześciokątów) i jak mieliby się poruszać z jednej pozycji do drugiej?

Uwaga: to nie jest czysto teoretyczne, ponieważ mam pomysł na małą grę w mojej głowie, która wymagałaby tego rodzaju ruchu, ale nie mogę zawinąć głowy, jak to się stanie. Przejrzałem kilka innych pytań tutaj, ale nie mogę znaleźć dobrego dopasowania ...

+0

Wyjaśniłeś "płaszczyznę kwadryl", ale co to jest, do cholery, sześciokątna płaszczyzna? 6-wymiarowa płaszczyzna? A może jest to dwuwymiarowa płaszczyzna w kształcie sześciokąta z wiązką półkolistych plastrów po skosie? Czy miejsca w plasterkach są dostępne? –

+0

@ Jimmy Hoffa przykład tablicy. http://www.mrlsmath.com/wp-content/uploads/2009/02/hex-game-11x11.gif –

+0

Zabawne, że poruszyłeś to pytanie.Właśnie rozpocząłem pracę nad dwuwymiarową płytkową grą sześciokątną w miniony weekend. –

Odpowiedz

7

Nie wiem, czy to jest optymalne rozwiązanie, ale chciałbym stworzyć nową klasę planszy tablica byłaby zbiorem "komórek", a każda komórka zawierałaby wskaźnik do każdej sąsiedniej komórki (lub null, jeśli komórka znajduje się na krawędzi). Możesz zaimplementować kilka iteratorów w klasie board, które będą chodzić po komórkach.

Będziesz musiał potraktować go bardziej jak listę zamiast wektora. Ale to przynajmniej początek.


Innym rozwiązaniem jest ustawiony wsiąść się jak to alt text http://img833.imageshack.us/img833/4739/hexgame11x11.gif

i nadal po prostu użyć [,], aby uzyskać dostęp do każdej komórki, ale to zajmie trochę więcej matematyki, aby dowiedzieć się, czy są przejeżdżające komórki (W górę w prawo [+ 1, -1], w prawo [+1,0], w prawo w dół [0, + 1], w lewo w lewo [-1, + 1], w lewo [-1,0], w górę w lewo jest [0, 1])

EDIT

Jeśli chcesz pionowe ściany zamiast Po prostu skoś tak, aby twoja szerokość (X) była równa X + Y * 2, a następnie w każdym wierszu wprowadź numer bieżącego wiersza (y) i ustaw komórki 0 na limity Y-y i X-y na X wyłączone.

Przykład:

const int X = 10; 
const int Y = 10; 
int grid[,] = new int[X+(2*Y), Y]; 

bool IsCellOffLimits(int x, int y) 
{ 
    return (x < Y-y || x > X-y || y < 0 || y > Y); 
} 

tracisz trochę pamięci, ale daje radę jak to alt text http://img192.imageshack.us/img192/5580/gridw.png

Jeśli jesteś bardzo mądry © można po prostu użyć zwykłej przestrzeni, ale po prostu mieć swój kod ma wszystko w tym zakresie Yy lub Xy po przeciwnej stronie planszy. Ale chorzy pozostawiają ten kod czytelnikowi.

+0

To prawdopodobnie najlepsze rozwiązanie. Jedyną różnicą między planszą kwadratu a planem heksów jest sposób jej wyświetlania, a nie sposób przechowywania. –

0

Trzy kierunki, lewo/prawo, góra/dół, zabawny kąt w jedną stronę/w inny sposób.

public class Player 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 

    public void MoveLeft() { X++; } 
    public void MoveRight() { X--; } 

    public void MoveUp() { Y++; } 
    public void MoveDown() { Y--; } 

    public void MoveFunny() { Y++; X++; } 
    public void MoveOtherFunny() { Y--; X--; } 
}