0

我正在编写一个愚蠢的小程序(就像我们不时做的那样)来处理一些基本的 C# 编码。正如我确定您可以看到的那样,单击鼠标,图片移动,直到它位于单击鼠标的位置。这一点工作正常。然后我希望图片框随机移动,我也做到了!我遇到的下一个问题是,当我单击时,图片框不会移动到新的鼠标坐标,而是继续随机移动。对此的任何帮助将不胜感激!这是我认为是问题的代码。

非常感谢!

约翰

protected override void OnMouseClick(MouseEventArgs e)
{
    base.OnMouseClick(e);
    int destX = e.X;
    int destY = e.Y;

        HasArrived = false;

    while (HasArrived == false)
    {
    moveImage(destX, destY, pictureBox1);

        if (pictureBox1.Left == destX && pictureBox1.Top == destY)
        {
            HasArrived = true;
            while (HasArrived == true)
            {
                randomMove(pictureBox1);
                hungry1 += 1;
            }
        }
    }
}
4

5 回答 5

1

你被困在你的内心循环中!尝试将循环放在后台工作程序中,以便您可以识别新的鼠标单击以将 HasArrived 设置为 true。

在积极的while语句中使用否定的while语句对我来说似乎很糟糕,我以前从未见过。我不认为这会很好..

于 2012-11-22T11:13:42.053 回答
0

可能是因为 HasArrived 永远不会在任何地方设置为 false ?但这也意味着你也会陷入移动循环。

编辑:如果您只想在移动到单击的位置后随机移动一次,则删除随机位周围的 while,否则您将需要一些其他变量来知道何时中断。

于 2012-11-22T11:05:12.850 回答
0

您的内部循环似乎有问题。

        HasArrived = true;
        while (HasArrived == true)
        {
            randomMove(pictureBox1);
            hungry1 += 1;
        }

除非 randomMove() 可以修改 HasArrived,否则您的循环永远不会将 HasArrived 设置为 false,因此 while 条件始终为真,您将永远不会退出循环。

于 2012-11-22T11:11:23.677 回答
0

我看起来像它,因为一旦图片移动到它的目的地,你的程序就会卡在一个紧凑的 while 循环中,它永远不会逃脱

于 2012-11-22T11:12:05.003 回答
0

首先,你永远不应该用布尔表达式测试变量的相等性。这意味着HasArrived == false不好,最好这样写:

while (!HasArrived)
{
    // ...
    while (HasArrived)
    {
    }
}

问题是您的程序在单击鼠标一次后不会将控制权交还给表单。

让我来说明一下,单击鼠标后您的程序会做什么:

  1. 记住新的 x 和 y 坐标
  2. 图片还没到,移动图片
  3. 如果图片已经到达它的目的地 - 随机移动它

但它最终会移动图片直到您终止程序,因为您的表单仍然处理“OnMouseClicked”事件。并且只要程序没有从您的事件处理方法返回,表单就无法记录任何其他事件(通常它应该冻结,以“应用程序没有响应”结尾)。

所以从我认为你的代码应该做的事情来看,你应该像这样编写你的程序: 1. 创建一个并行线程来随机移动你的图像 2. 只要你的鼠标单击事件尚未处理,就暂停线程

你的问题也完全错误。实时意味着您的程序能够在预定义的时间限制内给出任何结果。你的方法根本不适合这个,因为你的方法执行的时间取决于你的图像移动的速度和它应该移动的距离。

于 2012-11-22T11:14:39.180 回答