2016-10-06 61 views
1

我將使用我的具體用例來描述我的問題,但考慮到可能有其他應用程序想要根據某些默認值創建子類,它應該更廣泛適用。這並不意味着成爲「爲我做作業」的問題。通過C#中的子類創建特定的類實例

我目前正在研究一個簡單的俄羅斯方塊遊戲,我已經將我的遊戲場定義爲一個填充了bools的二維數組。我在一個類的Grid中添加了函數並分離了我的代碼。我開發了一個函數,讓我檢查是否可以在某個位置添加另一個Grid,以檢查Tetromino是否可以移動到某個位置。 (不是兩個bools在一個位置上都是如此)

由於tetrominos(也是網格)具有預定義的形狀和大小,因此只需創建一次每個形狀,然後我可以將當​​前的下降塊設置爲那個預定義的tetromino可以按照我的意願操作。

現在我知道了初始化這些預定義形狀的兩種方法:在初始化程序中的Tetris主類中啓動它們,其中我爲每個tetromino調用一次Grid(Columns,Rows)並手動將正確的座標設置爲true,或者在Grid類中創建第二個構造函數,該構造函數接受char(tetromino名稱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. 
    } 
} 

現在,這需要我傳球在tetromino的尺寸,這感覺很奇怪,因爲這將被預先設定。我更希望是沿着這些路線的東西:

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. 
     } 
    } 
} 

是沿着這些線路可能的東西嗎?如果是這樣,那該怎麼辦?如果沒有,是否有一個乾淨的替代解決方案,不會混亂我的Grid或Tetris類?我應該做其他事嗎?

+0

Tetrominos - 哇,這是一個字! –

回答

0

我只是使用靜態只讀字段。 Tetrominos是不可改變的,你只需要初始化它們一次,並根據需要多次重複使用它們。

此外,我不太相信tetrominos派生自Grid。對我來說,它們在概念上是非常不同的東西;前者是預設的不可變塊,後者是動態變化的競技場。我不會混淆這兩個因素。我想創建一個特定Tetromino類:

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的工作而無需關心什麼形狀他們真的是。要產生一個特定的,你只需使用相應的領域; myPlayingGrid.Add(Tetromino.J)

+0

謝謝,我想我會爲此嘗試在init中實例化該類。它確實應該將代碼轉移到一個單獨的文件中,這最終是我所追求的。我只是希望它可以更整潔。 爲tetrominos使用網格類的原因是我簡化了;網格存儲節點,而不是布爾,它們也包含塊的顏色。這將允許我爲網格物體創建一個函數,這會讓我在實​​際放置網格物體之前在特定位置上繪製tetromino。以及允許旋轉tetromino的克隆。 –

相關問題