0

レースをしている犬が4匹います。フォームを横切って移動する必要がありますが、徐々に移動することはありません。開始ラインから開始し、間に移動せずにすぐにフィニッシュラインにテレポートします。タイマーティックごとに、それらのlocation.Xが増分されます。

タイマーは1つまたは4つ必要ですか?私は現在1つ持っており、その間隔は400に設定されています。

これは関連するコードです:

private void btnRace_Click(object sender, EventArgs e)
{   
    btnBet.Enabled = false;
    timer1.Stop();
    timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{   while (!isWon)
    {
        for (i = 0; i < Dogs.Length; i++) // there are four dogs
        {                    
            if (Dogs[i].Run()) // Run() returns true if full racetrack is covered by this dog
            {
                Winner = i + 1;
                isWon = true;

                MessageBox.Show("We have a winner! Dog #" + Winner);

                break;
            }
        }
}

そして犬のクラスでは:

public bool Run()
{               
    Distance = 10 + Randomizer.Next(1, 4);
    p = this.myPictureBox.Location;
    p.X += Distance ;            
    this.myPictureBox.Location = p;

    //return true if I won the game
    if (p.X >= raceTrackLength)
    {
        return true ;
    }
    else
    {
        return false ;
    }
}

犬は一歩だけ動いて、すぐにフィニッシュラインに現れます。私は何が間違っているのですか?

4

2 に答える 2

6

timer1_TickメソッドからWhileループを削除します。このメソッドは400ミリ秒ごとに実行されますが、最初の起動では1匹の犬が勝つまで待機します。

また、犬の1匹が勝った後、タイマーを停止する必要があります。

private void timer1_Tick(object sender, EventArgs e)
{   
    for (i = 0; i < Dogs.Length; i++) // there are four dogs
    {                    
        if (Dogs[i].Run()) // Run() returns true if full racetrack is covered by this dog
        {
            Winner = i + 1;
            isWon = true;
            timer1.Stop();
            MessageBox.Show("We have a winner! Dog #" + Winner);
            break;
        }
    }
}
于 2012-10-05T10:53:31.627 に答える
1

タイマーが1回だけオフになり、このループでスタックします。

  while (!isWon)
  {
  }

ループを削除し、タイマーに機能させます

最後に追加

 if (isWon) timer1.Stop();
于 2012-10-05T10:58:10.520 に答える