Autor Beitrag
Derrainer
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 21.07.09 11:02 
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:

ausblenden volle Höhe 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:

ausblenden volle Höhe 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
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 19



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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.

ausblenden volle Höhe 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;
        }
    }
}


ausblenden volle Höhe 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 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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
Einloggen, um Attachments anzusehen!
Ivy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: 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
Hält's aus hier
Beiträge: 1



BeitragVerfasst: 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