Форма и представление движения шестиугольной плоскости - PullRequest
5 голосов
/ 09 августа 2010

Самый простой способ представления четырехугольной плоскости (связки квадратов) - использовать двумерный массив.

В C # мы объявляем это как int[,] и можем сделать наш самолет настолько большим, насколько мы хотим:

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

Чтобы «переместить» элемент на плоскости, мы бы просто присвоили ему новую «позицию»

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

Итак, как бы вы представили гексагональную плоскость (группу шестиугольников) и как бы обрабатывалось перемещение из одной позиции в другую?

Примечание: это не чисто теоретический подход, поскольку у меня в голове есть идея маленькой игры, которая потребует такого рода движений, но я не могу обернуться, как это будет сделано. Я просмотрел некоторые другие вопросы здесь, но не могу найти хорошего соответствия ...

Ответы [ 2 ]

7 голосов
/ 09 августа 2010

Я не знаю, является ли это оптимальным решением, но я хотел бы создать новый класс платы, в которой доска будет набором «ячеек», каждая ячейка будет содержать указатель на каждую соседнюю ячейку (или ноль). если клетка находится на краю). Вы можете реализовать несколько итераторов для класса board, которые будут обходить ячейки.

Вы должны относиться к нему как к списку, а не к вектору. Но это как минимум начало.


Другое решение настроено так: alt text http://img833.imageshack.us/img833/4739/hexgame11x11.gif

и все еще просто используйте [,], чтобы получить доступ к каждой ячейке, но потребуется немного больше математики, чтобы выяснить, пересекаете ли вы ячейки (Вверх справа - [+ 1, -1], справа - [+1,0 ], Вниз вправо - [0, + 1], вниз влево - [-1, + 1], влево - [-1,0], вверх влево - [0, -1])

EDIT

Если вы хотите, чтобы вертикальные стены вместо уклона, просто сделайте ширину (X) равной X + Y * 2, тогда в каждой строке сделайте текущий номер строки (y) и сделайте ячейки от 0 до Yy и от Xy до X выключенными пределы.

Пример:

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

вы тратите немного памяти, но это дает вам такую ​​доску альтернативный текст http://img192.imageshack.us/img192/5580/gridw.png

Если вы Очень умный ©, вы можете просто использовать обычное пространство, но просто иметь свой код, чтобы что-нибудь в этом диапазоне Y-y или X-y находилось на противоположной стороне доски. Но я оставлю этот код читателю.

0 голосов
/ 10 августа 2010

Три направления, влево / вправо, вверх / вниз, смешной угол в одну сторону / в другую сторону.

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