如何检查玩家是否在井字游戏中获胜?

时间:2016-10-15 13:22:06

标签: c# winforms tic-tac-toe

嗨, 我正在研究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!");
        }
    }

(我知道有更多的情况可以赢)。 它永远不会进入方法,我试图找到一个在表单打开时始终处于活动状态的方法。请帮助:)

3 个答案:

答案 0 :(得分:0)

你应该在玩家每次移动后检查玩家的胜利。我假设,你的玩家通过点击"移动"按钮或单击游戏字段。另外我假设您有按钮或游戏区域Click事件。因此,您应该将检查代码粘贴到按钮或游戏字段的Click事件中。

答案 1 :(得分: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绘制图片(公开发布)
  • 研究| OR运算符以了解它在这里的用法:https://msdn.microsoft.com/en-us/library/6373h346.aspx
  • 进一步调试代码(我没有:)

答案 2 :(得分:0)

如果你想找到一些经常被调用的方法,以便检查玩家是否赢了,你可以创建一个每1毫秒运行一次的Timer。然后Timer.Tick的事件处理程序就是这样一种方法。

但是,你不应该找到这样的方法来检查输赢。每1毫秒检查一次是浪费资源。

想一想,什么动作可以影响tic tac toe游戏的结果?当然,当任一玩家在棋盘上放置某些东西(X或O)时! 是你需要检查某人是否赢了的时候。此外,如果放置的东西是X,你不需要检查正在玩O的玩家是否赢了,因为那根本不可能!

另外,检查图片框中的图像是否等于X或O图像实际上是非抽象的&#34;码。尝试通过抽象将这些东西放入模型中。

相关问题