2010-08-09 8 views
5

Il modo più semplice per rappresentare un piano quadrilatero (un gruppo di quadrati) consiste nell'utilizzare una matrice bidimensionale.Rappresentazione di forma e movimento di un piano esagonale

In C# Si attesta questo come int[,] e può fare il nostro aereo grande come vogliamo:

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

di "spostare" un elemento in aereo, ci sarebbe solo assegnare dei esso toa nuova "posizione"

//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; 

Quindi, come rappresenterebbe un piano esagonale (un gruppo di esagoni) e come si manterrebbe il movimento da una posizione all'altra?

Nota: Questo non è puramente teorico, poiché ho un'idea per un piccolo gioco nella mia testa che richiederebbe questo tipo di movimento, ma non riesco a capire come sarebbe stato fatto. Ho esaminato alcune delle altre domande qui, ma non riesco a trovare una buona corrispondenza ...

+0

Hai spiegato un "piano quadrilatero", ma che diavolo è un piano esagonale allora? un aereo 6 dimensioni? O è un aereo bidimensionale a forma di esagono con un mazzo di fette semi-squadrate sui lati angolati? Le piazze a fette sono disponibili? –

+0

@Jimmy Hoffa esempio di una tavola. http://www.mrlsmath.com/wp-content/uploads/2009/02/hex-game-11x11.gif –

+0

Abbastanza divertente che hai sollevato questa domanda.Ho appena iniziato a lavorare su un gioco di tessere esagonali 2D lo scorso weekend. –

risposta

7

Non so se questa è la soluzione ottimale ma quello che vorrei fare è creare una nuova classe di schede la scheda sarebbe una raccolta di "celle" ogni cella conterrebbe un puntatore a ciascuna cella adiacente (o null se la cella si trova su un bordo). Potresti implementare alcuni iteratori nella classe di schede che genererebbe il controllo delle celle.

Dovresti trattarlo più come una Lista invece che come un vettore. Ma è almeno un inizio.


Un'altra soluzione è impostato di salire a bordo come questo alt text http://img833.imageshack.us/img833/4739/hexgame11x11.gif

e ancora basta usare il tasto [,] per accedere ogni cella ma ci vorrà un po 'più di matematica per capire se si è di movimento delle cellule (Up Right è [+ 1, -1], Right è [+1,0], Down Right è [0, + 1], Down Left è [-1, + 1], Left è [-1,0], su sinistra è [0, -1])

EDIT

Se volete pareti verticali al posto di un inclinazione basta prendere la larghezza (X) uguale a X + Y * 2, quindi su ogni riga creare il numero di riga corrente (y) e rendere le celle da 0 a Y-y e X-y a X off limits.

Esempio:

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); 
} 

sprecare un po 'di spazio di memoria ma ti dà un consiglio come questo alt text http://img192.imageshack.us/img192/5580/gridw.png

Se sei molto intelligente © si può semplicemente utilizzare lo spazio normale, ma basta avere la vostra il codice ha qualcosa in quella gamma Yy o Xy che si trova sul lato opposto del tabellone. Ma malato lascia quel codice al lettore.

+0

Questa è probabilmente la soluzione migliore. L'unica vera differenza tra un quadrato di quadrati e una tavola di esagoni è come la mostri, non come la immagazzini. –

0

Tre direzioni, sinistra/destra, su/giù, angolo divertente in un modo o nell'altro.

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--; } 
}