六角形平面的形状和运动表示

All*_*enG 5 c# theory algorithm

表示四角平面(一组正方形)的最基本方法是使用二维阵列.

在C#中,我们将其声明为int[,]并且可以使我们的飞机尽可能大:

string[3,3] => tic-tac-toe board (or similar)
string[8,8] => chess or checkers board
Run Code Online (Sandbox Code Playgroud)

为了"移动"飞机上的物品,我们只需将其移至新的"位置"

//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;
Run Code Online (Sandbox Code Playgroud)

那么,你将如何表示一个六边形平面(一堆六边形)以及如何处理从一个位置到下一个位置的移动?

注意:这不是纯粹的理论,因为我有一个想法,在我的头脑中需要这种运动的小游戏,但我无法绕过如何做到这一点.我在这里看了一些其他的问题,但真的找不到一个好的比赛......

Sco*_*ain 7

我不知道这是否是最佳解决方案,但我要做的是创建一个新类型的电路板,电路板将是"单元"的集合,每个单元将包含指向其每个相邻单元的指针(如果单元格则为null)是在边缘).您可以在Board类上实现一些可以遍历单元格的迭代器.

您将不得不将其视为List而不是vector.但这至少是一个开始.


另一种解决方案是让你登上这样的替代文本http://img833.imageshack.us/img833/4739/hexgame11x11.gif

并且仍然只是使用[,]来访问每个单元格,但是需要更多的数学来判断你是否正在遍历单元格(向右是[+ 1,-1],右边是[+ 1,0],向下右边是[0,+ 1],左下边是[-1,+ 1],左边是[-1,0],左边是[0,-1])

编辑

如果你想要垂直墙而不是倾斜,只需要使你的宽度(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);
}
Run Code Online (Sandbox Code Playgroud)

你浪费了一点内存空间,但它给你一块像这样的 替代文本http://img192.imageshack.us/img192/5580/gridw.png

如果你是非常聪明的话,你可以使用普通空间,但只需让你的代码有任何Yy或Xy范围内的任何东西都在电路板的另一侧.但是,请将代码留给读者.