为什么这个if语句不能在我的窗体上运行?

时间:2015-12-09 04:43:50

标签: c# winforms

我正在制作一个tic tac toe游戏但是它的8x8而不是3x3点击所选按钮变为黑色或红色点的图像。在检查获胜者功能时,我认为在H4和H5都被检查为黑色之后,将以下代码立即弹出“Winner”,但没有任何反应。

private void Form1_Load(object sender, EventArgs e)
{
    p1Turn.Checked = true;
}

public void CheckForWinner()
{
    if (H4.Image == Properties.Resources.black2)
    {
        MessageBox.Show("Winner");
    }
}

public void PlayerTurn()
{
    if (p1Turn.Checked == true)
    {
        p1Turn.Checked = false;
        p2Turn.Checked = true;
    }
    else 
    {
        p2Turn.Checked = false;
        p1Turn.Checked = true;
    }
}

private void A1_Click(object sender, EventArgs e)
{
    if (A1.Image == null)
    {
        if (p1Turn.Checked == true)
        {
            A1.Image = Properties.Resources.black2;
        }
        else
        {
            A1.Image = Properties.Resources.red_2;
        }
        PlayerTurn();
    }
}

private void A2_Click(object sender, EventArgs e)
{
    if (A2.Image == null)
    {
        if (p1Turn.Checked == true)
        {
            A2.Image = Properties.Resources.black2;
        }
        else
        {
            A2.Image = Properties.Resources.red_2;
        }
        PlayerTurn();
    }
}

3 个答案:

答案 0 :(得分:4)

删除“;”,编写以下代码..

 if ((H4.Image == Properties.Resources.black2) && (H5.Image == Properties.Resources.black2))
        {

            MessageBox.Show("Winner");
        }

答案 1 :(得分:2)

您的问题是您正在检查通过重复调用属性Properties.Resources.black2返回的图像的引用相等性:

    if (H4.Image == Properties.Resources.black2)
    {
        MessageBox.Show("Winner");
    }

不幸的是,每次从资源中获取图像资源时,资源管理器都可以创建图像的新实例。您只需执行以下操作即可检查:

    var same = (Properties.Resources.black2 == Properties.Resources.black2);
    Console.WriteLine(same); // Prints False

因此,您无法使用图片资源值来记住程序的状态信息,并且必须使用其他内容,例如tag中建议的this answer

要进行确认,请参阅ResourceManager.GetObject()的文档:

  

如果使用相同的name参数多次调用GetObject方法,请不要依赖于每次调用时返回对同一对象的引用的方法。这是因为GetObject方法可以返回对缓存中现有资源对象的引用,或者它可以重新加载资源并返回对新资源对象的引用。

答案 2 :(得分:1)

在设置图像时,使用相关的字符串标记设置H4和H5的标记属性,如下所示。

H4.Tag = "black2";
H5.Tag = "black2";

然后比较if语句中的标记属性,如下所示。

if (H4.Tag == "black2" && H5.Tag == "black2")
{

    MessageBox.Show("Winner");
}