Entwickler-Ecke

Basistechnologien - Pictureboxen random bewegen


interessierter - Di 18.06.13 22:16
Titel: Pictureboxen random bewegen
Hallo Zusammen

Ich mache grad den Ein Tag beim Rennen Work Shop vom C# von Kopf bis Fuss Buch. Ich habe es fast hingekriegt bis auf eine Sache. Meine Hunde (pictureboxen) bewegen sich alle gleich Richtung Ziel, obwohl sie sich eigentlich je Hund Random zwischen 1 - 4 Kästchen nach vorne bewegen sollten, damit es am Schluss einen Sieger gibt. Ich glaube der Fehler liegt in der Form1 Klasse. Die Klasse Windhund ist meiner Meinung nach richtig, und liefert das was sie soll. Wo liegt mein Fehler in der Form1 Klasse? Folgend beide Klassen.

Form1:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace Mehrere_Pictureboxen_gleichzeitig_bewegen
{
    public partial class Form1 : Form
    {
        Windhund[] Hund = new Windhund[4];

        public Form1()
        {
            InitializeComponent();
            for (int i = 0; i < Hund.Length; i++)
            {
                Hund[i] = new Windhund();
            }
            Hund[0].Bild = pictureBox2;
            Hund[1].Bild = pictureBox3;
            Hund[2].Bild = pictureBox4;
            Hund[3].Bild = pictureBox5;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            bool gewinner = false;
            int gewinnerHund = 0;

            while (!gewinner)
            {
                for (int i = 0; i < 4; i++)
                {
                    if (Hund[i].Laufen())
                    {
                        gewinner = true;
                        gewinnerHund = i;
                    }
                }
                Thread.Sleep(30);
            }
            MessageBox.Show("" + gewinnerHund);
        }
    }
}


Klasse Windhund:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;


namespace Mehrere_Pictureboxen_gleichzeitig_bewegen
{
    class Windhund
    {
        public int Startposition = 12;
        public int Rennbahnlänge = 493;
        public PictureBox Bild = null;
        public int Ort = 0;
        public Random Zufallszahl = new Random();

        public bool Laufen()
        {
            int distanz = Zufallszahl.Next(14);
            Point p = Bild.Location;
            p.X += distanz;
            Bild.Location = p;

            if (Bild.Location.X > Rennbahnlänge)
                return true;
            else
                return false;
        }
    }
}


Ich habe echt schon alles durchprobiert, aber verzweifle an dieser Randomsache. Bitte gebt mit Lösungsansätze.

Grüsse
interessierter


Christian S. - Di 18.06.13 22:34

Hi!

Mach das Random-Object namens Zufallszahl mal statisch, damit alle Hunde dasselbe Objekt benutzen. Du intialisiert nämlich im Moment vier Zufallsgeneratoren praktisch zeitgleich, womit sie den selben Seed haben und identische Zahlenfolgen ausgeben. Es ist immer besser, nur einen Zufallsgenerator zu verwenden (Ausnahme: Multithreading, aber das haben wir hier ja nicht).

Viele Grüße
Christian


interessierter - Di 18.06.13 22:37

Das leuchtet mit ein, hatte grad ein AHA-Erlebnis. Static funzt und es gewinnt jeweils Random ein anderer Hund. Perfekt. Weiter gehts. Danke viel mal.

Grüsse
interesserter