【问题标题】:Form and movement representation of a hexagonal plane六边形平面的形式和运动表示
【发布时间】:2011-03-27 11:45:19
【问题描述】:

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

在 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维平面?或者它是一个二维平面,形状像一个六边形,在斜边上有一堆半方形切片?切片的正方形有可用的位置吗?
  • 你提出这个问题真有趣。上周末我刚开始制作一个 2D 六边形瓷砖游戏。

标签: c# algorithm theory


【解决方案1】:

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

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


另一种解决方案是让您像这样

并且仍然只是使用 [,] 来访问每个单元格,但是如果您正在遍历单元格,则需要更多的数学计算(右上是 [+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);
}

你浪费了一点内存空间,但它给你一个像这样的板

如果您非常聪明©,您可以只使用普通空间,但只需让您的代码在板的另一侧有 Y-y 或 X-y 范围内的任何内容。但我将把代码留给读者。

【讨论】:

  • 这可能是您最好的解决方案。方格板和六角板之间的唯一真正区别在于您如何显示它,而不是如何存储它。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2015-03-22
    • 1970-01-01
    相关资源
    最近更新 更多