2016-10-15 46 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图像实际上是“非抽象”代码。尝试通过抽象将这些东西放入模型中。