C# Kniffel kleine Straße?
Irgendwas fehlt bei der kleinen Straße (Kniffel). Ich komme nur nicht darauf..
bool IstKleineStrasse(int[] wuerfelAugen) {
int[] anzahlAugenzahlen = new int[6];
string zahlenfolge = "";
for (int i = 1; i <= 6; i++) {
foreach (int anzahlAugenzahl in wuerfelAugen) {
if (anzahlAugenzahl == i) {
// Augenzahl existiert
{
if (zahlenfolge.IndexOf(i.ToString()) == -1) {
zahlenfolge += i.ToString();
}
}
}
}
}
return ((zahlenfolge == "1234") || (zahlenfolge == "2345") || (zahlenfolge == "3456"));
}
3 Antworten
Wäre es nicht einfacher, du gehst von den 3 Möglichkeiten 1234, 2345 und 3456 aus und guckst, ob die in deinen gewürfelten Zahlen vorkommen?
Ich weiß allerdings nicht, ob es in C# für Arrays einen in-Operator gibt, vielleicht heißt es auch contains.
Dann kannst du sowas formulieren wie:
return (3 in ar and 4 in ar) and
and (1 in ar and 2 in ar
or 2 in ar and 5 in ar
or 5 in ar and 6 in ar)
Oder du machst dir einen BitString, dann wird's allerdings evtl. unleserlich:
bool IstKleineStrasse(int[] wuerfelAugen) {
// int[] muster = { 0b0011110, 0b0111100, 0b01111000 };
int[] muster = { 15<<1, 15<<2, 15<<3 };
int bitString = 0;
foreach (int w in wuerfelAugen)
bitString |= (1<<w);
foreach (int m in muster)
if ((bitString & m) == m) return true;
return false;
}
Moin,
du gehst doch von 5 Würfeln aus, korrekt? Dann kann das Ergebnis nie "zahlenfolge == "1234"" oder ähnlich sein - die Würfel sind 5 - also müsstest du eher "Contains" verwenden.
Welch Schleifenmonstrum . 😅
Du hast eine Denkfehler. Du musst Dich in der Methode/Funktion nicht um einzelne Elemente des Arrays kümmern.
Das Array-Object verfügt über die Nötigen Eigenschaften und Methoden um alle nötige zu erledigen, ohne auch nur eine Schleife zu benutzen .
Dein Funktion ist unflexibel. Eigentlich muss ihr doch nur übergeben werden, was eine kleine Straße , oder ein Pasch usw. ist .
Dabei ist die Lösung ganz einfach.
- wir übergeben das Array gewürfelter Werte und das Muster für einer Straße an die Funktion
- als erstes werden die im Array gespeicherten Werte sortiert (optional)
- das Array wird zu einem String gejoined (ohne Delimiter)
- vergleichen unseren String mit dem Muster und übergeben das Ergebnis
public static bool IstWurfEin(int[] Wurf,string Muster) {
Array.Sort(Wurf); //sortiere die Würfel
string WurfString = string.Join("",Wurf); //wandle das Array in einen String
Match m = Regex.Match(WurfString,Muster); //vergleiche String mit dem Muster
return (m.Success) ;
}
Die Funktion muss sich nicht darum Kümmern, wie viele Würfel im Spiel (ginge auch mit 2, wie bei Mäx). Sie muss nur feststellen ob eine Muster im Wurf enthalten ist.
Das ganze in Aktion:
using System;
using System.Text.RegularExpressions;
class Prog{
public static bool IstWurfEin(int[] Wurf,string Muster) {
Array.Sort(Wurf); //sortiere die Würfel
string WurfString = string.Join("",Wurf); //wandle das Array in einen String
Match m = Regex.Match(WurfString,Muster); //vergleiche String mit dem Muster
return (m.Success) ;
}
public static void Main(string[] args){
int[] Wuerfel = new int[6];
//definiere:
string KleineStrasse = "1234|2345"; //ein RegExPattern mehrere Variationen werden durch | getrennt
string Viererpasch = "1111|2222|3333|4444|5555"; //es gibt dafür einen kürzeren Pattern aber so its lesbarer
//usw.
var rand = new Random();
for (int i = 0; i < Wuerfel.Length; i++){ //
Wuerfel[i] = rand.Next(1, 7);
}
//zum Testen ohne Zufall
//Wuerfel = new int[] { 3,3,3,3,5 };
//Wuerfel = new int[] { 2,3,4,6,5};
Console.WriteLine("unsortiert : {0}",string.Join(" ",Wuerfel));
Console.WriteLine("Haben wir eine kleine Straße? {0}",IstWurfEin(Wuerfel,KleineStrasse));
Console.WriteLine("Haben wir ein Viererpasch ? {0}",IstWurfEin(Wuerfel,Viererpasch));
Console.ReadKey();
}
}
Ein wenig muss auch noch für Dich übrig bleiben...
Hab ich auch schon versucht, bin jedoch auf kein Ergebnis gekommen..