我正在制作一个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();
}
}
答案 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");
}