2016-10-06 1 views
1

私の質問を記述するために私の特定のユースケースを使用しますが、いくつかのデフォルトに基づいてサブクラスを作成する他のアプリケーションがあるかもしれないので、 。これは「私の宿題をする」という質問ではありません。C#のサブクラスを使用した特定のクラスインスタンスの作成

私は現在、単純なテトリスゲームに取り組んでいます。ここでは、私のプレーフィールドをboolで満たされた2次元配列として定義しています。私は関数を追加し、私のコードを分割するクラスのグリッドでこれを行いました。テロミノが特定の場所に移動できるかどうかを確認するために、ある特定の場所にその上に別のグリッドを追加できるかどうかを確認できる機能を開発しました。

テトリミノ(グリッド)はあらかじめ定義された図形とサイズになっているので、各図形を1回作成するだけでよいので、現在の落下ブロックを私が望むように、あらかじめ定義したテトロミノを操作してください。

私はこれらの定義済みの形状を初期化する2つの方法を知っています:最初のグリッド(Columns、Rows)をテトミノごとに1回呼び出し、手動で正しい座標をtrueに設定するイニシャライザのメインTetrisクラスで開始するか、 charクラス(テロミノ名L、J、S、Z、T、X、I)を取得し、すでに構築した他のコンストラクタを使用して3x3または4x4グリッドを初期化し、次に手動で正しい座標を再び真にしてください。

これらの方法はどちらも、醜い感じのクラスに混乱を与えます。私はテクニカルにtetriminosが特定のタイプのグリッドであると考えて、サブクラスを使用する代わりに可能であることを望んでいた

そうのような今まで私が見つけることができるようのためのサブクラスではコンストラクタのみ、サブクラスのコンストラクタに与えられたデフォルトパラメータまたはパラメータに渡すことができます。

class Grid 
{ 
    bool[,] grid; 

    public Grid(int x, int y) 
    { 
     // Creates grid, fills it with bools. 
    } 
} 

class Block : Grid 
{ 
    public Block(char blockShape, int x, int y) : base(x, y) 
    { 
     // Add additional logic here. 
    } 
} 

今、これが通過するために私を必要としますこれはあらかじめ設定されていると考えて奇妙に感じるテトミノの寸法について。私が好むものは、これらの行に沿ったものです。

class Block : Grid 
{ 
    public Block(string blockShape) 
    { 
     if ("IX".Contains(blockShape)) 
     { 
      this = new Grid(4, 4); 
      // Add additional logic here. 
     } 
     if ("JLSZT".Contains(blockShape)) 
     { 
      this = new Grid(3, 3); 
      // Add additional logic here. 
     } 
    } 
} 

これらの行には何かがありますか?もしそうなら、それはどうすればできますか?そうでなければ、グリッドやテトリスクラスを混乱させないクリーンな代替ソリューションがありますか?私は別のことをしなければならないでしょうか?

+0

テトロニノス - うわー、それは言葉です! –

答えて

0

静的な読み取り専用フィールドを使用します。 Tetrominosは不変ですが、一度だけ初期化し、必要な回数だけそれらを再利用する必要があります。

また、私はGridに由来するテロミノについてはあまり確信していません。私にとっては、概念的には非常に異なるものです。前者はあらかじめ設定された不変ブロックであり、後者はダイナミックで変化するプレーフィールドです。私はこれらの2つの要素をまったく組み合わせないだろう。

public class Tetromino 
{ 
    public static readonly Tetromino J = new Tetromino(new[,] { { false, false, true }, .... }); 
    public static readonly Tetromino L = new Terromino(new[,] { { true, false, false } .... }); 
    //and so on... 

    private readonly bool[,] grid; 
    private Tetromino(bool[,] shape) //disallow any other Terronimos from being built. 
    { 
     this.shape = shape; 
     Width = shape.GetLength(0); 
     Height = shape.GetLength(1); 
    } 

    public int Height { get; } 
    public int Width { get; } 
    public bool this[int row, int col] => shape[row, col]; 
} 

そして今、あなたのTetrisGridクラスの内部であなたは、彼らが実際にあるものを形気にせずTetromino秒で作業したい:私は、特定のTetrominoクラスを作成すると思います。特定のフィールドを生成するには、対応するフィールドを使用するだけです。 myPlayingGrid.Add(Tetromino.J)

+0

ありがとうございます、私はこれを実行し、initで一度クラスをインスタンス化すると思います。実際にコードを別のファイルに転送する必要があります。これは最終的に私が後にしたものです。私はちょうどそれがもっとうまくいけばいいと思った。 テトリミノにグリッドクラスを使用する理由は、単純化したことです。グリッドには、ブールではなく、ブロックの色を含むノードが格納されます。これにより、グリッドオブジェクト用の関数を作成することができます。これにより、グリッドの上に特定の位置にテトロミノを描画してから実際に配置することができます。また、テトロミノのクローンを回転させることができます。 –

関連する問題