2009-12-13 52 views
0

我正在努力學習C#(對我來說很容易!),並且作爲課程的一部分,我被要求創建一個名爲「三振」的遊戲。無法讓計數器移動(C#中帶有PictureBox的遊戲)。

遊戲規則很簡單。只是將一個計數器敲入另一個計數器,目的是在屏幕上留下一個計數器。

我無法將一個計數器移動到另一個計數器。我使用循環創建了許多圖片框(以組成我的主板),並使用循環創建了一個事件處理函數。我如何使用單個偶數處理程序來移動我的所有計數器?

{ 
    (...) 
    for (int i = 0; i < 8; i++) 
    { 
     for (int j = 0; j < 8; j++) 
     { 
      int x = j * (75); 
      int y = i * (75); 

      pictureBoxCounter[j, i] = new PictureBox(); 
      pictureBoxCounter[j, i].Location = new System.Drawing.Point(x, y); 
      pictureBoxCounter[j, i].Size = new System.Drawing.Size(75, 75); 
      pictureBoxCounter[j, i].BackColor = System.Drawing.Color.Transparent; 
      panelGame.Controls.Add(pictureBoxCounter[j, i]); 
      this.pictureBoxCounter[j, i].Click += new System.EventHandler(this.pictureBoxCounter_Click); 
     } 
    } 
} // end of some function 

private void pictureBoxCounter_Click(object sender, EventArgs e) 
{ 
    //I need some code here but nothing seems to work :(
} 

我已經花了很長時間才解決這個問題。甚至請我的導師幫忙。而不是幫助他設法破壞我的大部分代碼。所以在解決他造成的問題之後,我現在回來了一個編譯程序!

(運行程序時,您將需要輸入玩家的信息,以使開始遊戲按鈕。)

如果我可以與任何其他信息,幫助不要猶豫,問!

+0

展示了遊戲應該如何工作的一個PDF可以在這裏找到: http://users.cscs.wmin.ac.uk/~w1128683/csharphelp/Game_Rules.pdf – Exile 2009-12-13 11:56:22

+1

還有其他學生採取這一相同的課程的權利?你不能要求他們中的一個人提供足夠的幫助,讓你度過難以理解的位置? – davewasthere 2009-12-13 12:00:48

+0

首先,您需要點擊例程來確定點擊了哪個計數器。看看你能否弄清楚(提示 - 使用sender參數)。也許從編寫一些代碼開始,只是爲了顯示一個消息說明它是哪個盒子。 – 2009-12-13 12:10:25

回答

2

此編程問題似乎旨在教你關於分離問題。如果不是,那應該是。 (現在是!)

你有兩個問題,而不是一個。 (實際上,你有兩個以上,但你有兩個大問題。)一個問題是:如何創建一組代表這個遊戲中的計數器的對象,以及這些對象遵循什麼規則?另一個問題是:如何在屏幕上表示計數器?

如果您的第一個問題的解決方案是創建一堆PictureBox es,那麼您將陷入一個兔子洞,它很難退出。你應該先解決第一個問題,然後解決第二個問題。

這裏有一個粗略的草圖(非常粗糙,因爲我不知道這個遊戲的規則),解決的第一個問題的對象模型:

public class Board 
{ 
    public const int Height = 8; 
    public const int Width = 8; 
    private Counters[Height][] Counters { get; set; } 

    public Counter GetCounter(int row, int col) 
    { 
     return Counters[row][col]; 
    } 
    public void Initialize() { } 
    public void ExecuteMove(Counter c) { } 
} 

public class Counter 
{ 
    public int Row { get; set; } 
    public int Column { get; set; } 
} 

所以,一個Counter對象知道它在哪裏(其和Column)。一個對象知道所有Counter對象,它知道如何找到Counter給定它的行和列,並知道如何在計數器被點擊時執行移動。 (我對遊戲的規則一無所知,但他們將生活在ExecuteMove方法中。

現在你可以平凡編寫打印板到控制檯的方法:

public void PrintBoard(Board b) 
{ 
    for (int col = 0; col < board.Width; col ++) 
    { 
     for (int row = 0, row < board.Height; row++) 
     { 
     Counter c = board.GetCounter[row][col]; 
     Console.Write(c == null ? " " : "*"); 
     } 
     Console.WriteLine(); 
    } 
} 

,並輸入法一招:

public Counter InputMove(Board b) 
{ 
    string s; 
    Console.Write("Row: "); 
    s = Console.ReadLine(); 
    int row = Convert.ToInt32(s); 
    if (s == "") return null; 
    Console.Write("Column: "); 
    s = Console.ReadLine(); 
    if (s == "") return null; 
    int column = Convert.ToInt32(s); 
    return b.GetCounter(row, column); 
} 

...現在你有你的一切需要編寫和測試ExecuteMove方法。得到那個工作。我會等。

你完成了嗎?好。有幾個問題可能會遇到,我沒有解決。例如,你可能發現當你移動Counter時,你必須更新板子的數組和計數器本身。而且你也可能發現你必須想出一些方法來跟蹤當Counter被銷燬時會發生什麼。你不高興你不用鼠標點擊和UI元素?

現在爲第二部分。讓我們建立一個知道如何與董事會進行溝通的界面。在你的表格中,循環訪問棋盤上的計數器,爲每個棋子創建一個PictureBox(其位置基於和Column屬性),並將其添加到Dictionary<PictureBox, Counter>,稱爲Counters。您還需要調用Dictionary<Counter, PictureBox>,例如PictureBoxes。通過這些地圖,您可以找到Counter,因爲它的號碼爲PictureBox,反之亦然。

附加此事件處理程序,每個PictureBox

private void PictureBox_Click(object sender, EventArgs e) 
{ 
    PictureBox p = (PictureBox) sender; 
    Counter c = Counters[p]; 
    Board.ExecuteMove(c); 
} 

(這,順便說一句,就是回答你原來的問題。)

嗯,這是一個好主意:你可以點擊在PictureBox上找到它的Counter,然後執行移動。但是如何在界面中更新遊戲的視覺狀態?這取決於遊戲的實際規則。

例如,如果點擊一個櫃檯都會使它消失,你可能一個Visible屬性添加到Counter類,並有Board類的ExecuteMove更新它。如果當Counter變得不可見時,其行中的其他Counter向左或向右移動,則ExecuteMove方法將不得不更新它們的和Column,並對位於該位置的不可見Counter執行一些操作。

但是當你測試所有的遊戲邏輯時,你已經把所有這些都回來了,對吧?您需要在用戶界面中實現的所有方法與您爲打印到控制檯所建立的方法相同。只有這個遍歷板中的所有Counter,並根據它們的狀態更新它們的PictureBox

我在這裏有很多微妙之處,主要是因爲a)我沒有完全理解你的問題,b)我實際上並沒有試圖爲你做功課。

+0

謝謝!是的,我在nobugz回答了我所問的問題後,將遊戲規則和我的項目脫機了。 (規則現在恢復在線)明天晚上我會回來看看這個,因爲我明天有一個最後期限,我需要先見面!再次感謝羅伯特羅斯尼! – Exile 2009-12-14 22:49:57

1

您需要在Click事件處理程序中找到單擊的圖片框。您可以使用發件人參數。平凡:

private void pictureBoxCounter_Click(object sender, EventArgs e) 
    { 
     PictureBox box = sender as PictureBox; 
     box.BackColor = System.Drawing.Color.Coral; 
    } 

但是,你需要實現你的遊戲邏輯爲好,這樣就需要你知道盒子的遊戲板上的位置。您可以使用PictureBox.Tag屬性。它可以存儲點,例如:

... 
        pictureBoxCounter[j, i].BackColor = System.Drawing.Color.Transparent; 
        pictureBoxCounter[j, i].Tag = new Point(j, i); 
        panelGame.Controls.Add(pictureBoxCounter[j, i]); 
... 

    private void pictureBoxCounter_Click(object sender, EventArgs e) 
    { 
     PictureBox box = sender as PictureBox; 
     box.BackColor = System.Drawing.Color.Coral; 
     Point pos = (Point)box.Tag; 
     int row = pos.X; 
     int col = pos.Y; 
     //etc... 
    } 

但你可能想使用存儲不僅僅是行和列數更多信息一個輔助類。

+0

謝謝soo nobugz 你已經度過了我的一天! – Exile 2009-12-13 16:10:03