此編程問題似乎旨在教你關於分離問題。如果不是,那應該是。 (現在是!)
你有兩個問題,而不是一個。 (實際上,你有兩個以上,但你有兩個大問題。)一個問題是:如何創建一組代表這個遊戲中的計數器的對象,以及這些對象遵循什麼規則?另一個問題是:如何在屏幕上表示計數器?
如果您的第一個問題的解決方案是創建一堆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)我實際上並沒有試圖爲你做功課。
展示了遊戲應該如何工作的一個PDF可以在這裏找到: http://users.cscs.wmin.ac.uk/~w1128683/csharphelp/Game_Rules.pdf – Exile 2009-12-13 11:56:22
還有其他學生採取這一相同的課程的權利?你不能要求他們中的一個人提供足夠的幫助,讓你度過難以理解的位置? – davewasthere 2009-12-13 12:00:48
首先,您需要點擊例程來確定點擊了哪個計數器。看看你能否弄清楚(提示 - 使用sender參數)。也許從編寫一些代碼開始,只是爲了顯示一個消息說明它是哪個盒子。 – 2009-12-13 12:10:25