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; public int RennbahnLänge = 600; public PictureBox Bild = null; public int Location; public Random Zufallszahl; public bool Laufen() { 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; } } } |
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];
}
private void buttonRennen_Click(object sender, EventArgs e) { Random zufallszahl = new Random(); Windhund[] WindhundeArray = new Windhund[4]; 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
Christian 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
mdacko hat folgendes geschrieben : |
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; public int Rennbahnlänge = 540; public PictureBox Bild = null; public int Ort = 0; 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
Christian 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
Derrainer hat folgendes geschrieben : |
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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!