Autor Beitrag
Fixer
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 02.05.17 19:18 
Hallo Community,

ich habe vor kurzem begonnen C# zu lernen. Der Grund dafür besteht einfach darin, eine Plattform zu erschaffen, mit welcher man ein bestimmtes Spiel verwalten kann. Falls meine Frage etwas doof sein sollte, bitte ich um entschuldigung, meine Erfahrungen mit C# sind erst ca. 14 Tage alt.

Über mein gekauftes Buch komme ich dabei leider nicht auf den richtigen Nenner, vielleicht bin ich da aber auch nur zu blöd um den winkenden Zaunpfahl zu erkennen. In diversen Videos werden jede Menge Würfelprogrammierungen u.ä. gezeigt und gelert, allerdings zeigt dort niemand die Art und Weise wie ich sie benötigen würde. Im Gegensatz zu allen mir gezeigten Varianten, benötige ich ein System, in welchem ich vorher nicht festlegen kann mit wievielen Würfeln geworfen werden soll. Zudem kann es durchaus vorkommen, das sich die Anzahl der Würfel sogar verringern könnte.

Nach allem was ich bis jetzt so mitbekommen habe, würde sich eventuell eine if Schleife in kombination mit einer for Schleife anbieten. Leider komme ich damit auf kein zufriedenstellendes Ergebnis. In meiner Version kann ich zuverlässig den wert der Würfel errechnen, allerdings ist die angegebene Variable keine Zahl die ich mit dem Würfelergebnis erreichen möchte, sondern die Würfel selber.

Meine bisherige Version:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
        private void CmdWurf_Click(object sender, EventArgs e)
        {
            int a = Convert.ToInt32(TxtWertEins.Text); // Erster zufälliger Wert ( ungewisse Menge an Würfeln)
            int b = Convert.ToInt32(TxtWertZwei.Text); // Zweiter zufälliger Wert ( ungewisse Menge an Würfeln)
            int c;

            if (b < 1)     // Sollte Variable b 0 sein
                c = a - 2// dann wird von dem ersten Wert 2 abgezogen

            else c = a + b;   // Sollte b 1 o. höher sein, dann werden beide Variablen addiert

            int w = c; // Die Menge von c ist = die Menge an Würfel mit denen gewürfelt werden kann

            Random zufall = new Random(); // glaube was das macht weis hier jeder besser als ich :)

            w = zufall.Next(17); // s.o.

            for (w = 0; w == c; w++) // Ab diesem Punkt fängt bei mir das beschriebene Problem an
            {
                LblAusgabe.Text = "" + w + "\n"
            }


Wie sagt man dem Programm, das es genau mit den errechneten Würfelmengen würfeln kann und nachdem jeder Würfel gewürfelt wurde, möge es doch bitte alle Ergebnisse im LblAusgabe anzeigen?

Ich bedanke mich schonmal im für eventuelle Anregungen und Hilfestellungen eurerseits :)

liebe Grüße

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 02.05.17 19:32 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4437
Erhaltene Danke: 910


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 02.05.17 19:40 
Vorwort, Hilfe folgt im Anschluß ;)

Wie du c berechnest erschließt sich mir nicht (ist aber auch für dein Problem vermutlich nicht relevant). Ich würde dir raten Dinge so zu benennen das sie halbwegs genau beschreiben wofür sie gedacht sind. a,b,c sind einfach generische nichtssagende Bezeichner. Das macht es nicht nur für jemanden schwer deinen Code zu verstehen sondern du machst dir selbst das Leben auch schwer weil du überlegen musst wofür a,b,c jetzt eigentlich gut ist. Sprechende Namen helfen einem beim programmieren auch selbst. Übrigens deine Kommentare beschreiben einfach was die einzelnen Zeilen tun. Das hilft nicht wirklich. Was die Zeilen tun sieht jeder der einigermaßen programmieren kann selbst und wenn er es nicht kann dann hilft auch der Kommentar nicht. Ein Kommentar sollte kommentieren warum etwas passiert, was passiert ergibt sich aus dem Code von selbst. Warum mann das tut was man da tut aber nicht ;)

So jetzt versuche ich es mal mit was hilfreichem.

Du versuchst scheinbar c-mal zu würfeln und das Ergebnis ausgeben zu wollen. Wie du zu c kommst ignoriere ich mal.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
Random random = new Random(); 

for (int i = 0; i < c; i++)
{
   int value = random.Next(1,7);
   // hier value zum Control hinzufügen. Was ist LblAusgabe für ein Ding? Ein Label für mehrere Werte wäre unglücklich.
}
Fixer Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 02.05.17 23:04 
Guten Abend nochmal zusammen,

ich möchte mich erstmal für die netten Antworten bedanken, find ich echt Klasse.

So wie ich es aus den Büchern und aus den Videos mitbekommen habe, das eine for Schleife meine Anweisungen wie folgt ausführt. (Ausgangspunkt der Schleife; dann führt sie dieses solange aus bis sie den Vorbestimmten Wert erreicht hat; und dies in den angegebenen Schritten) in meinem fall würde das bedeuten ( fange an zu würfeln, bis du den wert von errechneter würfelmenge erreicht hast und tue dies in einer schritten aufwärts). Ich hoffe das ist so halbwegs richtig was ich gerade gesagt habe. ( Es soll jeder einzelne Würfel hintereinander gewürfelt werden)

Ich habe es hinbekommen, das ich die Menge der Würfel ausgerechnet bekomme. Danach führt das Programm nun auch eine Zufallsgeneration aus. Mir erschließt nun aber nicht mehr wie ich ihm sagen kann, das er mir jeden Einzelnen gewürfelten Würfel anzeigen kann.

Ich habe am Code nochmal rumgewerkelt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
        private void CmdWürfeln_Click(object sender, EventArgs e)
        {
            double wert1;   // Erste Würfelmenge
            double wert2;   // Zweite Würfelmenge
            double ergebnis;    // Gesamtwürfelmenge

            wert1 = Convert.ToDouble(TxtWert1.Text);    // Hier wird die Eingabe des Benutzers in die Variable wert1 gewandelt
            wert2 = Convert.ToDouble(TxtWert2.Text);    // Hier wird die Eingabe des Benutzers in die Variable wert2 gewandelt

            ergebnis = wert1 + wert2;   // Soll die Maximalanzahl der zur Verfügung stehenden Würfel errechnen

            if (wert2 <= 0)
                ergebnis = wert1 -2;    // Sollte es keine zweite Würfelmenge geben ( also = 0) dann wird als Strafe von der ersten Würfelmenge 2 abgezogen

            Random zufall = new Random();

            for (int i = 0; i < ergebnis; i++) ;
            {
                int value = zufall.Next(17);

                LblAusgabe.Text = "" + value + "\n";


Der Ausgang meines Programms sieht nun folgendermaßen aus: Wenn ich nur den oberen Teil ausführe und die Klasse Random weg lasse, wird im Normalfall wert1(Würfel) und wert2(Würfel) addiert und als Ergebnis(Bestehende Würfelmenge) ausgegeben. Sollte der zweite Wert allerdings 0 sein, so werden vom ersten wert zwei Würfel abgezogen. Also soweit alles gut. ( Ich glaube beim ersten Post hab ich mich da verhaspelt. :) )

Danach wird die Klasse Random ausgeführt: Nun sieht es für mich so aus, das ich einen integer einfüge (int i) zu dem ich aber eigentlich keinen Bezug habe. Mit diesem integer lasse ich nun die for Schleife wie oben beschrieben durchlaufen. Wenn ich jetzt den Quelltext vom netten Herrn Jansen richtig verstehe, soll int value die Menge der gewürfelten Würfel darstellen ( Ich hoffe mal das ist richtig, weil da setzt es bei mir irgendwie aus)oder muss ich das nochmal extra deklarieren?

Wie bekommt man es jetzt hin, das einem jeder einzelne gewürfelte Würfel mit Ergebnis angezeigt wird? Ich habe bis jetzt gelernt einen Wert welchen ich über ein Textfeld eingebe oder auch vorgegebene Werte über ein Label auszugeben. Da ich aber vorher nicht weis wie viele Würfel es werden, kann ich ja schlecht 50 Label einbasteln. Ich hatte jetzt die Idee, das durch den Zeilenumbruch jeder einzelne Wert untereinander geschrieben wird. ABER, wenn ich mein Programm starte, dann ist Pustekuchen, es wird genau ein einziges Ergebnis angezeigt :(.

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 02.05.17 23:46 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Fixer Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 03.05.17 20:06 
Einen wunderschönen guten Abend,

Ein Dankeschön an den Herren Frühlingsrolle. Das mit dem double habe ich deshalb gemacht, da es in anderen Teilen des Spieles dazu kommen wird das wert 1 und wert 2 mit anderen werten multipliziert bzw. dividiert werden müssten. Mir würde es ( sollte ich denn dieses Problem hier mal gelöst haben) im späteren Verlauf eher gefallen, wenn die ersten beiden Werte 1 und 2 ( es werden auch noch einige dazu kommen) Klassen weit Gültigkeit haben. Es wird in verschiedenen Rechenschritten auf die Grundwerte Wert 1 Wert 2 zugegriffen. Vorher würde ich allerdings schon glücklich sein, wenn ich dieses (für mich wohl eher große) Problem gelöst bekomme.

Also Jansen sein netter Tipp hat anscheinend Wirkung getragen und zusammen mit dem von Herren Frühlingsrolle bin ich nun sogar in der Lage Zahlen auf den Bildschirm zu befördern. Meine Überlegung ist, das ich 1 mal den Knopf drücke und das Programm mir alle Ergebnisse bis zur Summe xy (Würfelmenge) unter oder nebeneinander darstellt. In einem Test vor 5 min. wollte er mir nicht mal mehr die Zahlen unter einander schreiben, aber ich denke das bekomme ich noch irgendwie gelöst. Ich hatte mir überlegt dies mit einer weiteren if Schleife zu lösen, welche dem Programm sagt: Bitte schreibe so lange die Zahlen auf den Bildschirm bis die Summe xy erreicht ist.

und beim Nächsten mal gebe ich mir mühe meinen Code zwischen diese cs und /cs zu schreiben, will ja schließlich keine Pöbeleien anfangen :)

Danke
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 04.05.17 00:50 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Fixer Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 08.05.17 08:50 
Einen wunderschönen guten Morgen zusammen,

es ist ja schon wieder eine kleine Weile vergangen. Den letzten Post von Frühlingsrolle habe ich leider nicht wirklich verstanden, das liegt wahrscheinlich daran das man nach 3 Wochen nichts mit solchen Erklärungen anfangen kann. Allerdings lasse ich mich von sowas nicht so leicht entmutigen und habe dennoch weiter an meiner Idee gebastelt.

Das Problem ist soweit eigentlich noch das Gleiche wie vorher, allerdings habe ich es nun schon geschafft mein Programm würfeln zu lassen. Das mit der automatischen Ausgabe verschiebe ich mal noch, da ich dafür anscheinend nicht das nötige Verständnis in C# besitze. Mein Problem setzt sich nun im Bereich der Variablenübergabe fort. Im Ersten Teil lasse ich ja bekanntlich 2 Werte einen dritten Wert errechnen, der dann in einem weiteren Schritt als Würfelmenge abgenommen werden soll. In meinen bisherigen Versuchen habe ich es hinbekommen das Programm würfeln zu lassen, wobei mir irgendwann aufgefallen ist, das ich zwar Würfel werfen kann, diese aber niemals der Menge von Wert 3 entsprechen können. Denn nach Beendigung der ersten Methode ist dieser Wert wieder verpufft. Daher kann ich solange 6er Würfel werfen wie ich möchte, was allerdings absolut nichts mit meiner Idee gemein hat.

Jetzt habe ich in meinem Buch und halt auch wieder in Videos und Erklärungen die Variante mit out entdeckt. Zu meinem Leidwesen muss ich aber leider gestehen das alle Vorgaben absolut nicht mit meiner Idee zu verarbeiten sind. In den meisten Tutorials wird gezeigt wie ich eine Variable errechnen lasse und diese dann in einer selbstgebastelten Klasse mit einer ganz tollen + - Rechnung übergebe. In meinem Fall übergebe ich diese Variable in eine Click Methode und dort soll dieser Wert dann in der Klasse Random als Würfelgeber verarbeitet werden. Mein Problem liegt nun darin, das nirgends beschrieben wird wo man diese Variable in diesem Fall übergibt und vor allem wie. Wenn ich (wie in einem Buch beschrieben) die Variante CmdButton2_Click(c out) nehme, so wird alles rot unterstrichen. Nun ist CmdButton auch keine Klasse, wobei in der Klasse Random ebenfalls alles rot wird. Anders gesagt, ich habe trotz Bücher und allen Vorgaben keine Ahnung wo man und vor allem wie man eine Variable aus einer Click Methode in einer andere Click Methode übergibt und dort in einer Klasse Random weiterverarbeitet.

Ich währe euch sehr verbunden wenn Ihr mir dabei etwas unter die Arme greifen könntet.

Dankeschön.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4437
Erhaltene Danke: 910


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 08.05.17 18:29 
Zitat:
In meinem Fall übergebe ich diese Variable in eine Click Methode


Das glaube ich nicht. Der Event muss die Vorgabe erfüllen die der Event setzt. Heißt jemand zum Beispiel ein Button ruft diese Methode auf und dazu muss er ja wissen womit und er ruft die Methode nun mal mit sender + eventargs auf. Diese Signatur kannst du nicht einfach ändern indem du im Sourcecode was anderes hinschreibst.

Wenn du etwas in der Click Methode brauchst das nicht in der Click Methode ermittelt werden kann dann muss es woanders herkommen.

In deinem Fall willst du scheinbar die Click Methode nicht beliebig oft aufrufen können um irgendwann sozusagen das Würfeln zu beenden. Dann brauchst du etwas das sich eine Instanzvariable nennt. Die gehört nicht zur Methode sondern zur Klasse in der sich die Methode befindet. Wenn dir Instanzvariable/Klassenvariable nichts sagt wäre jetzt der Zeitpunkt das nachzulesen und erst zu verstehen bevor du weitermachst.In deinem Buch solltest du ein Kapitel finden das auf die Unterschiede eingeht wo man eine Variable definiert (in einer Klasse bzw. Instanz einer Klasse oder einer Methode)
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 09.05.17 00:17 
- Nachträglich durch die Entwickler-Ecke gelöscht -