基本的tic tac toe游戏不承认胜利

时间:2014-01-22 14:55:52

标签: c# visual-studio-2012

我正在尝试创建一个基本的tic tac toe游戏。当我第一次创建这个时,用户会点击一个图像框,然后该图像框将变为相应的玩家计数器。图像位置将存储在变量中,并应用类似于:

string Cross = "ProjectFile/etc/..";
Image1.ImageLocation = Cross;

为了看看玩家是否完成了三行,我有2个if语句,一个用于十字架,一个用于圆圈:

if(image1.ImageLocation == Cross && Image2.ImageLocation == Cross && Image3.ImageLocation == Cross)
{
  //Display message box, you've won etc.
}

这很好用,但我意识到在发布此文件时,图像位置不会存在于另一台计算机上。所以我将图像放入资源文件中。并像这样使用它们:

Position1.Image = Properties.Resources.Cross;

这在将图像加载到游戏上时工作正常但是当检查玩家是否赢了,它不能识别完整的行时,我正在使用这样的if语句:

if ((Position1.Image == Properties.Resources.Cross && Position2.Image == Properties.Resources.Cross && Position3.Image == Properties.Resources.Cross) || //etc.

如何查看图片框所使用的图像是否与资源文件中的图像相同?

2 个答案:

答案 0 :(得分:2)

我会重新构建游戏逻辑,不检查图像,而是创建一个int值的3x3矩阵。然后将空白分配为0,将X分配为1,将O分配为2.(更新:现在enum值)

在图像框OnClick事件上,拍摄特定图像框,将其索引计算到矩阵中,并将值设置为适当的值。然后检查是否有胜利者。

获胜逻辑可以是这样的:(更新为enum而不是int。感谢Matt Burland!)

enum TicTacToeSquare
{
    Blank,
    X,
    O
}

...

private TicTacToeSquare[][] _board;

...

public bool IsWinner(TicTacToeSquare player)
{
    if(player == TicTacToeSquare.Blank)
        return false;

    if(_board.Any(i => i.All(ii => ii == player)))
        return true;

    for(int i = 0; i < 3; i++)
    {
        if(_board.All(item => item[i] == player))
            return true;
    }

    if(_board[0][0] == _board[1][1] && _board[1][1] == _board[2][2])
        return true;

    if(_board[0][2] == _board[1][1] && _board[1][1] == _board[2][0])
        return true;

    return false;
}

这只是一个快速刺伤,我会在你最终确定它之前检查它。

答案 1 :(得分:0)

您正在尝试比较参考。 Position1.Image是对该图像的引用,Properties.Resources.Cross是不同的引用,可能是同一图像,但也可能不是。我会创建一个包含某种图像ID或图像名称的新对象,而不是直接比较图像,比较名称或ID。或者,您可以覆盖EqualsGetHashCode方法,以便直接比较2个图像对象,但这比OOP时更喜欢做的工作。

相关问题