Hallo Ihr,
als Neueinsteiger im Programmieren stoße ich natürlich regelmäßig auf Schwierigkeiten. In aller Regel kann ich jedoch durch Nachlesen die meisten Probleme gut beheben. Nun bin ich allerdings auf ein Problem gestoßen, welches mich seit einigen Stunden beschäftigt. Ich bin mir sicher, dass es für Euch kein Problem darstellt, insofern ich einigermaßen vermitteln kann, um was es geht.
Undzwar ist es so, dass ich derzeit ein Programm programmiere, welches eine Roulette-Simulation bzw. Setztaktiken simuliert. Hierbei ist es möglich die Setzfarbe als String zu wählen "rot" oder "schwarz".
Wenn ich meinen Code so formatier, dass er bei String "rot" eine schöne Ausgabe erzeugt ist es so, dass er alles völlig verzieht, sobald ich auf schwarz ändere. Ich geh mal stark davon aus, dass es an den zusätzlichen Buchstaben liegt. Wie man Zahlen formatiert, weiß ich bereits. Leider habe ich keine Ahnung wie man dies mit einem String so macht, dass es ordentlich funktioniert.
Hier noch die vermeindliche Stelle im Code:
do
{
zahl = zufall.Next(0, 37);
Console.Write("Einsatz: {0,3} auf {1,5}. Gefallen ist: {2,2}, ", einsatz, meineFarbe, zahl);
if (zahl == 0)
{
Console.ForegroundColor = ConsoleColor.Green;
farbe = "grün";
Console.Write("{0} ", farbe);
Console.ResetColor();
Zur besseren Übersicht habe ich euch noch einen Screenshot gemacht.
Könntest Du ein wenig Code dazu zeigen, sodass man hier evtl. den Fehler erkennen kann?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo,
hab oben die vermeindliche Stelle hinzugefügt (hatte ich vergessen, sorry).
Die Option Farbe zu wählen ist unter der Variable "meineFarbe" verbucht.
Hey,
Probier mal
Console.Write("{0}\t", farbe);
LG Killerkruemel
Danke für den Vorschlag. Löst leider mein Problem noch nicht.
Ich füge hier noch ein wenig Code hinzu, vielleicht wird das Problem dann deutlicher.
Das Problem ist hierbei, wenn ich die Variable "meineFarbe" von rot auf schwarz ändere, verschiebt es mir eben den Code genau um die zusätzlichen Buchstaben nach rechts. In diesem Fall dürfte das Problem ja bei dem Platzhalter unten "auf {1}" liegen, oder?
do
{
zahl = zufall.Next(0, 37); //Fallunterscheidung in Farbe
Console.Write("Einsatz: {0,3} auf {1} Gefallen ist: {2,2}, ", einsatz, meineFarbe, zahl);
if (zahl == 0)
{
Console.ForegroundColor = ConsoleColor.Green;
farbe = "grün";
Console.Write("{0} ", farbe);
Console.ResetColor();
}
else if (zahl % 2 == 0)
{
Console.ForegroundColor = ConsoleColor.White;
farbe = "schwarz";
Console.Write("{0} ", farbe);
Console.ResetColor();
}
else
{
Console.ForegroundColor = ConsoleColor.Red;
farbe = "rot";
Console.Write("{0} ", farbe);
Console.ResetColor();
}
(Du kannst deinen Code mit dem C#-Symbol über dem Beitragsfeld übrigens formatieren. =)){gray}
Du kannst ja einfach mit PadLeft oder PadRight die Länge deiner Ausgaben festlegen.
meineFarbe.PadLeft(10," ")
edit: meineFarbe ist richtig 😃
Der Text schwarz ist länger als rot, daher verschiebts dir alles. Auch wenn Tabs drin sind, irgendwann wirds eben zu breit und dann wird das nächte Tab angesprungen.
Eine Lösung kann sein, immer Text in der selben Breite zu schreiben. Das heißt such dir die Maximalbreite heraus und hänge so viele Leerzeichen an den Text an, dass alles gleich breit wird.
So wie du das gerade machst brauchst du kein {0}, da könntest du gleich die Farbe reinschreiben. Zieh die gemeinsamen Stellen aus den if Blöcken raus.
Vielen Dank für die Information.
Das mit den zusätzlichen Leerzeichen zur Ergänzung der fehlenden Buchstaben funktioniert super.
Versteh ich das dann also richtig, dass es keinen Platzhalter gibt, der z.B 8 Stellen freihält um das Format unabhängig von der Eingabe beibehält?
Hallo,
bei
Console.Write("Einsatz: {0,3} auf {1,5}. Gefallen ist: {2,2}, ", einsatz, meineFarbe, zahl);
hast du doch auch schon die Mindestlänge angegeben.
Warum nutzt du das dann nicht bei der Ausgabe der Farbe? Oder wußtest du nicht, was die Zahl hinter dem Komma bedeutet?
Hallo,
scheinbar nicht. Ich bin immer (mach das ja erst kurz. 😛) davon ausgegangen, dass es sich hierbei um eine Möglichkeit zum verschieben handelt.
Heißt das, wenn ich jetzt z.B ("{0,9} bla bla", variable) schreibe, dass ich hier einen Platzhalter habe, der min. 9 Stellen annimmt? Sollte ich z.B schwarz als variable übergeben, ist es ja aber dann nicht so, dass die übrigen Stellen (2) als leerzeichen interpretiert werden, oder?
Du kannst dir das auch mal hier nachlesen: C# String Format - Dot Net Perls
Denn nichts anderes tut Console.WriteLine, wie Du es nutzt.
Wenn Du schreibst:
var s = "123";
Console.WriteLine("<{0,5}>", s);
Console.WriteLine("<{0,-5}>", s);
Damit bekommst Du folgende Ausgabe:
< 123>
<123 >
Da sind jeweils zwei Leerzeichen vor bzw. nach dem 123.
Mit der Zahl nach dem Komma gibst Du also indirekt die Mindest-Länge von dem einzufügenden String an.
Wenn der tatsächliche String kürzer ist, wird der Platz mit Leerzeichen aufgefüllt.
Wenn die Zahl negativ ist, werden die Leerzeichen nach dem einzufügenden String ergänzt, ist sie positiv, landen die Leerzeichen davor.
Übrigens:
Wenn Du komplexe Strings zusammen bastelst, dann hilft String Interpolation sehr dabei, die Übersicht zu behalten.
Mein Beispiel sähe dann so aus:
var s = "123";
Console.WriteLine($"<{s,5}>");
Console.WriteLine($"<{s,-5}>");
Wenn Du einen Text in der Console "verschieben" willst, dann kannst Du entweder die Cursor-Position per Hand setzen, oder Du schreibst Leerzeichen vor deinen String.
Variante mit der Cursor-Position:
var s = "123";
Console.SetCursorPosition(5, 0);
Console.WriteLine(s);
Console.SetCursorPosition(10, 1);
Console.WriteLine(s);
Console.SetCursorPosition(15, 2);
Console.WriteLine(s);
Und die Leerzeichen einfügen:
var s = "123";
Console.WriteLine(new string(' ', 5) + s);
Console.WriteLine(new string(' ', 10) + s);
Console.WriteLine(new string(' ', 15) + s);
Beides produziert die selbe Ausgabe:
123
123
123
Ich persönlich mag die zweite Varainte aber lieber.
NuGet Packages im Code auslesen
lock Alternative für async/await
Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.
recht herzlichen Dank für die ausführliche Antwort! 😉 Hat mir sehr weitergeholfen.
Schönes Restwochenende wünsch ich! 😉
Beste Grüße
Du musst in der Ausgabe der Farbe eine Länge angeben, bspw. 10:
Console.WriteLine("... {0,10}...", variable)
OO gibts seit Platon - hatte der auch C#?