【问题标题】:Rectangle clockwise movement矩形顺时针移动
【发布时间】:2015-10-24 08:21:14
【问题描述】:

我正在尝试制作一个矩形顺时针移动的 Windows 窗体应用程序。这是图像。

这是我的代码。

public partial class Form1 : Form
{
    int x;
    int y;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.FillRectangle(Brushes.Crimson, x, y, 20, 20);
    }

    private void movingTimer_Tick(object sender, EventArgs e)
    {
        while (true)
        {
            if (x < 750)
            {
                x += 5;
            }
            else if (x == 750 && y < 340)
            {
                y += 5;
            }
            break;
        }

        Invalidate();
    }
}

我明白为什么我不能更进一步。如果我使用 x -= 5 创建新的 if 语句,它将与 while 循环同时激活。 我无法理解的是如何分隔新命令(x -= 5y -= 5) 所以只有在我的第一个 while 循环完成后才会激活它。

【问题讨论】:

    标签: c# if-statement while-loop


    【解决方案1】:

    好吧,我想我明白了。我是这样做的。

    while (true)
            {
                if (x < 750 && y == 0)
                {
                    x += 5;
                }
                else if (x == 750 && y < 340)
                {
                    y += 5;
                }
                else if (x > 0 && y >= 340)
                {
                    x -= 5;
                }
                else if (x == 0 && y > 0)
                {
                    y -= 5;
                }
                break;
            }
    

    但我有一种感觉,有一种更简单优雅的方法可以做到这一点。谁能提出更好的建议?

    【讨论】:

    • 嗯,同样的想法,但你打字更快;-)
    • 一种更优雅的方式可能是记住你要去的方向,然后在每次迭代中检查你是否遇到了障碍物(在这种情况下是画布的末端),然后根据在那...
    • 顺便说一句,如果你最终无条件地打破该循环,为什么要在 while(true) 循环中进行此操作?
    • 感谢您的回复。是的,我知道,我只是在尝试各种带有 IF 和 WHILE 的东西,却忘了删除它)
    • @Rooxie 我建议创建您自己的 Rectangle 类,该类具有 Move(Direction d, int speed) 之类的方法,并且这个方向是具有四个选项的枚举:左上右下...
    【解决方案2】:

    既然我不知道你想从那里去哪里,我会为你提供最直截了当的解决方案:

    if (y <= 0 && x < 750)
    {
        x += 5;
    }
    else if (x == 750 && y < 340)
    {
        y += 5;
    }
    else if (y >= 340 && x > 0)
    {
        x-=5;
    }
    else if (y > 0 && x <= 0)
    {
        y-=5;
    }
    break;
    

    您可能需要稍微调整一下这些值,但我想您可以从这里弄清楚。

    【讨论】:

      【解决方案3】:

      由于您使用的是计时器,因此您不需要 while 循环,也不要检查 if 语句中的常量值,因为如果您更改表单大小,这些值将不起作用。

      使用以下代码:

      private void movingTimer_Tick(object sender, EventArgs e)
      {
          if (y <= 0 && x < this.ClientSize.Width-20)
          {
              x += 5;
              y = 0;
          }
          if (x >= this.ClientSize.Width - 20 && y< this.ClientSize.Height-20)
          {
              x = this.ClientSize.Width - 20;
              y += 5;
          }
          if(y>= this.ClientSize.Height -20)
          {
              x -= 5;
              y = this.ClientSize.Height - 20;
          }
          if (x <=0 && y >0)
          {
              x = 0;
              y -= 5;
          }
      
          Invalidate();
      }
      

      【讨论】:

      • 我已经开始学习如何编写代码,所以我不知道这个“this.ClientSize.Height/Width”。我什至不知道它叫什么。方法,对吧?感谢您的启发。
      猜你喜欢
      • 1970-01-01
      • 2012-09-02
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      相关资源
      最近更新 更多