六边形平面的形态和运动表示

5

表示四象限平面(一堆正方形)最基本的方法是使用二维数组。

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

那么,如何表示一个六边形平面(一堆六边形),并且如何处理从一个位置到另一个位置的移动?

注意:这不是纯理论,因为我脑海中有一个需要这种移动的小游戏的想法,但我无法理解如何完成。我查看了其他问题,但没有找到一个好的匹配......


你已经解释了“四元平面”,但六边形平面到底是什么鬼?一个6维平面吗?还是一个形状像六边形的2维平面,带有一堆半方形切片在倾斜的侧面上?这些切割的正方形是可用的位置吗? - Jimmy Hoffa
@Jimmy Hoffa 的一个棋盘示例。http://www.mrlsmath.com/wp-content/uploads/2009/02/hex-game-11x11.gif - Scott Chamberlain
挺有趣的,你提出了这个问题。上周末我刚开始着手开发一个2D六边形瓦片游戏。 - Matthew Whited
2个回答

7
我不知道这是否是最佳解决方案,但我的做法是创建一个新的棋盘类,该类将是“单元格”的集合,每个单元格将包含指向其相邻单元格的指针(如果单元格在边缘上,则为null)。您可以在棋盘类上实现一些迭代器,以遍历单元格。

您需要将其视为列表而不是向量。但至少这是一个开始。


另一个解决方案是将您的板子设置为这样alt text,仍然只使用[,]来访问每个单元格,但需要进行一些数学计算才能确定是否正在遍历单元格(向上右为[+1,-1],向右为[+1,0],向下右为[0,+1],向下左为[-1,+1],向左为[-1,0],向上左为[0,-1])。 编辑 如果您想要垂直墙壁而不是斜坡,请将宽度(X)设置为X + Y * 2,然后在每行中使当前行号(y),并将单元格从0到Y-y和X-y到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);
}

你会浪费一点内存空间,但这会给你一个像这样的板子 alt text
如果你非常聪明,你可以只使用普通的空间,但是让你的代码在 Y-y 或 X-y 范围内的任何东西都在板子的另一侧。但我会留下这个代码给读者自己去实现。

这可能是您最好的解决方案。正方形棋盘和六边形棋盘之间唯一真正的区别在于如何显示它,而不是如何存储它。 - Brian S

0

三个方向,左/右,上/下,有趣的角度一边/另一边。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接