C# Skat Farben zählen

  • C#
  • .NET (FX) 4.0

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von kai996.

    C# Skat Farben zählen

    Hallo,
    bin seit längerem mal wieder hier online. Es hat sich designtechnisch ja wirklich sehr viel geändert hier, sieht richtig gut aus. Und das Forum selber ist auch viel besser als ich es aus früheren Zeiten kenne. Großes Lob an die Admins!

    So nun aber zu meinem Problem:
    Momentan programmiere ich Skat und nun bin ich mit dem Reizen dran. Für die KI des Computers habe ich eine Funktion geschrieben, die bestimmen soll, ob ein Reizen sinnvoll ist oder nicht. Dazu zähle ich zunächst alle Farben (und die Buben) und später soll dies ausgewertet werden.
    Bevor ich nun weitermache, habe ich natürlich kontrolliert ob das mit dem Zählen der Farben auch funktioniert und das tut es auch, nur manchmal kommt ein falscher Wert zurück. Hier mein Code:

    C#-Quellcode

    1. for (int i = 0; i < Reizblatt.Count(); i++)
    2. {
    3. if (Reizblatt[i] == 0 || Reizblatt[i] == 1 || Reizblatt[i] == 2 || Reizblatt[i] == 3)
    4. Buben++;
    5. else if (Reizblatt[i] == 4 || Reizblatt[i] == 5 || Reizblatt[i] == 6 || Reizblatt[i] == 7 || Reizblatt[i] == 8 || Reizblatt[i] == 9 || Reizblatt[i] == 10)
    6. Kreuz++;
    7. else if (Reizblatt[i] == 11 || Reizblatt[i] == 12 || Reizblatt[i] == 13 || Reizblatt[i] == 14 || Reizblatt[i] == 15 && Reizblatt[i] == 16 || Reizblatt[i] == 17)
    8. Pik++;
    9. else if (Reizblatt[i] == 18 || Reizblatt[i] == 19 || Reizblatt[i] == 20 || Reizblatt[i] == 21 || Reizblatt[i] == 22 && Reizblatt[i] == 23 || Reizblatt[i] == 24)
    10. Herz++;
    11. else if (Reizblatt[i] == 25 || Reizblatt[i] == 26 || Reizblatt[i] == 27 || Reizblatt[i] == 28 || Reizblatt[i] == 29 && Reizblatt[i] == 30 || Reizblatt[i] == 31)
    12. Karo++;
    13. }

    Reizblatt ist ein Array aus Integern und die Variablen, die die Farben zählen sollen (Buben, Kreuz, Pik, Herz und Karo) sind auch vom Typ Integer.
    Im Code stelle ich die Karten mit Zahlen da:

    Buben: 0-3
    Kreuz: 4-10
    Pik: 11-17
    Herz: 18-24
    Karo: 25-31

    Wie gesagt, das Zählen funktioniert in den meisten Fällen, nur manchmal kommt trotzdem ein falscher Wert am Ende heraus.

    Ich hoffe ihr könnt mir bei meinem Problem helfen.
    Gruß
    kai996
    So ich hab es jetzt mit case versucht das hat funktioniert warum auch immer es mit if nicht ging:
    Hier der Code:

    C#-Quellcode

    1. for (int i = 0; i < Reizblatt.Count(); i++)
    2. {
    3. switch(Reizblatt[i])
    4. {
    5. case 0: case 1: case 2: case 3:
    6. Buben++;
    7. break;
    8. case 4: case 5: case 6: case 7: case 8: case 9: case 10:
    9. Kreuz++;
    10. break;
    11. case 11: case 12: case 13: case 14: case 15: case 16: case 17:
    12. Pik++;
    13. break;
    14. case 18: case 19: case 20: case 21: case 22: case 23: case 24:
    15. Herz++;
    16. break;
    17. case 25: case 26: case 27: case 28: case 29: case 30: case 31:
    18. Karo++;
    19. break;
    20. }
    21. }
    @kai996 Vielleicht ist Deine Herangehensweise falsch.
    Ich persönlich würde die Farben sowie die Werte in je ein Enum packen, beide enums in eine separate Klasse. Diese Klasse bekommt dann einige Methoden wie z.B.
    Sortierung nach Grand, Null, Farbe, dazu die Bestimmung des jeweils höchsten Reizwertes, den Du mit den Enums natürlich wesentlich besser überblicken kannst.
    Dies wäre zunächst die reine Spielmechanik, das Reizen seibst wäre dann eher eine KI.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Außerdem solltest du die Buben einzeln zuordnen, damit du "ohne" und "mit" reizen kannst.
    Null-Spiele vernachlässigst du komplett?

    Solche Feinheiten wie "ohne 5" kannst du in der Praxis wahrscheinlich vernachlässigen, aber wenn du die Skatregeln vollständig nachbilden willst, solltest du ein anderes Datenmodell wählen.

    Spielst du Skat?
    Vielleicht die Regeln nochmals vertiefen:
    de.wikipedia.org/wiki/Skat
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    petaod schrieb:

    Außerdem solltest du die Buben einzeln zuordnen, damit du "ohne" und "mit" reizen kannst.
    Null-Spiele vernachlässigst du komplett?

    Das was ich oben geschrieben hab is nur dafür da (bzw soll eine Hilfe sein) zu entscheiden ob der PC reizen soll oder nicht und dazu isses natürlich nützlich zu wissen wie viele Karten der PC von jeder Farbe hat und wie viele Asse, Zehn usw. :D (Asse, Zehn usw. auslesen hab ich noch hinzugefügt bei mir im Programm soweit war ich am Sonntag noch nicht), das "richtige" Reizen steht in einer anderen Methode, ich hab mich wohl etwas undeutlich ausgedrückt (das "Analysieren" des Blattes hab ich mittlerweile so halbfertig hatte in den letzten Tagen leider nicht viel Zeit dran weiterzumachen)

    und ja ich spiele Skat sogar fast täglich

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „kai996“ ()