2016-10-15 75 views
0

嗨, 我正在使用Visual Studio Winforms,我正在嘗試構建井字棋。 我被卡在檢查球員贏的方法。 我試圖在激活時做到這一點。小例子:如何檢查玩家是否在井字棋遊戲中獲勝?

private void StartForm_Activated(object sender, EventArgs e) 
    { 
     if ((_pcb1.Image == imagecircle) && (_pcb2.Image == imagecircle) && (_pcb3.Image == imagecircle)) 
     { 
      MessageBox.Show("You Win!"); 

     } 
     if ((_pcb4.Image == imagecircle) && (_pcb5.Image == imagecircle) && (_pcb6.Image == imagecircle)) 
     { 
      MessageBox.Show("You Win!"); 
     } 

     if ((_pcb7.Image == imagecircle) && (_pcb8.Image == imagecircle) && (_pcb9.Image == imagecircle)) 
     { 
      MessageBox.Show("You Win!"); 
     } 
    } 

(我知道,有更多的情況下取勝)。 它從來沒有進入方法,我試圖找到一種方法,總是在表單打開時激活。請幫助:)

+1

你的方法在如此多的層面上是錯誤的!您需要保留一個表示電路板當前狀態的模型對象。無論何時將圖像放在電路板上,都要用相應的項目標記模型(十字形或圓形)。在模型類中創建一個方法來確定誰贏了(如果有的話)。在每次移動後調用此方法來決定下一步做什麼(顯示消息框或等待下一步移動)。 – dasblinkenlight

+0

你不想鉤住'Activated'。取而代之的是,在玩家點擊時在同一個地方設置X或O來檢查勝利。 – wablab

回答

0

您應該在每位玩家移動後檢查玩家的勝利。我假設你的玩家通過點擊「Make a Move」按鈕或點擊遊戲區域來進行動作。另外我假設,你有Click事件的按鈕或遊戲場。所以你應該將你的支票代碼粘貼到你的按鈕或遊戲領域的Click事件中。

+0

@ user3393134如果這個答案對你有幫助,請接受它。 –

0

下面是一些代碼,它將擴展到任何遊戲大小:

public class Level 
{ 
    private readonly Team[,] _game; 

    public Level(int extent) 
    { 
     _game = new Team[extent, extent]; 
    } 

    public bool HasWon(Team team) 
    { 
     var yMax = GetYMax(); 
     var xMax = GetXMax(); 
     var won = false; 

     // check horizontally 
     for (var y = 0; y < yMax; y++) 
     { 
      won = false; 
      for (var x = 0; x < xMax; x++) 
       won |= _game[y, x] == team; 

      if (won) return true; 
     } 

     // TODO check vertically 

     // TODO check diagonally 

     return won; 
    } 

    public void SetTile(Team team, int x, int y) 
    { 
     var xMax = GetXMax(); 
     var yMax = GetYMax(); 

     if ((x < 0) || (x > xMax)) 
      throw new ArgumentOutOfRangeException("x"); 

     if ((y < 0) || (y > yMax)) 
      throw new ArgumentOutOfRangeException("y"); 

     _game[y, x] = team; 
    } 

    private int GetXMax() 
    { 
     var xMax = _game.GetUpperBound(1); 
     return xMax; 
    } 

    private int GetYMax() 
    { 
     var yMax = _game.GetUpperBound(0); 
     return yMax; 
    } 
} 

public enum Team 
{ 
    Red, 
    Blue 
} 

事情給你做:

  • 實現邏輯,用於檢查團隊垂直或斜
  • 贏得
  • 使用此類實現您的遊戲,根據數組繪製圖片_game(使其公開可用)
  • 研究|或操作者瞭解它是如何在這裏使用:https://msdn.microsoft.com/en-us/library/6373h346.aspx
  • 進一步調試代碼(我沒有:)
0

如果你想找到一些方法,是不斷調用,從而爲了檢查玩家是否贏了,您可以創建一個每1毫秒運行一次的Timer。然後Timer.Tick的事件處理程序就是這樣一種方法。

但是,你不應該找到這樣的方法來檢查輸贏。每1毫秒檢查一次就浪費資源。

想一下,什麼樣的動作會影響到遊戲的結果?當然,當任一玩家在棋盤上放置一些東西(X或O)時! 是你需要檢查是否有人贏了。另外,如果放置的東西是X,則不需要檢查玩O的玩家是否贏了,因爲這根本不可能!

此外,檢查圖片框中的圖像是否等於X或O圖像實際上是「非抽象」代碼。嘗試通過抽象將這些東西放入模型中。