2010-08-09 10 views
5

La forma más básica de representar un plano cuadrilo (un grupo de cuadrados) es utilizar una matriz bidimensional.Representación de forma y movimiento de un plano hexagonal

En C# declaramos esto como int[,] y puede hacer que nuestro avión tan grande como queramos:

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

para "mover" un artículo en el avión, que no sería más asign que toa "posición" nueva

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

Entonces, ¿cómo representarías un plano hexagonal (un grupo de hexágonos) y cómo se manejaría el movimiento de una posición a la siguiente?

Nota: Esto no es puramente teórico, ya que tengo una idea para un pequeño juego en mi cabeza que requeriría este tipo de movimiento, pero no puedo entender cómo se haría. He analizado algunas de las otras preguntas aquí, pero realmente no encuentro una buena coincidencia ...

+0

Has explicado un "plano cuadrilo", pero ¿qué diablos es un avión hexagonal? un plano de 6 dimensiones? ¿O es un plano bidimensional con forma de hexágono con un montón de rebanadas de medio cuadrado en los lados angulosos? ¿Los cuadrados en rodajas están disponibles? –

+0

@Jimmy Hoffa ejemplo de un tablero. http://www.mrlsmath.com/wp-content/uploads/2009/02/hex-game-11x11.gif –

+0

Es bastante gracioso que haya sacado esta pregunta.Empecé a trabajar en un juego de fichas hexagonales en 2D el pasado fin de semana. –

Respuesta

7

No sé si esta es la solución óptima, pero lo que haría es crear una nueva clase de placa el tablero sería una colección de "celdas", cada celda contendría un puntero a cada una de sus celdas vecinas (o nulo si la celda está en un borde). Podrías implementar algunos iteradores en la clase de la placa que recorrerían las celdas.

Tendría que tratarlo más como una lista en lugar de un vector. Pero es al menos un comienzo.


Otra solución se ajusta usted sube para arriba como esto alt text http://img833.imageshack.us/img833/4739/hexgame11x11.gif

y aún así sólo tiene que utilizar el [,] para acceder a cada célula pero tomará un poco más de las matemáticas para averiguar si están atravesando las células (Arriba Derecha es [+ 1, -1], Derecha es [+1,0], Abajo Derecha es [0, + 1], Abajo Izquierda es [-1, + 1], Izquierda es [-1,0], arriba izquierda es [0, -1])

EDITAR

Si desea paredes verticales en lugar de una oblicuamente haz que tu ancho (X) sea igual a X + Y * 2, luego en cada fila crea el número de fila actual (y) y convierte las celdas 0 en Y-y y X-y en X fuera de los límites.

Ejemplo:

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

que los residuos un poco de espacio en la memoria, pero te da una tabla como esta alt text http://img192.imageshack.us/img192/5580/gridw.png

Si usted es muy inteligente © sólo se puede utilizar el espacio normal, pero sólo tener su código tiene cualquier cosa en ese rango Yy o Xy en el lado opuesto del tablero. Pero dejaré ese código al lector.

+0

Esta es probablemente su mejor solución. La única diferencia real entre una tabla de casillas y una tabla de hexes es cómo la muestra, no cómo la almacena. –

0

Tres direcciones, izquierda/derecha, arriba/abajo, ángulo divertido en una dirección/otra vía.

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