C# Kniffel kleine Straße?

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.

Woher ich das weiß:Berufserfahrung – 💻 Zertifizierter Sr. Cloud Engineer im IT-Consulting
xMilza 
Fragesteller
 22.10.2021, 11:38

Hab ich auch schon versucht, bin jedoch auf kein Ergebnis gekommen..

0
Dultus, UserMod Light   22.10.2021, 12:01
@xMilza

Naja, das beantwortet die Frage nicht. :p

Hast du mal im Debugger nachgeschaut, welche Werte du da hast? Diese kannst du ja dann abprüfen und gucken, warum dort kein True ausgegeben wird.

0
Von Experte Dultus, UserMod Light bestätigt

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...