- @foreach(var guess in PreviousGuesses)
+ @foreach (CharData[] guess in PreviousGuesses)
{
- @for(int i = 0; i < ColumnCount; i++)
+ @foreach (CharData cd in guess)
{
- char guessedChar = char.ToUpper(guess[i]);
-
- if(guessedChar == char.ToUpper(Secret[i]))
+ if (cd.State == CharState.Correct)
{
- @guessedChar
+ @cd.Char
}
- else if (Secret.Contains(guessedChar, StringComparison.InvariantCultureIgnoreCase))
+ else if (cd.State == CharState.Misplaced)
{
- @guessedChar
+ @cd.Char
}
else
{
- @guessedChar
+ @cd.Char
}
}
@@ -48,15 +48,17 @@
+
@Input
+
- Hi
+
- OK
@@ -64,37 +66,93 @@
@code {
- public string Input { get; set; } = string.Empty;
+
+ public enum CharState
+ {
+ None,
+ Correct,
+ Misplaced,
+ Wrong
+ }
+
+ public struct CharData
+ {
+ public char Char;
+ public CharState State;
+
+ public CharData(char c, CharState state)
+ {
+ Char = c;
+ State = state;
+ }
+ }
+
+ private string _input = string.Empty;
+
+ [Parameter]
+ public string Input
+ {
+ get => _input;
+ set => _input = value;
+ }
+
+ public async Task SetText(string text)
+ {
+ textField.SetText(text);
+ }
public bool hideAlert = true;
public MudTextField
textField;
- public List PreviousGuesses = new();
- public List SecretList = new();
+ public List PreviousGuesses = new();
- //Keine Ahnung wie das funktionert... Danke StackOverflow :)
- ///
- /// Eine Regexmaske die alle Strings matched die 0 bis 5 Buchstaben enthalten.
- ///
- //private IMask _inputMask = new RegexMask(@"^[A-Za-z]{0,5}$");
-
private bool found = false;
+ private int _columnCount;
+ private string? _secret = null;
+ private IMask _inputMask = new RegexMask(@"^[A-Za-z]{0,5}$");
+ private Func? _checkInput;
+ private Func? _generateSecret;
[Parameter]
- public int ColumnCount { get; set; }
+ public int ColumnCount
+ {
+ get => _columnCount;
+ set => _columnCount = value;
+ }
[Parameter]
- public string? Secret { get; set; } = null;
-
- [Parameter]
- public IMask InputMask { get; set; } = new RegexMask(@"^[A-Za-z]{0,5}$");
+ public string? Secret
+ {
+ get => _secret;
+ set => _secret = value;
+ }
[Parameter]
- public Func? CheckInput { get; set; }
+ public IMask InputMask
+ {
+ get => _inputMask;
+ set => _inputMask = value;
+ }
[Parameter]
- public Func? GenerateSecret { get; set; }
+ public Func? CheckInput
+ {
+ get => _checkInput;
+ set => _checkInput = value;
+ }
+
+ [Parameter]
+ public Func? GenerateSecret
+ {
+ get => _generateSecret;
+ set => _generateSecret = value;
+ }
+
+ ///
+ /// Wird ausgelöst wenn eine Eingabe getätigt und validiert wurde.
+ ///
+ public event EventHandler? InputValidated;
public void Check4Enter(KeyboardEventArgs e)
{
@@ -121,17 +179,53 @@
if (Secret == null && GenerateSecret != null)
Secret = GenerateSecret();
- PreviousGuesses.Add(Input);
- if(Secret!.Equals(Input, StringComparison.InvariantCultureIgnoreCase))
+ if(TestInput(Input))
{
found = true;
- textField.Clear();
hideAlert = false;
}
- else
+
+ textField.Clear();
+ }
+
+ ///
+ /// Prüft ob die Eingabe korrekt ist.
+ ///
+ private bool TestInput(string input)
+ {
+ CharData[] validatedInput = new CharData[ColumnCount];
+
+ bool correct = true;
+
+ for (int i = 0; i < ColumnCount; i++)
{
- textField.Clear();
+ char guessedChar = char.ToUpper(input[i]);
+
+ CharState state;
+
+ if (guessedChar == char.ToUpper(Secret![i]))
+ {
+ state = CharState.Correct;
+ }
+ else if (Secret.Contains(guessedChar, StringComparison.InvariantCultureIgnoreCase))
+ {
+ state = CharState.Misplaced;
+ correct = false;
+ }
+ else
+ {
+ state = CharState.Wrong;
+ correct = false;
+ }
+
+ validatedInput[i] = new CharData(guessedChar, state);
}
+
+ PreviousGuesses.Add(validatedInput);
+
+ InputValidated?.Invoke(this, validatedInput);
+
+ return correct;
}
public void PlayAgain()
diff --git a/GottfriedsNackenWebseite/GottfriedsNackenWebseite/Components/WordleKeyboardComponent.razor b/GottfriedsNackenWebseite/GottfriedsNackenWebseite/Components/WordleKeyboardComponent.razor
new file mode 100644
index 0000000..aa00042
--- /dev/null
+++ b/GottfriedsNackenWebseite/GottfriedsNackenWebseite/Components/WordleKeyboardComponent.razor
@@ -0,0 +1,72 @@
+
+
+
+
+ @{
+ int index = 0;
+
+ for (int row = 0; row < Math.Ceiling((double)Keys.Length / KeysPerRow); row++)
+ {
+
+ @for (int i = 0; i < KeysPerRow && index < Keys.Length; i++, index++)
+ {
+ char key = Keys[index];
+
+ char upperKey = char.ToUpper(key);
+
+ if (_correctKeys.Contains(upperKey))
+ {
+ ButtonPressed(key)">
+ @upperKey
+
+ }
+ else if (_misplacedKeys.Contains(upperKey))
+ {
+ ButtonPressed(key)">
+ @upperKey
+
+ }
+ else if (_wrongKeys.Contains(upperKey))
+ {
+ ButtonPressed(key)">
+ @upperKey
+
+ }
+ else
+ {
+ ButtonPressed(key)">
+ @upperKey
+
+ }
+ }
+
+ }
+ }
+
+
+
+@code {
+
+ [Parameter]
+ public char[] Keys { get; set; } = Array.Empty();
+
+ private List _correctKeys = new();
+
+ private List _misplacedKeys = new();
+
+ private List _wrongKeys = new();
+
+ [Parameter]
+ public int KeysPerRow { get; set; } = 10;
+
+ [Parameter]
+ public string Secret { get; set; } = string.Empty;
+
+ [Parameter]
+ public EventCallback KeyPressed { get; set; }
+
+ private async Task ButtonPressed(char c)
+ {
+ await KeyPressed.InvokeAsync(c);
+ }
+}
\ No newline at end of file
diff --git a/GottfriedsNackenWebseite/GottfriedsNackenWebseite/Pages/Numberle.razor b/GottfriedsNackenWebseite/GottfriedsNackenWebseite/Pages/Numberle.razor
index ee6cbde..e4dd3bf 100644
--- a/GottfriedsNackenWebseite/GottfriedsNackenWebseite/Pages/Numberle.razor
+++ b/GottfriedsNackenWebseite/GottfriedsNackenWebseite/Pages/Numberle.razor
@@ -7,7 +7,9 @@
Nacken Numberle
Gebe eine (korrekte) mathematische Gleichung ein:
-
+
+
+
@code
{
@@ -15,6 +17,8 @@
private Parser _parser = new();
+ private WordleComponent _wordle;
+
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
@@ -127,4 +131,9 @@
}
}
}
+
+ private async Task KeyboardKeyPressed(char key)
+ {
+ await _wordle.SetText(_wordle.Input + key); //Input += key;
+ }
}