我开始做一个简单的多米诺骨牌游戏。(把数字相同的瓷砖放在一起的那个)。我开始做模特,现在我似乎陷入了困境。我正在模拟真正的多米诺骨牌(称为“骨头”):
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);
}
}比赛场地有两个玩家和一个骨场(多米诺骨牌不给玩家),然后是一块瓷砖清单。
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; }
}
}现在我的问题来了:
如果我得到一个多米诺骨牌(
我想在某个时候,我需要弄清楚,当一个球员放置一个瓷砖-计算它是否合法(搜索字段的瓷砖/骨头)。同一多米诺骨牌/bone的不同位置如下图所示。
下一个问题是布局多米诺骨牌/骨牌,我正在考虑做一个网格,但这不适合放置瓷砖“横跨”其他多米诺骨牌/骨头。当放置瓷砖时,我又回到了第一个问题:如何验证它的合法性?如何找到与它接壤的多米诺骨牌?
希望这是有意义的-我发现很难描述布局和验证问题,我面临。

编辑当游戏开始时,游戏中的骨头是:
[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。
发布于 2012-01-30 19:09:41
网格似乎是一种合理的方法,但它是一个逻辑网格,与瓷砖的物理布局没有直接关系。假设网格是一个二维结构,大致上是
(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
}
}
}发布于 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列表并计算分数。
发布于 2012-01-30 19:00:12
把骨头连在一起怎么样?
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; }
}为了确定骨骼的坐标,你需要一个递归算法来遍历这个树状结构。
https://stackoverflow.com/questions/9069087
复制相似问题