我正在尝试为PC制作热门游戏“ Ruzzle ”,请参阅:
我认为这是一个非常愚蠢的错误,但由于某种原因,它看起来像一个属性不起作用!
我有一个名为“check”的类,它有一个名为Used
的bool属性。如果设置为true,则背景将从白色变为橙色。这是通过以下方式实现的:
bool _used;
public bool Used
{
get { return _used; }
set { _used = value; Invalidate(); }
}
void Check_Paint(object sender, PaintEventArgs e)
{
Graphics area = e.Graphics;
if (_used==false)
{
area.FillRectangle(Brushes.White, 0, 0, Width - 1, Height - 1);
...
}
else
{
area.FillRectangle(Brushes.Orange, 0, 0, Width - 1, Height - 1);
...
}
}
我已将mouseClick
分配给我将在课程Ruzzle
中定义的事件。
类Ruzzle
处理的游戏基本上是Check
的二维数组。
public event EventHandler selected;
//in the constructor I've put this
this.MouseClick += new MouseEventHandler(Check_MouseClick);
最后
void Check_MouseClick(object sender, MouseEventArgs e)
{
if (selected != null)
{
selected(this, e);
}
Invalidate();
}
在类Ruzzle
中,我尝试通过执行以下操作来更改Check
对象的bool属性:
public Ruzzle(Control father)
{
myGame = new Check[4, 4];
for (int i = 0; i < 4; i++)
{
for(int j=0;j<4;j++)
{
myGame[i, j] = new Check(50, father,i,j);
myGame[i, j].Location = new Point((i * 50), (j * 50));
father.Controls.Add(myGame[i, j]);
myGame[i, j].selected += new EventHandler(Ruzzle_selected);
}
}
}
void Ruzzle_selected(object sender, EventArgs e)
{
int r = (sender as Check).Row;
int c = (sender as Check).Column;
myGame[r, c].Used = true;
}
如果我执行MessageBox,Row
和Column
属性工作正常。我得到正确的值。 但是当它在Check
类中执行Paint方法时,Used
布尔值不会改变!
我做错了什么?
答案 0 :(得分:1)
我会发布这个作为答案,虽然这个不会告诉您代码的确切问题。代码本身看起来很好,所以你必须调试它。让我给你一些如何调试这个问题的技巧。
我可以看到两个明显可能的情况,即Used
属性为false
:
未正确更改为true
。
在某些时候重置为false
。
所以你必须检查这两种可能性。首先,我们应该忽略所有Check
实例,除了点击的实例,否则其他实例可能会在调试时分散您的注意力。有两种简单的方法可以做到这一点:
仅实例化一个实例。在这种情况下,如果游戏中有可能,则应创建一个1x1字段。
在调试时区分距离。 VS调试器中有一个很好的功能叫做Make object Id。基本上,它允许您在调试时为某个对象分配数字唯一标识符。稍后您可以通过在调试器中观察其ID来判断特定实例是您之前标记的实例。如果您之前没有使用过此功能,请查看上面的链接。
好的,现在您只调试Check
类的实例。让我们从检查属性是否设置正确开始。有几点你应该检查你的财产价值,例如:
Paint
处理程序,您有条件。
调用Used
方法时设置Invalidate
属性。 _used
应该是true
。
在Ruzzle_selected
处理程序的末尾。 Used
属性应为true
,您应该检查它。如果是true
,那么我们可以得出结论,至少它设置正确。
现在让我们检查属性Used
是否未重置回false
。就我在你的代码中看到的那样,你应该没有可能真正想要重置它的地方。这意味着,如果你发现这样的行为,那么它可能就是你正在寻找的错误。我假设除了_used
属性之外,您无法访问Used
字段。在这种情况下,调试这个可能的问题非常简单,您只需在属性的setter中放置一个断点,看看它是否设置为false
。为了避免在将断点设置为true
时遇到断点,您可以使用breakpoint condition功能。在您的情况下,条件应该类似于value == false && _used == true
。
请尝试使用这些步骤进行调试,并告知我们是否对您有所帮助。否则它可能是我错过的东西,在这种情况下我会扩展答案。