Die Leute hier helfen Dir freiwillig in ihrer Freizeit - für Dich ist das offenbar selbstverständlich. Jedenfalls ist das der Eindruck, den Du hinterlässt.
Statt also einfach ein paar Stunden in ein Einsteigertutorial zu investieren ist(?) Deine Erwartungshaltung, dass Dir das hier jemand unentgeldlich in seiner Freizeit beibringt. Auf entsprechendes Feedback antwortest Du sehr dünnhäutig und patzig.
Wo erwarte ich antworten?
Wann habe ich das geschrieben?
Du unterstellst mir wieder Dinge, die einfach nicht stimmen. Wer mir antworten mag, der kann es tun, wenn nicht, dann nicht.
Aber wenn Leute das Gefühl haben, dass sie ausgenutzt werden, dann muss man sich über entsprechendes Feedback nicht wundern.
Ich vermittel dir das Gefühl dich auszunutzen? Dann antworte bitte auf keine meiner Fragen mehr. Es war nie meine Absicht jemanden auszunutzen. Nochmal: Wer mir helfen möchte, der kann das tun. Wer das nicht möchte, der soll es lassen.
Ich zwinge niemanden dazu.
Und wo habe ich auf Fragen nicht geantwortet? Oder gar patzig?
Das stimmt einfach nicht.
Du kannst gerne nach Feedback fragen und konkrete Probleme hier behandeln - aber erwarte nicht, dass das Forum hier Dein kostenloser Lehrer für Grundlagen ist.
Und nochmal: Du unterstellst mir wieder einfach Dinge, die einfach nicht stimmen. Es tut mir wirklich Leid für dich, dass du so negativ über Unbekannte Menschen denkst.
Du unterschreibst nur wieder, dass Anfängerfragen für dich eben nicht okay sind. Darf man denn fragen, wenn man die Grundlagen nciht versteht, oder sollte man das Programmieren dann gleich sein lassen?
So und nochmal abschließend:
Bitte lieber @Abt antworte auf keine meiner Fragen mehr. Überlese es einfach, wenn ich deine Zeit nicht Wert bin.
Es tut mir wirklich Leid, dass ich nicht so schnell lerne, wie du es gerne hättest und das ich auch verlinkte Seite nicht verstehe und trotzdem nachfrage.
Leider unterstellst du mir Dinge, die ich nicht denke, oder geschrieben habe.
Damit ist alles gesagt, ich möchte deine Unterstellungen hier nur nicht unkommentiert stehen lassen. Und jetzt wieder zurück zum Thema.
Zitat von Abt
(aber hey, Lesen is ja zu viel...)
Was sollen immer diese Seitenhiebe? Ich bin Anfänger. Ist dir das klar? Und leider verstehe ich auch nicht alles. Es tut mir Leid, wenn ich deine Intelligenz und dein Wissen beleidige......
Bitte bleibe sachlich und beim Inhalt.
Du kannst ja gerne meinen Code kritisieren, habe ich kein Problem mit, aber es scheint dir ein Bedürfniss zu sein, Menschen, die nicht alles verstehen, zu denunzieren.
Ich finde es auch sehr merkwürdig, dass hier nach der Antwort eines Problems gefragt wird und dann Antworten a la...."Befrag doch die KI" kommen.
Dann bennennt das Forum um in "C# für Fortgeschrittene & Profis".
Ich nehme mal Bezug auf die Anfangsfrage.
Mein einfacher Lösungsansatz wäre dieser:
long startZeit = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
long warteZeit = 10;
long endZeit = startZeit + warteZeit;
long aktuelleZeit = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
while (!Console.KeyAvailable && endZeit > aktuelleZeit)
{
aktuelleZeit = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
Console.WriteLine();
Console.WriteLine($"Bitte eine Taste drücken, um ins BIOS zu gelangen [{endZeit - aktuelleZeit}s übrig]");
Thread.Sleep(990);
Console.Clear();
}
Console.WriteLine();
if (!Console.KeyAvailable)
Console.WriteLine("Du haste keine Taste gedrückt!");
else
Console.WriteLine("BIOS wird aufgerufen.....", Console.ReadKey().KeyChar);
Geht auch kürzer, aber um sich das mal anzusehen reicht es.
Für mich als Anfänger leichter zu verstehen, als viele Beispielcodes im Netz.
Ich weiß leider nicht, welches Thema dem Themenstarter jetzt wichtiger ist. Der Getränkeautomat, oder die Zeitgeschichte.....
PS:
Habe bewusst deutsche Variablennamen verwendet, damit man es besser versteht.
Jetzt habe ich es verstanden.
Nehmen wir mal an der erste Würfel ist eine 5.
Dann wäre wuerfel[0] = 5
Wenn ich jetzt die for-Schleife durchgehe:
for (int i = 0; i < wuerfel.Length; i++)
{
wuerfel_images[i].Source = new BitmapImage(new Uri($@"/Farkle;component/img/wuerfelbild{wuerfel[i]}.png", UriKind.Relative));
}
wuerfel_image[0] wäre dann wuerfel1_img.
Also das erste Image-Element, welches den ersten Würfel anzeigt.
Dann würde da jetzt das Bild angezeigt werden, weches "/img/wuerfelbild5.png heisst. Also die 5.
Es muss gar nicht mehr eine extra Schleife durchlaufen werden, weil ja schon feststeht, was im Würfel-Array drin ist.
Auf die Idee es so zu machen wäre ich nie gekommen.
Danke für den Hinweis.
Dann haben wir einfach verschiedene Vorstellungen davon, wofür ein Forum da ist.
Ich bin auch nicht patzig oder genervt.
Es ist einfach ein reine Feststellung meinerseits.
Und nochmal:
Das ist ein Hobby. Wer mir nicht helfen möchte, muss es nicht tun.
Wenn ich einen Hinweis nicht verstehe, dann frage ich eben nach. Es ist ja nicht so, dass ich einfach Frage ohne es vorher selbst versucht zu haben, es zu lösen.
Aber wir drehen uns im Kreis.
Wir haben verschiedene Ansichten.
Und damit ist die Sache für mich erledigt.
Ich verstehe nicht, warum in Foren immer der Hinweis gegeben wird zu lesen. Klar muss man lesen. Aber wenn man das nicht versteht, dann fragt man doch nach.
Dafür sind Foren doch da.
Und meine Herangehensweise ist ja nicht falsch. Sie hat funktioniert, auch wenn ich 2 Schleifen
brauchte.
Ich finde nach 7 Tagen Hobbyprogrammierung habe ich schon deutliche Fortschritte gemacht.
Und manchmal muss man auch einfach mal mit dem Wissen loslegen, das man hat.
Du magst der Meinung sein, dass try and error nicht funktioniert, doch so lerne ich persönlich am besten.
Ich muss erst auf ein Problem stoßen und mich dann damit beschäftigen.
Wer keine Lust oder Interesse hat einem Anfänger wie mir zu helfen, dann ist das für mich auch okay.
Ich finde es nur immer doof von oben herab zu schreiben, was man alles nicht kann.
Das ist leider ein typisches IT-Foren Problem.
Ich bin sehr aktiv in der Debian und Linux Community und muss meine Kollegen ständig dazu ermahnen, dass auch Anfängerfragen in Foren berechtigt sind.
Aber ich will jetzt auch nicht weiter ausholen. Das Geschriebene reicht.
Das muss ich erstmal analysieren und verstehen.
Überprüft dein Ausdruck auch, welcher Wert in wuerfel[] steckt?
Wenn ich deins mal durchspiele und für i einfach mal eine 0 einsetze ergibt sich ja folgendes:
wuerfel_images[0] (also das Image Element für den ersten Würfel) ist wuerfel[0].png.
-> Das gibt es gar nicht.
Aber selbst wenn ich wuerfel[i+1] einsetze, dann wird auf das Image Element 0 das Würfelbild 1 gesetzt.
Es fehlt die Überprüfung, ob der erste Würfel nicht eine 3 oder 4 oder 6 ist.
Entweder verstehe ich das noch nicht, oder es war nicht klar genug ausgedrückt, was ich dort mache?
Edit:
Der Code funktioniert, aber ich verstehe nicht, was dort gemacht wird.....
Sehr gut.
Das funktioniert.
Aus:
if (wuerfel[0] == 1)
{
wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild1.png", UriKind.Relative));
}
else if (wuerfel[0] == 2)
{
wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild2.png", UriKind.Relative));
}
else if (wuerfel[0] == 3)
{
wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild3.png", UriKind.Relative));
}
else if (wuerfel[0] == 4)
{
wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild4.png", UriKind.Relative));
}
else if (wuerfel[0] == 5)
{
wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild5.png", UriKind.Relative));
}
else if (wuerfel[0] == 6)
{
wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild6.png", UriKind.Relative));
}
if (wuerfel[1] == 1)
{
wuerfel2_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild1.png", UriKind.Relative));
}
else if (wuerfel[1] == 2)
{
wuerfel2_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild2.png", UriKind.Relative));
}
else if (wuerfel[1] == 3)
{
wuerfel2_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild3.png", UriKind.Relative));
}
else if (wuerfel[1] == 4)
{
wuerfel2_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild4.png", UriKind.Relative));
}
else if (wuerfel[1] == 5)
{
wuerfel2_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild5.png", UriKind.Relative));
}
else if (wuerfel[1] == 6)
{
wuerfel2_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild6.png", UriKind.Relative));
}
if (wuerfel[2] == 1)
{
wuerfel3_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild1.png", UriKind.Relative));
}
else if (wuerfel[2] == 2)
{
wuerfel3_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild2.png", UriKind.Relative));
}
else if (wuerfel[2] == 3)
{
wuerfel3_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild3.png", UriKind.Relative));
}
else if (wuerfel[2] == 4)
{
wuerfel3_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild4.png", UriKind.Relative));
}
else if (wuerfel[2] == 5)
{
wuerfel3_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild5.png", UriKind.Relative));
}
else if (wuerfel[2] == 6)
{
wuerfel3_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild6.png", UriKind.Relative));
}
if (wuerfel[3] == 1)
{
wuerfel4_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild1.png", UriKind.Relative));
}
else if (wuerfel[3] == 2)
{
wuerfel4_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild2.png", UriKind.Relative));
}
else if (wuerfel[3] == 3)
{
wuerfel4_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild3.png", UriKind.Relative));
}
else if (wuerfel[3] == 4)
{
wuerfel4_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild4.png", UriKind.Relative));
}
else if (wuerfel[3] == 5)
{
wuerfel4_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild5.png", UriKind.Relative));
}
else if (wuerfel[3] == 6)
{
wuerfel4_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild6.png", UriKind.Relative));
}
if (wuerfel[4] == 1)
{
wuerfel5_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild1.png", UriKind.Relative));
}
else if (wuerfel[4] == 2)
{
wuerfel5_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild2.png", UriKind.Relative));
}
else if (wuerfel[4] == 3)
{
wuerfel5_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild3.png", UriKind.Relative));
}
else if (wuerfel[4] == 4)
{
wuerfel5_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild4.png", UriKind.Relative));
}
else if (wuerfel[4] == 5)
{
wuerfel5_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild5.png", UriKind.Relative));
}
else if (wuerfel[4] == 6)
{
wuerfel5_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild6.png", UriKind.Relative));
}
if (wuerfel[5] == 1)
{
wuerfel6_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild1.png", UriKind.Relative));
}
else if (wuerfel[5] == 2)
{
wuerfel6_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild2.png", UriKind.Relative));
}
else if (wuerfel[5] == 3)
{
wuerfel6_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild3.png", UriKind.Relative));
}
else if (wuerfel[5] == 4)
{
wuerfel6_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild4.png", UriKind.Relative));
}
else if (wuerfel[5] == 5)
{
wuerfel6_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild5.png", UriKind.Relative));
}
else if (wuerfel[5] == 6)
{
wuerfel6_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild6.png", UriKind.Relative));
}
Wurde jetzt:
for (int i = 0; i < wuerfel.Length; i++)
{
for (int j = 1; j < wuerfel_images.Length+1; j++)
{
if (wuerfel[i] == j)
{
wuerfel_images[i].Source = new BitmapImage(new Uri($@"/Farkle;component/img/wuerfelbild{j}.png", UriKind.Relative));
}
}
}
Vielen Dank für die Hilfe!
Ja wunderbar. So klappt das.
Ich habe jetzt unter
public partial class MainWindow : Window
Das Array erstellt mit:
Image[] wuerfel_images = new Image[6];
Und dann unter :
public MainWindow()
InitializeComponent();
wuerfel_images[0] = this.wuerfel1_img;
wuerfel_images[1] = this.wuerfel2_img;
wuerfel_images[2] = this.wuerfel3_img;
wuerfel_images[3] = this.wuerfel4_img;
wuerfel_images[4] = this.wuerfel5_img;
wuerfel_images[5] = this.wuerfel6_img;
Kann ich das auch noch eleganter lösnen, anstatt ich as Array manuell befülle?
Hatte gerade noch den Beitrag editiert.
Ich bekomme die Fehlermeldung:
Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
Fehler CS0103 Der Name "wuerfel_images" ist im aktuellen Kontext nicht vorhanden. Farkle C:\Users\Marco\source\repos\Spielereien\Farkle\MainWindow.xaml.cs 84 Aktiv
Sooo....ich wollte das Thema heute nochmal angehen. Mir ist noch nicht klar, wie das funktioniert.
In der XAML habe ich folgendes stehen:
<Image x:Name="wuerfel1_img" Grid.Row="6" Grid.Column="2" Grid.RowSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel1_img_MouseDown"/>
<Image x:Name="wuerfel2_img" Grid.Row="6" Grid.Column="3" Grid.RowSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel2_img_MouseDown"/>
<Image x:Name="wuerfel3_img" Grid.Row="6" Grid.Column="4" Grid.RowSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel3_img_MouseDown"/>
<Image x:Name="wuerfel4_img" Grid.Row="6" Grid.Column="5" Grid.RowSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel4_img_MouseDown"/>
<Image x:Name="wuerfel5_img" Grid.Row="6" Grid.Column="6" Grid.RowSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel5_img_MouseDown"/>
<Image x:Name="wuerfel6_img" Grid.Row="6" Grid.Column="7" Grid.RowSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel6_img_MouseDown"/>
Im Code möchte ich dann die Namen ansprechen. Also kein Bild, sondern den Namen und dieses Image Element dann unsichtbar machen.
Derzeit spreche ich die Namen immer einzeln an.
wuerfel1_img.Visibility = Visibility.Hidden;
wuerfel2_img.Visibility = Visibility.Hidden;
wuerfel3_img.Visibility = Visibility.Hidden;
wuerfel4_img.Visibility = Visibility.Hidden;
wuerfel5_img.Visibility = Visibility.Hidden;
wuerfel6_img.Visibility = Visibility.Hidden;
Das würde ich aber gerne mit einer Schleife erledigen, da ich häufiger im Code auf den Namen zurückgreifen muss.
So beispielsweise:
Random zufallszahlen = new Random();
for (int i = 0; i < 6; i++)
{
wuerfel[i] = zufallszahlen.Next(1, 7);
}
if (wuerfel[0] == 1)
{
wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild1.png", UriKind.Relative));
}
else if (wuerfel[0] == 2)
{
wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild2.png", UriKind.Relative));
}
else if (wuerfel[0] == 3)
{
wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild3.png", UriKind.Relative));
}
else if (wuerfel[0] == 4)
{
wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild4.png", UriKind.Relative));
}
else if (wuerfel[0] == 5)
{
wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild5.png", UriKind.Relative));
}
else if (wuerfel[0] == 6)
{
wuerfel1_img.Source = new BitmapImage(new Uri(@"/Farkle;component/img/wuerfelbild6.png", UriKind.Relative));
}
Das muss ich derzeit 6 Mal machen. Für jeden Würfel einzeln, damit ich direkt den Namen des Elements ansprechen kann.
Ich möchte also kein Bild, sondern die Elemente in ein Array packen.
Geht das?
Edit: Auf der verlinkten Seite wird das Beispiel geben:
TextBox[] textBoxes = new TextBox[] { this.textBox1, this.textBox2, this.textBox3 };
Ich habe ja keine Textbox, sondern Image-Elemente, daher habe ich das probiert:
Image[] wuerfel_images = new Image[] { this.wuerfel1_img, this.wuerfel2_img, this.wuerfel3_img, this.wuerfel4_img, this.wuerfel5_img, this.wuerfel6_img };
Aber stimmt das?
Wenn ich das dort platziere:
InitializeComponent();
Image[] wuerfel_images = new Image[] { this.wuerfel1_img, this.wuerfel2_img, this.wuerfel3_img, this.wuerfel4_img, this.wuerfel5_img, this.wuerfel6_img };
Dann kann ich da nicht drauf zugreifen.
private void Wuerfelunsichtbar()
{
for (int i = 0; i < wuerfel_images.Length; i++)
{
wuerfel_images[i].Visibility = Visibility.Hidden;
}
}
Fehler CS0103 Der Name "wuerfel_images" ist im aktuellen Kontext nicht vorhanden. Farkle C:\Users\Marco\source\repos\Spielereien\Farkle\MainWindow.xaml.cs 84 Aktiv
Genau....das Menü ist noch nicht fertig. Ist noch Early-Access 😄
Hier geht es zur Projektvorstellung:
https://mycsharp.de/forum/threads/125755/wuerfelspiel-farkle
Ich werde es jetzt erstmal vorerst so lassen, da ich alle nötigen Elemente erstmal auf "Hidden" gesetzt habe und durch den Klick auf "Spiel starten" sichtbar mache.
Ich habe die Hierarchie bisher nur in der Reihenfolge sichergestellt.
Aber eventuell müsste ich das noch durch Einrücken im Code festlegen?
Hier mal meine derzeitige XAML (bitte nicht Diffamieren, ich mache das erst seit 4 Tagen ):
....
<Image x:Name="menue_img" Grid.Row="0" Grid.Column="2" Grid.RowSpan="14" Grid.ColumnSpan="6" HorizontalAlignment="Center" VerticalAlignment="Top" Stretch="UniformToFill" Source="img/menue.png" Visibility="Hidden"/>
<Label x:Name="menue_start_label" Content= "Spiel starten" Grid.Row="4" Grid.Column="3" Grid.ColumnSpan="3" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="30" FontFamily="Segoe Script" Visibility="Visible" Background="{x:Null}" BorderThickness="0" MouseEnter="menue_start_label_MouseEnter" MouseLeave="menue_start_label_MouseLeave" MouseLeftButtonDown="menue_start_label_MouseLeftButtonDown" />
<Label x:Name="menue_regeln_label" Content= "Regeln" Grid.Row="5" Grid.Column="3" Grid.ColumnSpan="3" HorizontalAlignment="Center" VerticalAlignment="Top" FontSize="30" FontFamily="Segoe Script" Visibility="Visible" Background="{x:Null}" BorderThickness="0" MouseEnter="menue_regeln_label_MouseEnter" MouseLeave="menue_regeln_label_MouseLeave" MouseLeftButtonDown="menue_regeln_label_MouseLeftButtonDown" />
<Label x:Name="quit_label" Content= "Beenden" Grid.Row="11" Grid.Column="3" Grid.ColumnSpan="3" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="30" FontFamily="Segoe Script" Visibility="Visible" Background="{x:Null}" BorderThickness="0" MouseLeftButtonDown="quit_label_MouseLeftButtonDown" MouseEnter="quit_label_MouseEnter" MouseLeave="quit_label_MouseLeave" />
<Label x:Name="menue_punkte_label" Content= "Punkte" Grid.Row="6" Grid.Column="3" Grid.ColumnSpan="2" HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="30" FontFamily="Segoe Script" Visibility="Visible" Background="{x:Null}" BorderThickness="0" />
<Label x:Name="spielereins_label" Content= "Spieler 1" Grid.Row="7" Grid.Column="3" Grid.ColumnSpan="2" HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="30" FontFamily="Segoe Script" Visibility="Visible" Background="{x:Null}" BorderThickness="0" />
<Label x:Name="spielerzwei_label" Content= "Spieler 2" Grid.Row="8" Grid.Column="3" Grid.ColumnSpan="2" HorizontalAlignment="Left" VerticalAlignment="Bottom" FontSize="30" FontFamily="Segoe Script" Visibility="Visible" Background="{x:Null}" BorderThickness="0" />
<TextBox x:Name="menue_punkte_txtbox" Text="" Grid.Column="4" Grid.ColumnSpan="2" HorizontalAlignment="Left" Grid.Row="6" TextWrapping="Wrap" VerticalAlignment="Center" FontSize="40" Background="{x:Null}" MinWidth="200"/>
<TextBox x:Name="menue_spielereins_txtbox" Text="" Grid.Column="4" Grid.ColumnSpan="2" HorizontalAlignment="Left" Grid.Row="7" TextWrapping="Wrap" VerticalAlignment="Center" FontSize="40" Background="{x:Null}" MinWidth="200"/>
<TextBox x:Name="menue_spielerzwei_txtbox" Text="" Grid.Column="4" Grid.ColumnSpan="2" HorizontalAlignment="Left" Grid.Row="8" TextWrapping="Wrap" VerticalAlignment="Center" FontSize="40" Background="{x:Null}" MinWidth="200" Margin="0,0,20,0"/>
<Image x:Name="regeltext_img" Grid.Row="3" Grid.Column="3" Grid.RowSpan="9" Grid.ColumnSpan="3" HorizontalAlignment="Center" Source="img/regelntext.png" Visibility="Hidden" Stretch="Fill" Margin="0,0,20,20" />
<Image x:Name="pfeil_img" Grid.Row="10" Grid.Column="2" HorizontalAlignment="Center" Source="img/pfeil.png" Visibility="Hidden" MouseEnter="pfeil_img_MouseEnter" MouseLeave="pfeil_img_MouseLeave" MouseLeftButtonDown="pfeil_img_MouseLeftButtonDown"/>
<MediaElement x:Name="wuerfel_media" LoadedBehavior="Manual" Source="sound/wuerfelsound.wav" />
<MediaElement x:Name="applaus_media" LoadedBehavior="Manual" Source="sound/applaus.wav" />
<MediaElement x:Name="background_media" Source="sound/TavernTheme4.wav"/>
</Grid>
</Window>
Soll ja auch erstmal nur ein kleines Projekt zum Üben sein.
Sind auch noch nicht alle Regeln enthalten.
Wer möchte kann sich das Spiel ja mal herunterladen und ansehen.
https://drive.google.com/file/d/1ts1xWAJwZNnEUqCbXHJPabJt97Dy1QBk/view?usp=sharing
Mein derzeitiger Workaround ist, dass komplette Hintergrundbild auszutauschen, wenn man "Spiel starten" klickt.
Also zu Spielstart ist die Schriftrolle fix, also ein Bild mit Holztisch.
Nach dem Starten wird dann nur noch ein Bild mit dem Tisch angezeigt.
Das funktioniert soweit gut.
Ich habe ein weiteres Problem:
Ich habe mir ein Menü gebaut. (Bild im Anhang)
Ich habe ein Grid-Background gesetzt. Dieser ist der Holztisch, den man auf dem Bild erkennen kann.
Darauf liegen dann andere Images.
Soweit ich weiß ist Grid hierarchisch aufgebaut, deswegen habe ich auch die Reihenfolge beachtet.
Doch sobald ich irgendeine Taste auf der Tastatur drücke, ist das Bild der Schriftrolle weg. Und man sieht den Tisch, also den Grid Background.
Wie kann ich das verhindern?
Die Labels und Textboxen sind noch zu sehen, nur das Schriftrollenbild ist weg.
Weiß da jemand einen Rat?
Aaaah okay. Vielen Dank.
das hilft mir schonmal ordentlich weiter.
Ich habe hier folgenden Code, der Teil einer if-Abfrage ist:
if ( bla bla)
{
for (int i = 0; i < wuerfel.Length; i++)
{
wuerfelKlick[i] = false;
wuerfel[i] = zufallszahlen.Next(1, 7);
}
wuerfel1_img.Visibility = Visibility.Visible;
wuerfel2_img.Visibility = Visibility.Visible;
wuerfel3_img.Visibility = Visibility.Visible;
wuerfel4_img.Visibility = Visibility.Visible;
wuerfel5_img.Visibility = Visibility.Visible;
wuerfel6_img.Visibility = Visibility.Visible;
}
Wie schaffe ich es, dass ich alle Labels gleichzeit ändern kann?
Die Labelnamen vergibt man ja in im XAML Teil.
<Image x:Name="wuerfel1_img" Grid.Row="5" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel1_img_MouseDown"/>
<Image x:Name="wuerfel2_img" Grid.Row="5" Grid.Column="3" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel2_img_MouseDown"/>
<Image x:Name="wuerfel3_img" Grid.Row="5" Grid.Column="4" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel3_img_MouseDown"/>
<Image x:Name="wuerfel4_img" Grid.Row="5" Grid.Column="5" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel4_img_MouseDown"/>
<Image x:Name="wuerfel5_img" Grid.Row="5" Grid.Column="6" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel5_img_MouseDown"/>
<Image x:Name="wuerfel6_img" Grid.Row="5" Grid.Column="7" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel6_img_MouseDown"/>
Wäre ja schön, wenn man das auch irgendwie Indexieren könnte und dann mit einer Forschleife oder ähnlichem macht.
Also so in der Art:
for (int i = 1; i < wuerfel.Length; i++)
{
wuerfel{i}_img.Visibility = Visibility.Visible;
}
Keine Ahnung, wie ich das besser ausdrücken soll, was ich vor habe.
Ich hoffe ihr könnt mir folgen.
Aaaaah okay.....
Wenn ich dein Spiel richtig verwendet habe, dann werden die Punkte automatisch gewertet.
Bei meinem Ansatz muss man die Zahlen erst anklicken.
Und kann sie auch wieder abwählen während des Zuges.
Durch das Anklicken ändert sich dann das Würfelimage
Das macht das ganz aufwändiger.
Ich muss dann beispielsweise abfragen, ob der Benutzer die 3 gleichen Zahlen angeklickt hat. Wenn er nur 2 anklickt, dann wird der Punkten und Würfeln Button deaktiviert.
Ich habe das Spiel nach den Regeln von Kingdom Come Deliverance übernommen.
Das kann man auch einfach nur eine 1 oder sogar nur eine 5 nehmen und dann entweder punkten und passen, du hast das "Werten" genannt, oder aber eben punkten und würfeln.
Aber interressant zu sehen, wie dein Spiel aussieht und gespielt wird.
Danke für den Einblick.
@Th69
Du hast Recht.
Die extra check-Abfrage ist überflüssig. Manchmal neige ich dazu lieber doppelt abzufragen, wenn ich mir nicht sicher bin und in Gedankengängen festhänge.
Wenn man dann noch die Kinder versorgen muss oder wieder irgendwas dazwischen kommt und abgelenkt ist, dann passiert mir das manchmal.
Und ja du hast auch Recht, dass es auch mehr sein können.
Der Code sollte nur als Beispiel für genau 3 sein.
Aber vielen Dank für den Hinweis!
Aktuell habe ich noch Probleme das alles in WPF umzusetzen.
Bisher habe ich ja immer nur Buttons bzw. Klicks abgefragt.
Aber wie kann ich was zur Laufzeit ändern?
Wenn man in einer Runde alle Würfel ausspielt, dann soll man ja 6 neue bekommen.
Aber wenn ich den Button klicke, dann ist das Event schon wieder weg.
Ich glaube dafür benötigt man einen sogenannten dispatcher Timer.
Aber darum soll es hier auch nciht gehen......
Ist nur alle so viel aufeinmal zu lernen.
Vielleicht ist wpf halt auch einfach nicht dafür ausgelegt ein Spiel umzusetzen.....
Aber wie ich ein Array nun abfrage ist mir hier deutlich geworden und darum geht es in diesem Thema ja.
@danoe hat Recht!
Genau so ist es.
In wuerfelCheck wird die Anzahl der gewürfelt Würfel im Index gespeichert.
Im Index 0 steht wie oft die 1 gewürfelt wurde.
Im Index 1 die 2
usw....
Am Ende überprüfe ich mit Contain, ob irgendeine Zahl 3 Mal vorkommt.
Hier ist mal mein einfachess Beispiel:
int[] wuerfel = new int[6];
int[] wuerfelCheck = new int[6];
bool check = false;
Random random = new Random();
for (int i = 0; i < wuerfel.Length; i++)
wuerfel[i] = random.Next(1, 7);
Console.WriteLine("Gewürfelte Zahlen:");
foreach (int i in wuerfel)
{
Console.WriteLine(i);
}
Console.WriteLine();
Console.WriteLine("Zahlen im Checker:");
foreach (int i in wuerfelCheck)
{
Console.WriteLine(i);
}
for (int i = 0; i < wuerfel.Length; i++)
{
for (int j = 1; j < wuerfelCheck.Length+1; j++)
{
if (wuerfel[i] == j)
{
wuerfelCheck[j-1] += 1;
}
}
}
Console.WriteLine();
Array.Sort(wuerfel);
Console.WriteLine("Würfel sortiert:");
foreach (int i in wuerfel)
{
Console.Write($"{i} ");
}
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("Zahlen im Checker nach dem Check:");
foreach (int i in wuerfelCheck)
{
Console.WriteLine(i);
}
check = wuerfelCheck.Contains(3);
for (int i = 0; i < wuerfelCheck.Length; i++)
{
if (wuerfelCheck[i] == 3 && check == true)
{
Console.WriteLine();
Console.WriteLine($">>> Die Zahl {i+1} kommt 3 Mal vor! <<<");
}
}
if (check == false)
{
Console.WriteLine();
Console.WriteLine($">>> Es kommt keine Zahl 3 Mal vor! <<<");
}
So funktioniert es.
Man könnte noch ein mehrdimensionales Array benutzen und englische Variablennamen.
Aber zur Veranschaulichung und zum Lernen war es für mich sehr lehrreich.
Moin!
Ich habe eine Frage zu Arrays in C#.
Gibt es ein fertiges Pendant zum Slice Ausdruck von Python in C#?
Wenn ich beispielsweise überprüfen will, was sich im Index 2 bis 5 in einem Array befindet?
In Python ginge das so:
a = np.array([1, 5, 7, 10])
print(a)
b = a[1:]
print(b)
Die Ausgabe wäre dann
[1 5 7 10]
[5 7 10]
Es wird ab Index 1 ausgegeben.
Oder so:
a = np.array([2, 4, 6, 8])
print(a)
b = a[:2]
print(b)
Da wäre die Ausgabe:
[2 4 6 8]
[2 4]
Es wird bis Index 2 ausgegeben.
Ich kenne mich nur etwas besser in Python aus und da ist es designtechnisch natürlich nötig, dass wenn eine Methode aufgerufen wird, diese vor der Methode definiert werden muss, die sie aufruft.
Bei allen C# Programmcodes, die ich bisher gelesen habe, scheint es usus zu sein, dass es genau umgekehrt ist.
Ist das immer so?
Ist das ein Stil?
Mir ist klar, dass Python anders arbeitet, aber in C# müsste es doch eigentlich egal sein, oder?
Der Code wird ja nicht zur Laufzeit kompiliert bzw. Intepretiert.
Aber trotzdem wird es so gemacht.
Ah super. Vielen Dank für die Antworten.
Ich wollte nur sicher gehen, dass es keinen vorgefertigtren Ausdruck dafür in C# gibt.
Wie gesagt, dass ist immer mein Problem.
Ich habe auch noch mehr allgemeine Fragen, aber die Stelle ich in gesonderten Themen.
Also: Vielen Dank für eure Hilfe!
Ich möchte einfach in alles mögliche reinschauen, was mit C# so möglich ist.
Eigentlich wollte ich auch nur einen BMI Rechner und einen Würfelgenerator usw bauen.
Das hat auch mit Windows Form und WPF gut geklappt.
Mit Konsolenanwendungen habe ich auch angefangen, aber wollte jetzt mal etwas grafisches machen.
Und da weiß ich wie gesagt immer nicht, wo das Programm was verlangt.
Jetzt hast du mir einmal konkret den Tip gegeben und jetzt weiß ich es. So lerne ich persönlich immer besser, wenn man mir direkt Code gibt für mein Problem.
Dann speichere ich das ab, wie das ging und es geht weiter.
Deswegen helfen mir auch so allgemeine Code antworten nicht so gut. Die sind oft nicht so, wie ich es genau brauche.
Konsolenanwendungen habe ich auch ein paar kleinere gemacht.
Tic Tac Toe, Zahlenratespiel und so einzelne allgemeine Dinge.
Daten aus einer Datei laden, bzw. schreiben.
Klassen anlegen und Methodenschreiben.
Aber wie gesagt: Dieses wissen dann in der GUI anwenden ist nochmal anders, weil man da auch mit Eventhandlern arbeitet.
Auch hat man in der Konsole keine Textboxen oder Labels, die man ansprechen muss.
Oder Grafiken einblenden.
Buttons mit Funktionen bestücken. Eventuell auch mal Buttons verstecken oder deaktivieren, wenn eine Checkbox nicht aktiviert ist.
All das lernt man in der Konsole nicht.
Mir macht das Programmieren als Hobby auch echt Spaß.
Die ersten versuche hatte ich mit C während meiner Ausbildung als Industrieelektroniker anfang der 2000'er.
Tja.....und jetzt ist der Sohn bald 12 und findet Programmieren auch toll. Und jetzt fange ich halt mal mit C# an.
Mein Code ist für Profis wahrscheinlich grausig, aber das liegt auch einfach daran, dass man viele Funktionen und Eigenschaften gar nicht kennt.
Und dann macht es noch jeder anders.
Alles nicht so einfach, aber ich bleib dran.
Ja super. Das funktioniert jetzt. Vielen Dank!
Und wie sähe der Code aus, wenn ich zusätzlich noch prüfen möchte, ob 3 gleiche Zahlen auftreten?
Also entweder eine 1 oder eine 5 oder beispielsweise 3 x die 2, oder 3 x die 3.
Ich versuche mich gerade an dem Spiel "Farkle".
Wenn man würfelt und es ist keine 1, 5 oder 3 gleiche oder 5 aufeinanderfolgende Zahlen (1,2,3,4,5) bzw. (2,3,4,5,6) dabei, dann ist der nächste Spieler dran.
Ich habe jetzt das hier probiert:
bool containsNumber = wuerfel.Contains(1 | 5);
if (containsNumber == false)
Also wenn im Array nicht mindestens eine 1 oder eine 5 enthalten ist, dann soll die if Anweisung greifen.
Machen wir erstmal das, bevor ich mehr Bedingungen habe.
Ich verstehe nicht, was ich in die Klammer hinter Contain schreiben soll.
Ich erstelle ein Integer-Array und fülle dieses mit zufälligen Zahlen von 1 bis 6.
int[] wuerfel = new int[6];
for (int i = 0; i < 6; i++)
{
wuerfel[i] = zufallszahlen.Next(1, 7);
}
Wie sähe der Code aus, um zu überprüfen, ob eine 1, eine 5 oder 3 Mal die gleiche Zahl enthalten ist?
Contains kann scheinbar nur mit Strings umgehen?
Kann mir da jemand helfen?
Ah okay.
Das sind wieder ganz neue Dinge, die ich vorher noch nicht gesagt bekommen oder gelesen habe.
Der Grund, warum ich mir C# ansehe ist, dass mein Sohn gerne mal mit Unity ein Spiel erstellen will und das basiert ja auf C#.
Persönlich kenne ich auch immer nur die Grundlagen von Python und C#.
Lua hatte ich mir auch mal angesehen, weil ich Handyanwendungen erstellen wollte, aber das basieren die ganzen Videos auch immer nur auf Konsolenanwendungen.
Das macht zum lernen auch Sinn, aber wenn es dann um GUI geht, dann sind gute Videos spärlich.
Vieles funktionierte auch nicht, wie im Video angegeben, also habe ich das auch wieder verworfen.
In Python habe ich mit Tkinter ein paar einfache Programme geschrieben. Unter Linux konnte ich das sogar zu einer apk umwandeln.
Aber das war auch alles umständlich.
Mit Pygame habe ich auch kleinere 2D Spiele erstellt, aber das ist auch aufwendiger, als mit modernen Engines.
Also hieß es jetzt:
Unity und C#.
Wenn man ganz neu ist, dann weiß man das leider alles nicht.
Man guckt zig Youtube Videos und liest hier und da und jeder macht es anders.
Die "Profis" machen leider keine Lernvideos und man macht einfach das nach, was andere machen.
Ich habe nur die Info:
Windows Forms nutzt man nicht mehr und ist veraltet.
Man nutzt jetzt WPF.
Ich nutze jetzt WPF weil die Elemente einfach mit skalieren, weil man mir Grid oder Pack oder was auch immer einfach Layouts erstellen kann.
Das hilft mir nur leider nicht.
Klassen und so weiter verstehe ich, aber mein Problem ist, wie ich das in WPF anwende.
Wenn ich einfache Konsolenanwendungen schreibe verstehe ich das, aber ich weiß leider nicht, wo und an welcher Stelle GUI Programme was reingeschrieben haben wollen.
Das ist mein Problem.....
Wo darf ich eine eigene Klasse erstellen, damit sie berücksichtigt wird?
Mit einem Beispiel wäre mir mehr geholfen, als ein Hinweis, dass ich zu doof sei.
Ich lerne einfach besser, wenn man mir gezielt in meinem Code hilft.
using System.Text;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Farkle
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
}
private void wuerfel1_img_MouseDown(object sender, MouseButtonEventArgs e)
{
}
}
}
An welcher Stelle müsste ich die Variable erstellen?
PS:
Mit Win Forms war das Ressourcenanlegen einfacher. Ich versuche das gerade mit WPF.
Ich bin ganz neu in der C#Welt und kenne mich noch nicht gut aus. Deshalb zerreist mich bitte nicht gleich, wenn ich etwas nicht gleich verstehe.
Aber nun zu meiner Frage:
XAML:
Ich habe einen Button platziert.
<Button x:Name="wuerfeln_btn" Content="Würfeln" Grid.Row="10" Grid.Column="4" Grid.ColumnSpan="2" FontSize="50" Click="Button_Click" />
Und ein Image:
<Image x:Name="wuerfel1_img" Grid.Row="5" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center" MouseDown="wuerfel1_img_MouseDown"/>
Hier der Code vom Button:
private void Button_Click(object sender, RoutedEventArgs e)
{
punkten_btn.Visibility = Visibility.Visible;
passen_btn.Visibility = Visibility.Visible;
wuerfeln_btn.Visibility = Visibility.Hidden;
System.Media.SoundPlayer player = new System.Media.SoundPlayer(@"f:\wuerfelsound.wav");
player.Play();
int wuerfelanzanl = 6;
Random zufallszahlen = new Random();
int[] wuerfel = new int[wuerfelanzanl];
for (int i = 0; i < wuerfel.Length; i++)
{
wuerfel[i] = zufallszahlen.Next(1, 7);
}
if (wuerfel[0] == 1)
{
wuerfel1_img.Source = new BitmapImage(new Uri(@"C:\Users\Marco\source\repos\Spielereien\Farkle\Ressources\img\wuerfelbild 1.png"));
}
else if (wuerfel[0] == 2)
{
wuerfel1_img.Source = new BitmapImage(new Uri(@"C:\Users\Marco\source\repos\Spielereien\Farkle\Ressources\img\wuerfelbild 2.png"));
}
else if (wuerfel[0] == 3)
{
wuerfel1_img.Source = new BitmapImage(new Uri(@"C:\Users\Marco\source\repos\Spielereien\Farkle\Ressources\img\wuerfelbild 3.png"));
}
else if (wuerfel[0] == 4)
{
wuerfel1_img.Source = new BitmapImage(new Uri(@"C:\Users\Marco\source\repos\Spielereien\Farkle\Ressources\img\wuerfelbild 4.png"));
}
else if (wuerfel[0] == 5)
{
wuerfel1_img.Source = new BitmapImage(new Uri(@"C:\Users\Marco\source\repos\Spielereien\Farkle\Ressources\img\wuerfelbild 5.png"));
}
else
{
wuerfel1_img.Source = new BitmapImage(new Uri(@"C:\Users\Marco\source\repos\Spielereien\Farkle\Ressources\img\wuerfelbild 6.png"));
}
for (int i = 0; i < wuerfel.Length; i++)
{
wuerfel[i] = zufallszahlen.Next(1, 7);
}
if (wuerfel[0] == 1)
{
wuerfel2_img.Source = new BitmapImage(new Uri(@"C:\Users\Marco\source\repos\Spielereien\Farkle\Ressources\img\wuerfelbild 1.png"));
}
else if (wuerfel[0] == 2)
{
wuerfel2_img.Source = new BitmapImage(new Uri(@"C:\Users\Marco\source\repos\Spielereien\Farkle\Ressources\img\wuerfelbild 2.png"));
}
else if (wuerfel[0] == 3)
{
wuerfel2_img.Source = new BitmapImage(new Uri(@"C:\Users\Marco\source\repos\Spielereien\Farkle\Ressources\img\wuerfelbild 3.png"));
}
else if (wuerfel[0] == 4)
{
wuerfel2_img.Source = new BitmapImage(new Uri(@"C:\Users\Marco\source\repos\Spielereien\Farkle\Ressources\img\wuerfelbild 4.png"));
}
else if (wuerfel[0] == 5)
{
wuerfel2_img.Source = new BitmapImage(new Uri(@"C:\Users\Marco\source\repos\Spielereien\Farkle\Ressources\img\wuerfelbild 5.png"));
}
else
{
wuerfel2_img.Source = new BitmapImage(new Uri(@"C:\Users\Marco\source\repos\Spielereien\Farkle\Ressources\img\wuerfelbild 6.png"));
}
usw.......
Hier überlege ich noch, wie ich den Code nicht 6 Mal schreiben muss, aber das Problem gehe ich später an.
Wie man erkennen kann sorgt ein Klick auf den Button dafür, dass 6 random-Zahlen erzeugt werden und in ein Array geschrieben werden.
Nun überprüfe ich mit For-Schleifen, welcher Wert im Index des Array vorhanden ist und lasse entsprechende Grafik anzeigen.
Und jetzt kommt mein Problem:
Nachdem gewürfelt wurde, möchte ich auf das entsprechende Bild klicken und mit dem Wert weiter rechnen.
Dafür habe ich diese Methode angelegt:
private void wuerfel1_img_MouseDown(object sender, MouseButtonEventArgs e)
{
}
Doch ich weiß nicht, wie ich auf den Variablen-Wert, der von der ButtonClickMethode erstellt wurde, zugreifen kann.
Mir kam schon die Idee den Wert als in unsichtbare Labels zu schreiben, aber das scheint mir ein schlechter Stil zu sein. Das muss doch einfacher und anders gehen.
Ich hoffe Ihr versteht mich und könnt mir helfen......