1

この質問 ( C# WinForm プロジェクトでピクセルを移動する軌跡を表示) の後、C#での私の個人的なアリ コロニー プロジェクトのソリューションを適用しようとしています。表面。

[...]Application.Run(new ShowAnts());[...]

public partial class ShowAnts : Form
{
    Bitmap bmp;
    int j = 0;
    public ShowAnts()
    {
        InitializeAntProgram();
        InitializeComponent();
        bmp = new Bitmap(pictureBox1.ClientSize.Width, pictureBox1.ClientSize.Height);
        pictureBox1.Image = bmp;
    }

    public void RenderAnts(object sender, PaintEventArgs e)
    {
        using (Graphics G = Graphics.FromImage(pictureBox1.Image))
        {
            while (j < 1000)
            {
                Map.EvaporatesPheromones();
                foreach (Vector2D food in foodSrcs)
                {
                    Map.SetMapPoint(food, 500);
                }
                foreach (Ant a in ants)
                {
                    Brush c;
                    c = Brushes.DarkBlue;
                    if (a.role == AntRole.Scout)
                    {
                        a.Move(j);
                        c = Brushes.Red;
                    }
                    e.Graphics.FillRectangle(Brushes.DarkBlue, a.position.x, a.position.y, 1, 1);
                    G.FillRectangle(Brushes.Gray, a.position.x, a.position.y, 1, 1);
                }
                j++;
            }
        }
    }
}

上記のコードは、アリの動きを winform に描画するグラフィックの試みを示しています。完全に機能しますが、最終結果のみが表示されます。マップ情報を再解析せずに、グラフィカルなトレイル情報を維持しながら、段階的な進化を示したいと思います。

この「グラフィック インターフェース」を開発しているコンソール プロジェクトが既に存在することを考慮してください。

  • 一部の変数は、プロジェクトの別の場所 (例: 食品) に設定されています。
  • 「a.Move(j);」は、ant ロジック自体を参照します (マップ配列を参照する分析、決定、新しいセルの移動)。
  • `j` カウンターは、歩数を数えたり、任意のストップを設定したりするために使用されますが、実際の用途はありません。
  • 私はすでにフェロモン、動き、位置などに関するすべての情報をマップ配列と他のいくつかの変数に保存しています.
4

1 に答える 1

0

コードと前の質問のコメントを見ると、動きをアニメーション化する部分が欠けているようです。Paint代わりに、イベントと思われるものの中でループしています。

これがそのための簡単な修正です。イベントTimerをトリガーする を追加します。これは、ハンドラーに接続されているようです..:RenderAntspictureBox1.Paint

いくつかのクラス レベルの変数:

 int counter = 0;
 int limit = 1000;
 Timer antTimer = new Timer(); 

開始コード:

 antTimer.Interval = 50;   // <-- pick your speed !!
 antTimer.Tick += (ss, ee) =>
 { pictureBox1.Invalidate(); counter++; if (counter > limit) antTimer.Stop(); };
 antTimer.Start();

速度は 50 ミリ秒で、これはTicks1 秒あたり 20 を意味します。

Tickイベントは小さな式でインライン化され、1Lambdaつのステートメントとループ ロジックのみが含まれます。コントロールによってInvalidatingその イベントが発生し、それによってイベントがトリガーされます。pictureBox1PaintRenderAnts

また、私はそれを「クイックフィックス」と呼んでいることにも注意してください。通常、アニメーションのレンダリング コードと移動コードを区別します。しかし、この場合、この微妙な違いはあまり重要ではありません。

メソッドを変更RenderAntsして、ループを削除します。

public void RenderAnts(object sender, PaintEventArgs e)
{
    using (Graphics G = Graphics.FromImage(pictureBox1.Image))
    {
        Map.EvaporatesPheromones();
        foreach (Vector2D food in foodSrcs)
        {
           Map.SetMapPoint(food, 500);
        }
        foreach (Ant a in ants)
        {
           Brush c = Brushes.DarkBlue;
           if (a.role == AntRole.Scout)
           {
              a.Move(j);
              c = Brushes.Red;
           }
           e.Graphics.FillRectangle(c, a.position.x, a.position.y, 1, 1);
           G.FillRectangle(Brushes.Gray, a.position.x, a.position.y, 1, 1);
        }
    }
}

Start/Stop を追加することもできますButton。またTrackBar、速度を変更するには..

これで、アリの進行状況を 20Hz で見ることができるようになり、灰色の軌跡が残ります。

于 2016-06-27T02:57:08.120 に答える