我开始做一个简单的多米诺骨牌游戏。 (您将瓷砖的相同数字放在彼此旁边的那个)。我开始对它进行建模,现在我似乎陷入了困境。我模拟了实际的多米诺骨牌(称为“骨头”):
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; }
}
}
现在出现了我的问题:
我想在某些时候我需要弄清楚,当玩家放置一块瓷砖时 - 计算它是否合法(搜索瓷砖/骨头的字段)。相同多米诺骨牌/骨骼的各种位置如下图所示。
接下来的问题是布置多米诺骨牌/骨头,我正在考虑制作一个网格,但这不适合放置一个“横跨”(垂直)其他多米诺骨牌/骨头的瓷砖。放置瓷砖时,我回到了第一个问题:如何验证它的合法性?如何找到与之接壤的多米诺骨牌?
希望这是有道理的 - 我发现很难描述我面临的布局和验证问题。
修改 在开始游戏时,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]
答案 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
}
}
}