Compare commits

..

16 Commits

Author SHA1 Message Date
bac95e169e sollte jetzt alles passen mit den namen der autoren 2025-06-16 23:46:11 +02:00
b4f495990b Nik hatt auf einmal einne nachnamen 2025-06-16 23:45:39 +02:00
81f77773f3 Emoji weg mache sieht doch nicht so gut aus 2025-06-16 23:44:40 +02:00
9874e65314 Die README Datei 2025-06-16 23:44:02 +02:00
2fb05f7470 Merge branch 'main' of https://git.bib.de/PBT3H24AFA/Lotto_WPf 2025-06-16 23:09:43 +02:00
39929c0115 die lösung des letzten problems ins protokoll der txt datei gespeichert 2025-06-16 23:09:40 +02:00
8ce0ff6b82 Merge branch 'main' of https://git.bib.de/PBT3H24AFA/Lotto_WPf 2025-06-16 23:03:40 +02:00
640dc22681 Fertige abgabe 2025-06-16 23:03:33 +02:00
1d929d5ad0 Merge branch 'main' of https://git.bib.de/PBT3H24AFA/Lotto_WPf 2025-06-16 23:00:12 +02:00
ec6b5f1820 Problem_Protokoll erweitert fast fertig und txt zur sicherheit rein gemacht 2025-06-16 23:00:08 +02:00
12487a8e02 Fertige abgabe 2025-06-16 21:59:20 +02:00
e054e6c31b fast fertig 2025-06-16 21:26:18 +02:00
64ef945a5a Update Lotto_Wpf/Lotto_Wpf/MainWindow.xaml.cs 2025-06-11 13:56:42 +02:00
21ac67aee4 Update Lotto_Wpf/Lotto_Wpf/MainWindow.xaml 2025-06-11 13:56:07 +02:00
3f904744d2 Update Lotto_Wpf/Lotto_Wpf/MainWindow.xaml.cs 2025-06-11 12:54:58 +02:00
5f4e0d222d Update Lotto_Wpf/Lotto_Wpf/MainWindow.xaml 2025-06-11 12:52:30 +02:00
6 changed files with 377 additions and 135 deletions

View File

@@ -0,0 +1,39 @@
using System;
using System.Linq;
namespace LottoProject
{
public class Lotto
{
public int[] GezogeneZahlen { get; private set; } = new int[6];
public int TrefferAnzahl { get; private set; } = 0;
public Lotto(int[] userZahlen)
{
Ziehen();
TrefferAnzahl = Treffer(userZahlen, GezogeneZahlen);
}
private void Ziehen()
{
Random rnd = new();
for (int i = 0; i < GezogeneZahlen.Length; i++)
{
int zahl;
do
{
zahl = rnd.Next(1, 50);
}
while (GezogeneZahlen.Contains(zahl));
GezogeneZahlen[i] = zahl;
}
}
public int Treffer(int[] user, int[] gezogen)
{
return user.Count(gezogen.Contains);
}
}
}

View File

@@ -1,131 +1,25 @@
<Window x:Class="LottoApp.MainWindow" <Window x:Class="LottoNumberBoard.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Lotto App" Height="600" Width="800" Title="Lotto Number Board" Height="600" Width="400">
Background="#1e1e1e" <ScrollViewer VerticalScrollBarVisibility="Auto">
WindowStartupLocation="CenterScreen" <DockPanel Margin="10">
Loaded="Window_Loaded">
<Grid> <StackPanel DockPanel.Dock="Bottom" Margin="0,10,0,0">
<Grid.ColumnDefinitions> <TextBlock Text="Selected Numbers:" FontWeight="Bold" FontSize="16" />
<ColumnDefinition Width="80"/> <TextBlock x:Name="ResultTextBlock" FontSize="14" Foreground="DarkBlue" TextWrapping="Wrap"/>
<ColumnDefinition Width="*"/> <TextBlock Text="Startgeld (€):" FontWeight="Bold" Margin="0,10,0,0"/>
</Grid.ColumnDefinitions> <TextBox x:Name="StartgeldTextBox" Text="2000" Width="100" Margin="0,0,0,10"/>
<Button Content="Ziehen" Margin="0,10,0,0" Click="DrawButton_Click" Height="30"/>
<Button Content="Simulation starten" Margin="0,10,0,0" Click="SimulationButton_Click" Height="30"/>
<StackPanel Grid.Column="0" Background="#111" Orientation="Vertical">
<TextBlock Text="LOTTO" FontSize="16" FontWeight="Bold"
Foreground="White" Margin="0,20,0,20"
HorizontalAlignment="Center"/>
<Button Content="Home" FontSize="12" Margin="10" Background="Transparent" Foreground="White"/>
<Button Content="Spiel" FontSize="12" Margin="10" Background="Transparent" Foreground="White"/>
<Button Content="Geschichte" FontSize="12" Margin="10" Background="Transparent" Foreground="White"/>
</StackPanel> </StackPanel>
<!-- Main --> <ScrollViewer DockPanel.Dock="Top">
<StackPanel Grid.Column="1" Margin="20"> <UniformGrid x:Name="NumberGrid" Columns="7" Rows="7" Margin="0,0,0,10"/>
<TextBlock Text="Lotto " FontSize="28" FontWeight="Bold" Foreground="White" Margin="0,0,0,20"/> </ScrollViewer>
<UniformGrid x:Name="NumberGrid" Rows="7" Columns="7" Margin="0,0,0,20"/>
<TextBlock x:Name="SelectedNumbersText" Foreground="White" FontSize="16" Margin="0,0,0,10"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,10,0,0"> </DockPanel>
<Button Content="Wahlen" Width="100" Margin="0,0,10,0" Click="QuickPick_Click"/> </ScrollViewer>
<Button Content="Loschen" Width="75" Margin="0,0,10,0" Click="Clear_Click"/>
</StackPanel>
</StackPanel>
<x:Code>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
List<int> selectedNumbers = new List<int>();
void Window_Loaded(object sender, RoutedEventArgs e)
{
for (int i = 1; i <= 49; i++)
{
Button btn = new Button
{
Content = i.ToString(),
Margin = new Thickness(5),
Background = Brushes.LightGray,
Foreground = Brushes.Black,
Tag = i
};
btn.Click += NumberButton_Click;
NumberGrid.Children.Add(btn);
}
}
void NumberButton_Click(object sender, RoutedEventArgs e)
{
Button btn = sender as Button;
int number = (int)btn.Tag;
if (selectedNumbers.Contains(number))
{
selectedNumbers.Remove(number);
btn.Background = Brushes.LightGray;
}
else if (selectedNumbers.Count < 6)
{
selectedNumbers.Add(number);
btn.Background = Brushes.Orange;
}
SelectedNumbersText.Text = string.Join(", ", selectedNumbers.OrderBy(n => n));
}
void QuickPick_Click(object sender, RoutedEventArgs e)
{
Random rand = new Random();
selectedNumbers.Clear();
var buttons = NumberGrid.Children.OfType<Button>().ToList();
foreach (Button btn in buttons)
btn.Background = Brushes.LightGray;
while (selectedNumbers.Count < 6)
{
int n = rand.Next(1, 50);
if (!selectedNumbers.Contains(n))
selectedNumbers.Add(n);
}
foreach (Button btn in buttons)
{
if (selectedNumbers.Contains((int)btn.Tag))
btn.Background = Brushes.Orange;
}
SelectedNumbersText.Text = string.Join(", ", selectedNumbers.OrderBy(n => n));
}
void Clear_Click(object sender, RoutedEventArgs e)
{
selectedNumbers.Clear();
foreach (Button btn in NumberGrid.Children.OfType<Button>())
btn.Background = Brushes.LightGray;
SelectedNumbersText.Text = "";
}
void Submit_Click(object sender, RoutedEventArgs e)
{
if (selectedNumbers.Count != 6)
{
MessageBox.Show("Please select exactly 6 numbers.");
return;
}
MessageBox.Show("Numbers submitted: " + string.Join(", ", selectedNumbers.OrderBy(n => n)));
}
]]>
</x:Code>
</Grid>
</Window> </Window>

View File

@@ -1,24 +1,149 @@
using System.Text; using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Media.Imaging; using LottoProject;
using System.Windows.Navigation; using System.Diagnostics;
using System.Windows.Shapes; using System.Threading.Tasks;
namespace Lotto_Wpf namespace LottoNumberBoard
{ {
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window public partial class MainWindow : Window
{ {
private HashSet<int> selectedNumbers = new();
public MainWindow() public MainWindow()
{ {
InitializeComponent(); InitializeComponent();
GenerateNumberButtons();
}
private void GenerateNumberButtons()
{
for (int i = 1; i <= 49; i++)
{
Button btn = new Button
{
Content = i.ToString(),
Tag = i,
Margin = new Thickness(5)
};
btn.Click += NumberButton_Click;
NumberGrid.Children.Add(btn);
}
}
private void NumberButton_Click(object sender, RoutedEventArgs e)
{
if (sender is Button btn && int.TryParse(btn.Content.ToString(), out int number))
{
if (selectedNumbers.Contains(number))
{
selectedNumbers.Remove(number);
btn.ClearValue(Button.BackgroundProperty);
}
else
{
if (selectedNumbers.Count >= 6)
{
MessageBox.Show("Nur 6 Zahlen erlaubt!", "Hinweis", MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
selectedNumbers.Add(number);
btn.Background = Brushes.LightGreen;
}
UpdateResultDisplay();
}
}
private void UpdateResultDisplay()
{
var sorted = selectedNumbers.OrderBy(n => n);
ResultTextBlock.Text = "Ausgewählt: " + string.Join(", ", sorted);
}
private void DrawButton_Click(object sender, RoutedEventArgs e)
{
if (selectedNumbers.Count != 6)
{
MessageBox.Show("Bitte wähle genau 6 Zahlen!", "Warnung", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
int[] userZahlen = selectedNumbers.ToArray();
Lotto lotto = new Lotto(userZahlen);
string gezogene = string.Join(", ", lotto.GezogeneZahlen.OrderBy(n => n));
string getroffene = string.Join(", ", userZahlen.Intersect(lotto.GezogeneZahlen).OrderBy(n => n));
int anzahlTreffer = lotto.TrefferAnzahl;
ResultTextBlock.Text += $"\nGezogene Zahlen: {gezogene}";
ResultTextBlock.Text += $"\nTreffer: {anzahlTreffer} ({getroffene})\n";
}
private async void SimulationButton_Click(object sender, RoutedEventArgs e)
{
if (selectedNumbers.Count != 6)
{
MessageBox.Show("Bitte wähle genau 6 Zahlen für die Simulation!", "Warnung", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
int[] meineZahlen = selectedNumbers.ToArray();
int[] trefferVerteilung = new int[7];
int meinGeld;
if (!int.TryParse(StartgeldTextBox.Text, out meinGeld))
{
MessageBox.Show("Bitte gültigen Startgeldbetrag eingeben!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
int versuche = 1000;
var stopwatch = new Stopwatch();
stopwatch.Start();
await Task.Run(() =>
{
Random rnd = new();
for (int i = 0; i < versuche; i++)
{
HashSet<int> zufallsZahlen = new();
while (zufallsZahlen.Count < 6)
zufallsZahlen.Add(rnd.Next(1, 50));
Lotto lotto = new Lotto(zufallsZahlen.ToArray());
int treffer = lotto.Treffer(meineZahlen, lotto.GezogeneZahlen);
trefferVerteilung[treffer]++;
meinGeld -= 5;
switch (treffer)
{
case 3: meinGeld += 20; break;
case 4: meinGeld += 400; break;
case 5: meinGeld += 20000; break;
case 6: meinGeld += 100000000; break;
}
}
});
stopwatch.Stop();
StringBuilder sb = new();
sb.AppendLine("\nSimulation abgeschlossen:");
for (int i = 0; i < trefferVerteilung.Length; i++)
{
sb.AppendLine($"{i} Treffer: {trefferVerteilung[i]}x");
}
sb.AppendLine($"\nDauer: {stopwatch.Elapsed.TotalSeconds:F2} Sekunden");
sb.AppendLine($"Kontostand: {meinGeld} €");
ResultTextBlock.Text += "\n" + sb.ToString();
} }
} }
} }

123
ProblemProtokoll.txt Normal file
View File

@@ -0,0 +1,123 @@
Protokoll2.0
1. Das erste Protokoll nicht wieder gefunden sehr wahrscheinlich nicht gespeichert
2. Vs 2022 ist mit Git sehr unübersichtlich musste mit ihnen reden um das zu connacten
3. Eigenes .gitignore von github gemacht es gab kein preset
4. Pushen und sync ist nervig in vs2022 deshalb in vs code geöffnet
5. Wlan ist echt scheiße alles dauert lange (verzögert arbeit) dauert teilweise 10min
6. Duy Ahn Problem (
7. Nach dem sync vom repo aus sicht von Nik (Ungültiges markup)
Man konnte die fehlermeldungen nicht kopieren sondern nur screenshot machen.
8. Es wurden och mal neu geclont dann waren es 6 probleme Duy hatt neu gemacht dann ging es
9. Bei Nik wurde geld doppelt abgezogen es musste eine line gelösht werden weil im switch case -5 im default ist.
10. Probleme von Duy Anh:
Probleme und Lösungen bei der Erstellung einer Lotto-App mit WPF
1. Problem: Wie sieht ein normales Lotto aus?
Lösung: auf internet suchen
________________________________________
2. Problem: Die Benutzeroberfläche (UI) auswählen
Lösung: Eine sehr einfache UI wählen z.B. direkt Zahlen auswählen und spielen, ohne viele Menüs. Das vermeidet viele Fehlerquellen.
________________________________________
3. Problem: Beim Öffnen in Visual Studio 2022 ist alles weiß
Lösung: Einfach das Projekt mit Strg + shift + B (Build) kompilieren. Danach wird alles wieder korrekt angezeigt.
________________________________________
4. Problem: Button reagiert nicht beim Klicken
Lösung: Button so programmieren, dass er die Farbe ändert, wenn er gedrückt wird:
if (selectedNumbers.Contains(number))
{
selectedNumbers.Remove(number);
btn.ClearValue(Button.BackgroundProperty);
}
else
{
selectedNumbers.Add(number);
btn.Background = Brushes.LightGreen;
}
________________________________________
5. Problem: Eine Zahl kann mehrfach ausgewählt werden
Lösung: Prüfen, ob die Zahl schon ausgewählt ist falls ja, wieder abwählen:
if (selectedNumbers.Contains(number))
{
selectedNumbers.Remove(number);
btn.ClearValue(Button.BackgroundProperty);
}
else
{
selectedNumbers.Add(number);
btn.Background = Brushes.LightGreen;
}
________________________________________
6. Problem: Man kann eine Zahl nicht abwählen
Lösung:
if (selectedNumbers.Contains(number))
{
selectedNumbers.Remove(number);
btn.ClearValue(Button.BackgroundProperty);
}
else
{
selectedNumbers.Add(number);
btn.Background = Brushes.LightGreen;
}
11. Probleme von Nik:
1. Problem: Ich musste schon wie der code von WFP auf, denn code von Programm passt.,
Lösung: Ich habe das WPF auf den Code sehr viel angepasst.
2.Problem: Es konnten zu viele Zahlen ausgewellt werden.
if (selectedNumbers.Contains(number))
{
selectedNumbers.Remove(number);
btn.ClearValue(Button.BackgroundProperty);
}
anders
{
if (selectedNumbers.Count >= 6)
{
MessageBox.Show("Nur 6 Zahlen erlaubt!", "Hinweis", MessageBoxButton.OK, MessageBoxImage.Information);
zurückkehren;
}
selectedNumbers.Add(number);
btn.Background = Brushes.LightGreen;
}
3.Problem: Konnte erst nicht pushen.
Lösung: Habe dann Visual Studio Code genommen.
4.Problem: Vergessen, dass man Geld selbst eingeben soll.
Lösung: int meinGeld;
if (!int.TryParse(StartgeldTextBox.Text, out meinGeld))
{
MessageBox.Show("Bitte gültigen Startgeldbetrag eingeben!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
zurückkehren;
}
12. Wenn man zu viel gespielt hatt wurden die Button abgeschnitten und nur die ergebnisse waren zu sehen. Mann konnte nicht weiter spielen.
Lösung: die lösung war das ich alles in xaml in <ScrollViewer VerticalScrollBarVisibility="Auto"> packen muste

Binary file not shown.

61
README.md Normal file
View File

@@ -0,0 +1,61 @@
# WPF Lotto Number Board
Ein einfaches, interaktives Lotto-Programm mit GUI entwickelt mit WPF in C# von **Duy Anh**, **Nik Heise** und **Daniel**.
## Projektbeschreibung
Das Projekt „Lotto Number Board“ ist eine WPF-Anwendung, mit der man:
- 6 Lottozahlen auswählen kann (149)
- eine Ziehung simulieren kann
- eine umfangreiche Simulation mit Startkapital durchführen kann, um die Gewinnchancen und Rendite zu analysieren
## Features
- Auswahl von 6 Zahlen über ein grafisches Button-Grid
- Simulation von 1000 Ziehungen zur Auswertung der Gewinnverteilung
- Startgeld-Verwaltung mit Ausgaben (5€/Spiel) und Gewinnen
- Statistiken über Trefferverteilung und End-Kontostand
- Benutzerfreundliche Oberfläche mit automatischem Scrollbereich
## Technologien
- **WPF (Windows Presentation Foundation)**
- **C#**
- **.NET**
- Multithreading mit `Task.Run`
- UI-Elemente wie `UniformGrid`, `ScrollViewer`, `TextBlock`, `TextBox`, `Button`
## Verwendung
1. Projekt in Visual Studio öffnen.
2. Startgeld in das Textfeld eingeben (z.B. `2000`).
3. 6 Zahlen durch Klick auf Buttons auswählen.
4. Auf **"Ziehen"** klicken für eine einfache Ziehung.
5. Auf **"Simulation starten"** klicken, um 1000 Spiele mit Gewinn-/Verlustauswertung zu simulieren.
## Beispielausgabe
Ausgewählt: 3, 14, 22, 27, 35, 44
Gezogene Zahlen: 5, 14, 18, 22, 27, 33
Treffer: 3 (14, 22, 27)
Simulation abgeschlossen:
0 Treffer: 529x
1 Treffer: 303x
2 Treffer: 121x
3 Treffer: 37x
4 Treffer: 10x
5 Treffer: 0x
6 Treffer: 0x
Dauer: 1.45 Sekunden
Kontostand: 1320 €
## Autoren
- **Daniel**
- **Duy Anh**
- **Nik**
## Lizenz
Dies ist ein Lernprojekt im Rahmen unserer Ausbildung. Nutzung auf eigene Gefahr