2012-01-30 4 views
3

私は簡単なドミノゲームを作り始めました。 (同じ番号のタイルを並べて配置したもの)。私はそれをモデル化し始めました、そして、私は今、厳しい場所に着陸したようです。実際のドミノ(「骨」と呼ばれます)をモデル化したIm:ドミノのゲームを構築する - モデリングとレイアウトする

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

競技場が2人の選手と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,3)の値を持つドミノ(ボーン)を取得し、フィールド上に配置したい場合は、私の問題:,

  1. は、どのように私は表現しない来ますそれが配置された場所(例えば、5,5の座標のタイル)
  2. ドミノのタイルは、5,5から右に拡張されますか?
  3. 私はそれを90度回転させて、向きを上にし、180度回転させて左に回し、値は(3,1)になります。
  4. レイアウト、ドミノ、タイルの区別はどのようにしてできますか?

プレイヤーがタイルを置いたときに、その正当な(タイル/ボーンのフィールドを検索する)かどうかを計算する必要があると思います。同じドミノ/ボーンのさまざまなプレースメントが下の画像に示されています。

次の問題は、ドミノ/ボーンをレイアウトすることです。私はグリッドを作ることを考えていますが、それは他のドミノ/ボーンとの間にタイルを置くことには合いません。タイルを配置するとき、私は最初の問題に戻ります:それを法的に検証する方法?それが国境を接するドミノを見つける方法?

これは意味をなさないと思っています。レイアウトと検証の問題が直面していることを説明することは難しいです。

Various domino scenarios

EDIT ゲームに劇中骨を起動すると、次のとおりです。各タイルを逆にすることができる

[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

は法的な動きシナリオAですか?私はあなたがコードしようとしているルールを理解しようとしています。 –

+0

私の怠惰で申し訳ありませんが、ペイントでうまくいきませんので、私は単なる骨を描くことができませんでした。同じ最終値を持つドミノの隣にBone/dominoを置くことしかできないというルールがあります。これは、シナリオaの私の例が間違っていて、ドミノのうちの1つが逆転して、3または1のいずれかが一致することを意味する。隣接する数字が等しい値の(1,3)(3,2)(2,4)(4,5)(5,6)などのようなシーケンスを作成したいと思うでしょう。 –

答えて

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つの可能があるので、それは、バイトまたは列挙型は、ここで行いますオリエンテーション(だ、2次元構造であります値)。

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

とあなたには、いくつかのクラスBonePlacementがあります:合法性をチェックすると、その方向性を仮定して簡単enough-が列挙型である

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 
     } 
    } 
} 
+0

したがって、水平方向に2,2に配置された初期値(3,4)の骨は(3,4)と(4,4)を占めます。垂直配列では、(3,4)と(3,5)それでは逆のことについて、これらのシナリオのそれぞれは、2,3の水平に配置された値の骨(4,3)と一致するように逆にすることができます。すべてのボーンは4つの突然変異を持つことができます(私の画像、左上を参照) –

+0

いいえ、間違っています。水平で逆向きの初期値(3,4)を持つボーンは、骨が複数の細胞を占有する必要はありません。水平方向に(2,1)上に配置された値(5,4)を有する骨は、例えば、許容される次の移動である。私が言ったように、グリッドは論理的であり、視覚的ではありません。 –

1

あなたのグリッドは最小の解像度が.5 *(短辺の長さ)になっているはずですが、Boneの長辺の長さは、短辺の長さ。これにより、シナリオCなど、さまざまな形状設定が可能になります。

別の言い方をすると、正方形のグリッドを使用し、そのグリッドに2x4サイズのボーンをオーバーレイします。

次に、左上隅などのボーンの位置をマーキングするための規約を作成する必要があります。たとえば、座標(3,3)および垂直方向のボーンは、ボードグリッド上の(3,3)にある左上の最も大きなタイルを持つ2×4の垂直ボーンを参照することができます。骨は右に(4,3)、下に(3,6)と(4,6)に伸びています。

次に、ブロックがゲームボードの右端または下端を超えないように、ブロックの配置後にいくつかの検証を実行する必要があります。

ゲームのルールはわかりませんが、IsFlipped boolプロパティを保持しておくと、(1,3)の表示を変更することなく(1,3の前に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; } 
} 

骨の座標を決定するには、このツリー状構造を横切るために再帰的アルゴリズムが必要です。

+0

同意すると、それは非常に自然なバイナリツリーのような構造です。 – Haspemulator