建立一个多米诺骨牌游戏 - 建模和布局

时间:2012-01-30 18:47:50

标签: c# java

我开始做一个简单的多米诺骨牌游戏。 (您将瓷砖的相同数字放在彼此旁边的那个)。我开始对它进行建模,现在我似乎陷入了困境。我模拟了实际的多米诺骨牌(称为“骨头”):

namespace DominoCore
{
    public enum BoneOrientation { Horizontal, Vertical }

    public interface IBone
    {
        int FirstValue { get; }
        int SecondValue { get; }
        BoneOrientation Orientation { get; set; }
    }
}

在这种类型之后,我需要将它们放在比赛场地上。我用方形瓷砖做了一个运动场:

namespace DominoCore
{
    public interface IField
    {
        IPlayer FirstPlayer { get; }
        IPlayer SecondPlayer { get; }
        IBoneYard BoneYard { get; }
        List<ITile> Tiles { get; }

        void PlaceBone(IPlayer player, IBone bone, int startX);
    }
}

比赛场地有两名球员和一名Boneyard(没有给予球员的多米诺骨牌),然后是一系列牌。

namespace DominoCore
{
    public enum BoneExpandDirection { Up, Down, Right, Left }

    public interface ITile
    {
        int X { get; }
        int Y { get; }
        IBone Bone { get; set; }
        BoneExpandDirection ExpandDirection { get; set; }
    }
}

现在出现了我的问题:

  1. 如果我得到一个价值为(1,3)的多米诺骨牌(骨头),并想把它放在场地上,我该如何表示它的位置(例如坐标为5,5的瓦片)
  2. 多米诺骨牌是否从5,5向右扩展?
  3. 如果我将它旋转90度,然后方向向上,将其向左旋转180度然后向左旋转 - 现在值(3,1)。
  4. 如何区分布局,多米诺骨牌和瓷砖?
  5. 我想在某些时候我需要弄清楚,当玩家放置一块瓷砖时 - 计算它是否合法(搜索瓷砖/骨头的字段)。相同多米诺骨牌/骨骼的各种位置如下图所示。

    接下来的问题是布置多米诺骨牌/骨头,我正在考虑制作一个网格,但这不适合放置一个“横跨”(垂直)其他多米诺骨牌/骨头的瓷砖。放置瓷砖时,我回到了第一个问题:如何验证它的合法性?如何找到与之接壤的多米诺骨牌?

    希望这是有道理的 - 我发现很难描述我面临的布局和验证问题。

    Various domino scenarios

    修改 在开始游戏时,Bones在游戏中是:

    [6,6] [6,5] [6,4] [6,3] [6,2] [6,1] [6,0]
    [5,5] [5,4] [5,3] [5,2] [5,1] [5,0]
    [4,4] [4,3] [4,2] [4,1] [4,0] 
    [3,3] [3,2] [3,1] [3,0]
    [2,2] [2,1] [2,0]
    [1,1] [1,0]
    [0,0]
    

    每个瓷砖都可以反转,这意味着瓷砖[6,3]也可以翻转180度并用作[3,6]

3 个答案:

答案 0 :(得分:2)

假设骨骼长边的长度是短边长度的倍数,您的网格应该具有.5 *(短边长度)的最小分辨率。这将允许各种不同的形状配置,例如方案C.

换句话说,使用方格,然后在该网格上叠加2x4大小的骨骼。

接下来,您应该提出一个标记骨骼位置的约定,例如左上角。例如,具有坐标(3,3)和垂直方向的骨骼可以指的是2x4垂直骨骼,其左上方最平铺位于板网格上的(3,3)处。骨骼将延伸至右侧的(4,3),底部的(3,6)和(4,6)。

然后,您需要在块放置后运行一些验证,以确保Bone不会超过游戏板的右边缘或底边缘。

我不知道游戏的规则,但它可能有助于保持一个IsFlipped bool属性,它会以不同的方式显示(1,3)(1之前的1或反之亦然)而不改变Bone的内部表示值。

就评分而言,您可以维护一些有关哪些Bones链接到Bone实现中的其他骨骼的信息,并使用该信息在放置块时保持分数的运行记录,或者使用其他一些规则集对象使用骨骼列表并随时计算得分。

答案 1 :(得分:1)

如何将骨头链接在一起?

public interface IBone
{
    int FirstValue { get; }
    int SecondValue { get; }
    BoneOrientation Orientation { get; set; }
    IBone left { get; set; }
    IBone right { get; set; }
    IBone upper { get; set; }
    IBone lower { get; set; }
}

为了确定骨骼的坐标,您需要一个递归算法来遍历这个树状结构。

答案 2 :(得分:0)

似乎网格是一种合理的方法,但它是一个逻辑网格,并不直接与切片的物理布局相关联。假设网格是二维结构,大致

(0,0),(0,1),(0,2),(0,3)
(1,0),(1,1),(1,2),(1,3)
(2,0),(2,1),(2,2),(2,3)
(3,0),(3,1),(3,2),(3,3)

然后你需要跟踪一个图块所在的单元格及其方向(这里有一个字节或枚举,因为只有4个可能的值)。检查合法性是很容易的 - 假设方向是枚举:

public enum BoneOrientation {
    Horizontal = 0
    Vertical = 1
    Reversed = 2
}

你有一些类BonePlacement:

public class BonePlacement {
    public int X { get; set; }
    public int Y { get; set; }
    public BoneOrientation Orientation { get; set; }
    public IBone Bone { get; set; } 
}

最后,

// Assuming you have some `List<BonePlacement>` called placements
public boolean ValidNextMove(BonePlacement placement) {
    if (placements.Count == 0) return true; // presumably the first move is always allowed
    if ((placement.Orientation && BoneOrientation.Horizontal) == BoneOrientation.Horizontal) {
        // The move being tested is a horizontal placement
        if ((placement.Orientation && BoneOrientation.Reversed) == BoneOrientation.Reversed) {
            // The tile is reversed
            // Check for a neighboring tile in an acceptable configuration
        } else {
            // The tile is not reversed
            // Check for a neighboring tile in an acceptable configuration
        }
    } else {
        // The move being tested is a vertical placement
        if ((placement.Orientation && BoneOrientation.Reversed) == BoneOrientation.Reversed) {
            // The tile is reversed
            // Check for a neighboring tile in an acceptable configuration
        } else {
            // The tile is not reversed
            // Check for a neighboring tile in an acceptable configuration
        }
    }
}