2014-01-06 65 views
0

我正在超級井字遊戲(其基本上井字板的3×3格)創建按鈕方式,一種是SUPER井字遊戲

其中板由具有的按鈕中的3×3塊的點擊方法

private void buttonI_Click(object sender, EventArgs e) 
{ 
    if(jar == true) 
    { 
     buttonI.Text = "X"; 
    } 
    if(jar == false) 
    { 
     buttonI.text = "O"; 
    } 
    jar = !(jar) 
} 

其中jar是一個布爾變量,用於跟蹤每位玩家的輪流。我使用Python腳本來批量生成1 <= I <= 81的代碼,但是......只有我的按鈕1-9具有正確的功能。這些按鈕是使用Visual Studio IDE手動構建的(我只是雙擊它們來創建按鈕單擊方法),但我發現這些按鈕和我批量生成的代碼按鈕之間的語法完全沒有區別。

有些幫助和明確的解釋會很棒!

+0

我的猜測是,你實際上並沒有將代碼連接到按鈕本身。我發現生成接線的最簡單方法是雙擊IDE中的按鈕,讓VS爲您創建連接。 – sous2817

+0

那麼這條佈線究竟如何工作呢?有沒有辦法做到這一點,而沒有實際雙擊所有的按鈕? – frogeyedpeas

+0

當然,你必須將你的方法附加到你的事件上,按照'button1.Clicked + = YourMethodName;'的方向行事。只要看看designer.cs類,你就會看到VS如何連接它們。 –

回答

0

哇..好的。基本規則#1:您是面向對象的。不是MODULAR。爲什麼複製功能?

相反,你可以設置爲按鈕的ID,並對所有按鈕

同一onClick事件定義9個按鈕,每個按鈕與一個ID 0..8 所以,每個按鈕將調用

private void anyButton_Click(object sender, EventArgs e) 
{ 
    // sender is your button! you can use it's .id or anything alike 
    if(jar == true) 
    { 
     buttonI.Text = "X"; 
    } 
    if(jar == false) 
    { 
     buttonI.text = "O"; 
    } 
    jar = !(jar) 
} 
+0

所以我必須做出81行私人無效button_kClick(等...){anyButton_Click(sender,e); }? – frogeyedpeas

+0

不,只有一個!使所有按鈕都轉到相同的onClick方法。您可以使用按鈕的ID參數輕鬆識別哪個按鈕被點擊(或名稱,或什麼) – Shai

+0

您可以進一步解釋這一點嗎?您提供的方法是否正確,因爲它可以處理所有的按鈕,或者還有更多工作要做? – frogeyedpeas

1

避免「批量生產的代碼」...如果以後你需要改變功能,你將不得不改變它的81種方法。這是不可維護的。

那麼,該怎麼辦?

首先,我甚至不會手動將每個按鈕放入窗口。我會讓我的代碼爲我添加每個按鈕。現在,你沒有說你是在做WinForms還是WPF。所以我會假設WPF,因爲它更新,我覺得好多了。

編程方式添加按鈕

創建一個名爲gMainGrid一個Window。然後綁在窗口的Initialize事件:

private void handleWindowInitialized(object sender, EventArgs e) 
{ 
    // Add 3 rows and 3 columns. 
    for (int i = 0; i < 3; i++) 
    { 
    gMain.ColumnDefinitions.Add(new ColumnDefinition()); 
    gMain.RowDefinitions.Add(new RowDefinition()); 
    } 

    // Add button to each cell. 
    for(int row=0; row<3; row++) 
    for (int column = 0; column < 3; column++) 
     createButton(row, column); 
} 

所以,現在,我們已經建立了gMain,讓我們看看方法createButton()

構建按鈕

private void createButton(int row, int column) 
{ 
    var button = new Button(); 

    // Add to gMain 
    gMain.Children.Add(button); 

    // Place the button in the correct cell. 
    Grid.SetRow(button, row); 
    Grid.SetColumn(button, column); 

    // Tie to the click event. 
    button.Click += handleButtonClick; 
} 

是不是很簡單?我們只是創建一個Button,將它添加到gMain,放入正確的單元格,然後綁定到Click事件。現在讓我們看看事件處理程序。

事件處理程序

void handleButtonClick(object sender, RoutedEventArgs e) 
{ 
    var button = (Button)sender; 
    int row = Grid.GetRow(button); 
    int column = Grid.GetColumn(button); 

    // Do what ever you would like to do... 
} 

請注意,我們能夠告訴從這列和行...你應該能夠做你需要的任何邏輯。這很棒,因爲那樣你就不需要一堆不同的方法。