2010-12-06 90 views
-1

即時寫一個簡單的國際象棋比賽,有3個副本,一個國王和一個皇后一方,另一個副本只是一個國王,國王和王后應該單獨配合國王少運動。 ,首先我們應該從用戶那裏得到獨立國王的地位,然後根據那個做其他作品,我想知道我怎麼能從用戶那裏得到在哪個地方應該留下的國王?我實現了64個pictureboxes.i的形式將寫類對位置,非常感謝在國際象棋比賽中成爲國王的地方

編輯:

我寫了從先生喬恩斯基特回答驗證碼? 它有什麼樣的錯誤,因爲它沒有做什麼時候我點擊,謝謝

PictureBox[,] pic = new PictureBox[8, 8]; 

public PictureBox SetKingImage(int x,int y) 
    { 


     pic[x,y].Image=Image.FromFile("pic/siyahsah2.JPG"); 
     return pic[x, y]; 
    } 

public void GetClickedPicturebox() 
    { 
     int x, y; 

     for(x=0;x<8;x++) 
     { 
      for(y=0;y<8;y++) 
      { 
       pic[x, y] = new PictureBox(); 

       pic[x, y].Click += (object sender, System.EventArgs e) =>SetKingImage(x, y); 


      } 
      } 
     } 
+2

您是否要求提供UI替代方案的建議以允許用戶選擇棋盤上的位置(例如:在典型的國際象棋字母 - 數字約定中輸入行列,單擊網格,將國王圖像拖放到網格上......)或者這是關於驗證從國王移動到反對棋子位置的有效性嗎? – mjv 2010-12-06 07:19:32

+0

是的,即時通訊詢問用戶界面的替代方案,讓用戶可以找到一個位置,我認爲點擊相關的圖片框是好方法 – Arash 2010-12-06 07:25:31

回答

3

最簡單的方法是要求用戶點擊相關的圖片框。你可以決定哪些圖片框被點擊以下三種方式之一:

  • 訂閱使用每個圖片框相同的事件處理程序,但使用的PictureBox內的標籤來獲取座標
  • 訂閱使用相同的事件處理程序對於每個圖片框,但只是使用參考圖片框(sender)找到到底是哪一個,並獲得適當的座標
  • 訂閱使用lambda表達式它封裝的位置,這樣的:

    for (int x = 0; x < 8; x++) { 
        for (int y = 0; y < 8; y++) { 
         pictureBoxes[x, y].Click += (sender, args) => SetKingPosition(x, y); 
        } 
    } 
    
  • 後者的做法

的一個問題是,從通過lambda表達式事件退訂是比較痛苦的 - 你可能要取消訂閱所有事件處理程序點擊第一個按鈕時。

另一種選擇是留在原地的事件處理程序,並忽略他們,當這不是正確的時間:)

+0

我編輯我的問題,你能幫我嗎?謝謝 – Arash 2010-12-06 08:58:42

+1

@arash:你給的代碼贏了'你甚至可以編譯,因爲你從兩行方法的第一行返回。您是否曾經調用getclickedpicturebox也不清楚。此外,如果您遵循.NET命名約定,它將幫助您的代碼更清晰地閱讀。 – 2010-12-06 09:19:25

3

這裏有一個想法,而不是有很多PictureBoxes的搞亂。

創建一個名爲ChessBoardControl的用戶控件。 ChessBoardControl將負責繪製ChessBoard所提供的對象。

ChessBoardControl中,您可以覆蓋OnMouseDown事件,然後從鼠標的座標中,可以輕鬆計算出哪個廣場被點擊。

1

在新的代碼,你有兩個for循環遍歷Ĵ,但在循環中,您總是指派一個事件處理PIC [X,Y]。

所以你只給pic [0,0]分配一個處理函數。 Xÿ永遠不會改變......

編輯:
坦白說,我不知道我理解你的代碼。你想要GetClickedPicturebox做什麼?你什麼時候打電話?

如果你打算調用它來獲得被點擊的PictureBox,這是錯誤的,因爲你將事件處理程序附加到新的PictureBox實例上,而不是放在窗體上的那些實例上。

如果此方法是作爲初始化方法的意思,那麼它可能是錯誤的,因爲您只是創建新的PictureBox實例,但您沒有在窗體上顯示它們。如果您的窗體上有PictureBox,它們是不同的實例,並且您沒有將事件處理程序附加到正確的事件處理程序。