首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >建立多米诺骨牌游戏-建模和布局

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

Stack Overflow用户
提问于 2012-01-30 18:47:50
回答 3查看 4.5K关注 0票数 3

我开始做一个简单的多米诺骨牌游戏。(把数字相同的瓷砖放在一起的那个)。我开始做模特,现在我似乎陷入了困境。我正在模拟真正的多米诺骨牌(称为“骨头”):

代码语言:javascript
复制
namespace DominoCore
{
    public enum BoneOrientation { Horizontal, Vertical }

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

在这种类型之后,我需要把它们放在运动场上。我创造了一个有方形瓷砖的运动场:

代码语言:javascript
复制
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);
    }
}

比赛场地有两个玩家和一个骨场(多米诺骨牌不给玩家),然后是一块瓷砖清单。

代码语言:javascript
复制
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. 如何区分布局、多米诺和瓷砖?

我想在某个时候,我需要弄清楚,当一个球员放置一个瓷砖-计算它是否合法(搜索字段的瓷砖/骨头)。同一多米诺骨牌/bone的不同位置如下图所示。

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

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

编辑当游戏开始时,游戏中的骨头是:

代码语言:javascript
复制
[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。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-30 19:09:41

网格似乎是一种合理的方法,但它是一个逻辑网格,与瓷砖的物理布局没有直接关系。假设网格是一个二维结构,大致上是

代码语言:javascript
复制
(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个可能的值)。检查合法性是很容易的--假设定向是一个谜:

代码语言:javascript
复制
public enum BoneOrientation {
    Horizontal = 0
    Vertical = 1
    Reversed = 2
}

还有一些类BonePlacement:

代码语言:javascript
复制
public class BonePlacement {
    public int X { get; set; }
    public int Y { get; set; }
    public BoneOrientation Orientation { get; set; }
    public IBone Bone { get; set; } 
}

最后,

代码语言:javascript
复制
// 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
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2012-01-30 18:59:29

看起来你的网格应该有一个最小分辨率的.5*(短边的长度),假设骨的长边的长度是短边长度的倍数。这将允许各种不同的形状配置,例如场景C。

换句话说,使用正方形网格,然后在该网格上覆盖2x4大小的Bones。

接下来,您应该想出一个标记骨头位置的约定,比如左上角。例如,具有坐标(3,3)和垂直方向的骨可以指2x4垂直骨,其左上大部分瓷砖位于板网格上(3,3)。骨延伸至右侧(4,3),底部(3,6)和(4,6)。

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

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

就评分而言,您可以维护关于哪些Bones链接到您的骨实现中的其他Bones的信息,并使用这些信息在放置块时保存分数的运行记录,或者有其他规则集对象,这些对象可以在任何时候消耗Bones列表并计算分数。

票数 2
EN

Stack Overflow用户

发布于 2012-01-30 19:00:12

把骨头连在一起怎么样?

代码语言:javascript
复制
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; }
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9069087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档