Entwickler-Ecke

WinForms - Wettbüro Hunderennen - Eine Workshopaufgabe


Derrainer - Di 21.07.09 11:02
Titel: Wettbüro Hunderennen - Eine Workshopaufgabe
Hallo zusammen,

ich habe mir vor kurzem das Buch C# von Kopf bis Fuß zugelegt.

Ich bin jetzt beim ersten Workshop angelangt. Dort soll ein Windhunderennen Programmiert werden.

Es gibt Objekte des Klasse Windhund. Diese haben unter anderem das Feld Bild welches auf eine PictuerBox zeigt.
Dies Bild soll auf meinem Formular von links nach rechts bewegt werden. dafür hat die Klasse die Methode Laufen().
Das klappt mit dem Code auch ganz gut. Allerdings nur für einen Hund nach dem anderen. Sie sollen aber alle gleichzeitig loslaufen.
Und genau da stecke ich grade irgendwie Fest.

Hier ist der Codefür die Klasse:


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:
namespace Ein_Tag_beim_Rennen
{
    public class Windhund
    {  
        public int Startposition = 30;          //wo das Bild beginnt
        public int RennbahnLänge = 600;         //Rennbahnlänge
        public PictureBox Bild = null;          //Bild des Hundes
        public int Location;                    // der Ort auf der Rennstrecke??
        public Random Zufallszahl;              // eine instanz von Random
       
        public bool Laufen()                    // Rückt zufällig 1,2,3 oder 4 Kästchen vor und 
                                                // aktualisiert die Position des Bildes im Formular.
                                                // Liefert true wenn das Rennen gewonnen wurde.
        {
           int distanz;  
           Point p = Bild.Location;
           Zufallszahl = new Random(); 
          
            
           while (true)
  {
            if(p.X < 570)
              {
               distanz = Zufallszahl.Next(5);
               p.X = p.X+ distanz;
               Bild.Location = p;
               System.Threading.Thread.Sleep(15);               
              } 
              else 
              {
                  return false;
              }             
  }

        }

        public void StartpositionEinnehmen()
        {
            Point p = Bild.Location;
            p.X = Startposition;
            Bild.Location = p;                                //setzt den Ort auf die Startposition zurück.
        }
    }
}

und für das Formular:


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:
namespace Ein_Tag_beim_Rennen
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

         

            
            Spieler[] SpielerArray = new Spieler[3];  // es wird ein Array mit 3 Speler Referenzen erzeugt

     

        }
            

        private void buttonRennen_Click(object sender, EventArgs e)
        {
            Random zufallszahl = new Random(); 
           
           Windhund[] WindhundeArray = new Windhund[4]; // es wird ein Array mit 4 Windhung Referenzen 
          
            WindhundeArray[0] = new Windhund() { Bild = pictureBoxHund1 };
            WindhundeArray[1] = new Windhund() { Bild = pictureBoxHund2 };
            WindhundeArray[2] = new Windhund() { Bild = pictureBoxHund3 };
            WindhundeArray[3] = new Windhund() { Bild = pictureBoxHund4 };

            WindhundeArray[0].Laufen();
            WindhundeArray[1].Laufen();
            WindhundeArray[2].Laufen();
            WindhundeArray[3].Laufen();
        
        }
    }
}


Mir ist schon klar warum die Hunde nacheinander loslaufen...

vielen Dank

DerRainer

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt

Hab die Lösung gefunden!


Alex75 - So 25.10.09 18:55

Hallo,

ich habe das selbe Problem. Habe mir auch das Buch C# Von Kopf bis Fuss zugelegt.

Ich denke das Problem liegt in der Klasse Windhund, weil die Methode "laufen" eine Schleife enthält, das würde erklären warum die Hunde nach und nach laufen, aber ich habe keine Idee wie ich das sonst umsetzen sollte. Ich probier mal weiter :)

Vielleicht könntest du oder ein anderer eine Lösungsidee hier posten. Wäre sehr nett.

Danke im Vorraus
Gruß
Alex


mdacko - So 25.10.09 19:28

Das Problem liegt in der Tat an der Schleife.

Der erste Hund läuft los. Und läuft und läuft... Und zwar bis er die 570 Pixel erreicht hat.
Erst dann läuft der zweite Hund los. Und läuft und läuft ... Und zwar bis er die 570 Pixel erreicht hat.
Erst dann läuft der dritte Hund los. Und läuft und läuft ... ;p

Spontan fallen mir zwei Möglichkeiten ein:
Alle Hunde in einer einzigen Schleife laufen lassen. Dazu müsste die Schleife aber aus der Klasse raus.
Oder die Schleifen jeweils in einem separaten Thread laufen lassen, dadurch behindern sie sich nicht gegenseitig.


Kha - So 25.10.09 19:38

user profile iconmdacko hat folgendes geschrieben Zum zitierten Posting springen:
Alle Hunde in einer einzigen Schleife laufen lassen. Dazu müsste die Schleife aber aus der Klasse raus.
Das ist die richtige Lösung, statt einer "Laufen"- brauchen wir quasi eine "NächsterSchritt"-Methode, die dann in einem Timer aufgerufen wird. Threads würden das ganze unnötig kompliziert machen.


Alex75 - So 25.10.09 19:43

Hallo,

danke für die schnellen Antworten. Ich habe in der Klasse die Schleife gelöscht und rufe die einzelnen ".laufen" Methoden jetzt vom button_click aus auf innerhalb einer Schleife. Das funktioniert soweit, nur die Art wie ich den Gewinner ermittle sieht noch nicht so schön aus. Muss ich mir mal noch Gedanken machen.


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:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Threading;


namespace Ein_Tag_beim_Rennen
{
    public class Windhund
    {
        public int Startposition = 21// wo das Bild beginnt
        public int Rennbahnlänge = 540// die Länge der Rennstrecke
        public PictureBox Bild = null// das Bild
        public int Ort = 0// der Ort auf der Rennstrecke
        public Random Zufallszahl;

        public bool Laufen()
        {
            Random Zufallszahl = new Random();
                           
                Point Ort = Bild.Location;
                Ort.X += Zufallszahl.Next(6);
                Bild.Location = Ort;
                if (Ort.X >= Rennbahnlänge)
                {
                    return true;
                }
                Thread.Sleep(10);
                return false;
        }

        public void StartpositionEinnehmen()
        {
            Point Ort = Bild.Location;
            Ort.X = Startposition;
            Bild.Location = Ort;
        }
    }
}



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;

namespace Ein_Tag_beim_Rennen
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Windhund[] Hund = new Windhund[4];
            Hund[0] = new Windhund { Bild = pictureBox2 };
            Hund[1] = new Windhund { Bild = pictureBox3 };
            Hund[2] = new Windhund { Bild = pictureBox4 };
            Hund[3] = new Windhund { Bild = pictureBox5 };

            bool Laeuft = false;
                     
            while (Laeuft == false)
            {
                for (int i = 0; i <= 3; i++)
                {
                    Laeuft = Hund[i].Laufen();
                    if (Laeuft)
                    {
                        i++;
                        MessageBox.Show("Hund Nummer: " + i + " hat gewonnen !");
                        for (int m = 0; m <= 3; m++)
                        {
                            Hund[m].StartpositionEinnehmen();
                        }
                        break;
                    }
                }
            }
         }

              
      }
}


Gruß
Alex

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Derrainer - Mo 15.02.10 10:00

Hallo zusammen,

ich habe die Lösungen gefunden.

Es muss ja keiner reinschauen, aber ich fand die hatten es,
auch aufgrund der Übersetzungsfehler, schon "in sich".

VG,

Rainer


Ivy - Di 15.06.10 08:37

Hallo zusammen,
ich möchte das Spiel so manipulieren, dass immer z.b Hund Nr. 3 gewinnt. Ich habe aber keine ahnung wie ich das anstellen soll, weil ja eigentlich rein zu fällig ein Hund immer ausgewählt wird, der am schnellsten ist..?!
hat jemand eine idee?

gruß.


Kha - Di 15.06.10 18:44

Ja, ganz trivial lässt sich das nicht lösen. Die einfachste Methode: Du lässt die Hunde erst simuliert laufen, zeigst den Lauf also nicht an, sondern speicherst die Bewegungen in Arrays. Danach musst du nur noch die Bewegungen des schnellsten Hundes mit denen von Hund 3 tauschen und die Aufzeichnung starten.


Ivy - Mo 21.06.10 09:51

ahha naja hört sich jetz nicht wirklich simpel an, da die manipulation für eine prsäentation gedacht ist um den zuschauern zu zeigen wie man das programm verändern kann...


manuzi1 - Mo 30.03.15 17:33

user profile iconDerrainer hat folgendes geschrieben Zum zitierten Posting springen:
Hallo zusammen,

ich habe die Lösungen gefunden.

Es muss ja keiner reinschauen, aber ich fand die hatten es,
auch aufgrund der Übersetzungsfehler, schon "in sich".

VG,

Rainer

Hallo, ich kann dein "Inline-Anhang" nicht öffnen.
Warum?

Lg