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

时间:2010-08-09 19:34:40

标签: c# algorithm theory

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

在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 个答案:

答案 0 :(得分:7)

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

你必须更像是List而不是矢量。但这至少是一个开始。


另一个解决方案就是设置为alt text 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);
}

你浪费了一点内存空间,但它给你一块这样的板子 alt text http://img192.imageshack.us/img192/5580/gridw.png

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

答案 1 :(得分: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--; }
}