2011-04-24 82 views
2

所以,我試圖仿效的WinForms的掃雷遊戲,只是作爲一個練習。到目前爲止,我有兩個類,一個叫做「單元」,它來自常規的按鈕類,但它自己的屬性和一個處理邏輯的類很少(基本上我製作了一個填充了「單元格」類型對象的二維數組,並用炸彈填充它)。我遇到了一個問題 - 如何將我的「單元格」按鈕控件數組附加到表單上?從頭開始重寫所有內容?這兩個課程顯然都還沒有完成,只是我想檢查它在表單上的外觀,並意識到我被卡住了。幫助我簡單的WinForms遊戲

這裏是我的Cell類

class Cell : Button 
{ 
    //private GraphicsPath path; 

    const int width = 20; 
    const int height = 20; 

    public byte Value { get; set; } 
    public bool IsBomb { get; set; } 

    public Cell() 
    { 

    } 

    public Cell(int x, int y) 
    { 
     this.Location = new Point(x, y); 
    } 

    protected override void OnPaint(PaintEventArgs pevent) 
    { 
     base.OnPaint(pevent); 

     this.Width = width; 
     this.Height = height; 

    } 

    protected override void OnClick(EventArgs e) 
    { 
     base.OnClick(e); 
     this.Text = Value.ToString(); 

    } 
} 

這裏是我的數組類

class CellArray 
{ 
    private int _rows = 0; 
    private int _columns = 0; 
    private int _bombAmount = 0; 
    private Random rand; 
    private Cell[,] cellMatrix; 

    public CellArray(int rows, int columns, int bombAmount) 
    { 
     _rows = rows; 
     _columns = columns; 
     _bombAmount = bombAmount; 
     populate(); 
     setBombs(); 
    } 

    private void populate() 
    { 
     cellMatrix = new Cell[_rows, _columns]; 

     for (int i = 1; i < _rows; i++) 
     { 
      for (int j = 1; j < _columns; j++) 
      { 
       cellMatrix[i, j] = new Cell(); 
       cellMatrix[i, j].IsBomb = false; 

      } 
     } 
    } 

    private void setBombs() 
    { 
     //*****************************************QUESTIONABLE************************************ 
     rand = new Random(); 
     int k = 1; 
     while (k < _bombAmount) 
     { 
     Flag: 
      { 
       int i = rand.Next(_rows); 
       int j = rand.Next(_columns); 
       if (cellMatrix[i, j].IsBomb == false) 
        cellMatrix[i, j].IsBomb = true; 
       else 
        goto Flag; 
      } 
     } 
     //*****************************************QUESTIONABLE************************************ 

     for (int i = 1; i < _rows; i++) 
     { 
      for (int j = 1; j < _columns; j++) 
      { 
       if (cellMatrix[i - 1, j - 1].IsBomb == true) 
       { 
        cellMatrix[i, j].Value++; 
       } 
       if (cellMatrix[i - 1, j].IsBomb == true) 
       { 
        cellMatrix[i, j].Value++; 
       } 
       if (cellMatrix[i, j - 1].IsBomb == true) 
       { 
        cellMatrix[i, j].Value++; 
       } 
       if (cellMatrix[i - 1, j + 1].IsBomb == true) 
       { 
        cellMatrix[i, j].Value++; 
       } 
       if (cellMatrix[i, j + 1].IsBomb == true) 
       { 
        cellMatrix[i, j].Value++; 
       } 
       if (cellMatrix[i + 1, j + 1].IsBomb == true) 
       { 
        cellMatrix[i, j].Value++; 
       } 
       if (cellMatrix[i + 1, j].IsBomb == true) 
       { 
        cellMatrix[i, j].Value++; 
       } 
       if (cellMatrix[i + 1, j - 1].IsBomb == true) 
       { 
        cellMatrix[i, j].Value++; 
       } 
      } 
     } 

    } 

} 
+1

也,你不需要在setBombs goto語句(它有對碼流沒有影響) – Asher 2011-04-24 19:20:21

+0

不分配寬度和高度在OnPaint方法,只是在構造函數中 – Stormenet 2011-04-24 19:23:44

+0

舍設定他們一次,它確實如此 - 如果在某個位置已經有炸彈,它就會再次進行這個循環,以確保所有的炸彈都被種植,並且有些位置不會播種兩次或更多次。 – Max 2011-04-24 19:31:14

回答

1

我怎麼重視的 「細胞」 按鈕控制我的數組形式

這個問題是可以解決類似於此:

Using programatically created CheckBoxes in Windows Form [C#]

的想法是使用YourForm.Controls.Add(...)。不要忘記在表格座標系統中爲您的單元格/按鈕提供適當的位置。

當然,我想提一下,恕我直言從Button派生Cell是一個可怕的設計決定。更好的數據類(比如Cell)從GUI類完全分開(如Button),然後選擇喜歡的一個亞設在他的第一個答案提出的技術(細胞添加到每個按鈕的Tag屬性)來創建Cell對象之間的連接和相應的Button對象。

+0

由於內存問題或?但是我最終會以同樣的方式創建相同數量的按鈕,爲什麼不呢? – Max 2011-04-24 20:33:15

+0

@Max:有噸的原因,你應該引入層(至少一個數據層和UI層)在幾乎任何種類的程序,我認爲沒有足夠的空間在這裏一一列舉。我只想說:當你選擇忽略我的建議,不要說我沒有提醒你,當你遇到麻煩後,當你的程序的發展,你來到這裏,你需要有處理純的細胞數據點,不「按鈕」屬性。 – 2011-04-24 20:54:37

+0

你的建議非常感謝,我不會忽視它:) – Max 2011-04-24 21:04:32